Skip to content

Commit

Permalink
Renamed "invoice set" to "invoice profile" due to confusion with djan…
Browse files Browse the repository at this point in the history
…go built in "_set" properties

Signed-off-by: Trey <[email protected]>
  • Loading branch information
TreyWW committed Aug 22, 2024
1 parent bf8852a commit 071adf0
Show file tree
Hide file tree
Showing 28 changed files with 298 additions and 296 deletions.
14 changes: 7 additions & 7 deletions backend/api/invoices/recurring/delete.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,21 @@ def delete_invoice_recurring_profile_endpoint(request: WebRequest):
redirect = delete_items.get("redirect", None)

try:
invoice_set = InvoiceRecurringProfile.objects.get(id=delete_items.get("invoice_set", ""))
invoice_profile = InvoiceRecurringProfile.objects.get(id=delete_items.get("invoice_profile", ""))
except InvoiceRecurringProfile.DoesNotExist:
messages.error(request, "Invoice Set Not Found")
messages.error(request, "Invoice recurring profile Not Found")
return render(request, "base/toasts.html")

if not invoice_set.has_access(request.user):
messages.error(request, "You do not have permission to delete this invoice set")
if not invoice_profile.has_access(request.user):
messages.error(request, "You do not have permission to delete this Invoice recurring profile")
return render(request, "base/toasts.html")

# QuotaLimit.delete_quota_usage("invoices-count", request.user, invoice.id, invoice.date_created)

Task().queue_task(delete_boto_schedule, "InvoiceRecurringSet", invoice_set.id)
Task().queue_task(delete_boto_schedule, "InvoiceRecurringSet", invoice_profile.id)

invoice_set.active = False
invoice_set.save()
invoice_profile.active = False
invoice_profile.save()

if request.htmx:
if not redirect:
Expand Down
18 changes: 9 additions & 9 deletions backend/api/invoices/recurring/edit.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,24 @@

from backend.decorators import web_require_scopes
from backend.models import InvoiceRecurringProfile
from backend.service.invoices.recurring.get import get_invoice_set
from backend.service.invoices.recurring.get import get_invoice_profile
from backend.service.invoices.recurring.validate.frequencies import validate_and_update_frequency
from backend.types.requests import WebRequest


@require_http_methods(["POST"])
@web_require_scopes("invoices:write", True, True)
def edit_invoice_recurring_profile_endpoint(request: WebRequest, invoice_set_id):
invoice_set_response = get_invoice_set(request, invoice_set_id)
def edit_invoice_recurring_profile_endpoint(request: WebRequest, invoice_profile_id):
invoice_profile_response = get_invoice_profile(request, invoice_profile_id)

if invoice_set_response.failed:
messages.error(request, invoice_set_response.error)
if invoice_profile_response.failed:
messages.error(request, invoice_profile_response.error)
return render(request, "base/toasts.html", {"autohide": False})

invoice_set: InvoiceRecurringProfile = invoice_set_response.response
invoice_profile: InvoiceRecurringProfile = invoice_profile_response.response

frequency_update_response = validate_and_update_frequency(
invoice_set=invoice_set,
invoice_profile=invoice_profile,
frequency=request.POST.get("frequency", ""),
frequency_day_of_week=request.POST.get("frequency_day_of_week", ""),
frequency_day_of_month=request.POST.get("frequency_day_of_month", ""),
Expand Down Expand Up @@ -67,9 +67,9 @@ def edit_invoice_recurring_profile_endpoint(request: WebRequest, invoice_set_id)
except ValueError:
messages.error(request, "Invalid date format for date_due")
return render(request, "base/toasts.html")
setattr(invoice_set, column_name, new_value)
setattr(invoice_profile, column_name, new_value)

invoice_set.save()
invoice_profile.save()

if request.htmx:
messages.success(request, "Invoice edited")
Expand Down
12 changes: 6 additions & 6 deletions backend/api/invoices/recurring/generate_next_invoice_now.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@
@require_POST
@htmx_only("invoices:recurring:dashboard")
@web_require_scopes("invoices:write", True, True)
def generate_next_invoice_now_endpoint(request: WebRequest, invoice_set_id):
def generate_next_invoice_now_endpoint(request: WebRequest, invoice_profile_id):
context: dict = {}
invoice_recurring_profile: InvoiceRecurringProfile | None = InvoiceRecurringProfile.objects.filter(
pk=invoice_set_id, active=True
pk=invoice_profile_id, active=True
).first()

if not invoice_recurring_profile:
messages.error(request, "Failed to fetch next invoice; cannot find invoice set.")
messages.error(request, "Failed to fetch next invoice; cannot find Invoice recurring profile.")
return render(request, "base/toast.html")

if invoice_recurring_profile.client_to:
Expand All @@ -32,7 +32,7 @@ def generate_next_invoice_now_endpoint(request: WebRequest, invoice_set_id):
account_defaults = get_account_defaults(invoice_recurring_profile.owner)

if not invoice_recurring_profile.has_access(request.user):
messages.error(request, "You do not have permission to modify this invoice set.")
messages.error(request, "You do not have permission to modify this invoice recurring profile.")
return render(request, "base/toast.html")

next_invoice_issue_date = invoice_recurring_profile.next_invoice_issue_date()
Expand All @@ -48,9 +48,9 @@ def generate_next_invoice_now_endpoint(request: WebRequest, invoice_set_id):
)

return render(
request, "pages/invoices/recurring/manage/next_invoice_block.html", {"invoiceSet": invoice_recurring_profile} | context
request, "pages/invoices/recurring/manage/next_invoice_block.html", {"invoiceProfile": invoice_recurring_profile} | context
)
else:
logger.info(svc_resp.error)
messages.error(request, "Failed to fetch next invoice; cannot find invoice set.")
messages.error(request, "Failed to fetch next invoice; cannot find invoice recurring profile.")
return render(request, "base/toast.html")
6 changes: 3 additions & 3 deletions backend/api/invoices/recurring/poll.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def return_create_schedule(recurring_schedule):
@require_http_methods(["GET"])
@htmx_only("invoices:recurring:dashboard")
@web_require_scopes("invoices:read", False, False, "dashboard")
def poll_recurring_schedule_update_endpoint(request: WebRequest, invoice_set_id):
def poll_recurring_schedule_update_endpoint(request: WebRequest, invoice_profile_id):
try:
decoded_timestamp = datetime.fromtimestamp(int(request.GET.get("t", "")))
except ValueError:
Expand All @@ -35,7 +35,7 @@ def poll_recurring_schedule_update_endpoint(request: WebRequest, invoice_set_id)
return HttpResponse("cancel poll | too long wait", status=286)

try:
recurring_schedule: InvoiceRecurringProfile = InvoiceRecurringProfile.objects.get(id=invoice_set_id, active=True)
recurring_schedule: InvoiceRecurringProfile = InvoiceRecurringProfile.objects.get(id=invoice_profile_id, active=True)
if not recurring_schedule.has_access(request.user):
raise InvoiceRecurringProfile.DoesNotExist()
except InvoiceRecurringProfile.DoesNotExist:
Expand All @@ -52,7 +52,7 @@ def poll_recurring_schedule_update_endpoint(request: WebRequest, invoice_set_id)
return render(
request,
"pages/invoices/recurring/dashboard/poll_response.html",
{"status": recurring_schedule.status, "invoice_set_id": invoice_set_id, "invoiceSet": recurring_schedule},
{"status": recurring_schedule.status, "invoice_profile_id": invoice_profile_id, "invoiceProfile": recurring_schedule},
status=286,
)

Expand Down
38 changes: 19 additions & 19 deletions backend/api/invoices/recurring/update_status.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

@require_POST
@web_require_scopes("invoices:write", True, True)
def recurring_profile_change_status_endpoint(request: WebRequest, invoice_set_id: int, status: str) -> HttpResponse:
def recurring_profile_change_status_endpoint(request: WebRequest, invoice_profile_id: int, status: str) -> HttpResponse:
status = status.lower() if status else ""

if not request.htmx:
Expand All @@ -27,44 +27,44 @@ def recurring_profile_change_status_endpoint(request: WebRequest, invoice_set_id
return return_message(request, "Invalid status. Please choose from: paused, ongoing, refresh")

try:
invoice_set: InvoiceRecurringProfile = InvoiceRecurringProfile.objects.get(pk=invoice_set_id, active=True)
invoice_profile: InvoiceRecurringProfile = InvoiceRecurringProfile.objects.get(pk=invoice_profile_id, active=True)
except InvoiceRecurringProfile.DoesNotExist:
return return_message(request, "Recurring Invoice Set not found")
return return_message(request, "Recurring invoice recurring profile not found")

if not invoice_set.has_access(request.user):
if not invoice_profile.has_access(request.user):
return return_message(request, "You don't have permission to make changes to this invoice.")

if status == "pause" and invoice_set.status != "ongoing":
if status == "pause" and invoice_profile.status != "ongoing":
return return_message(request, "Can only pause an ongoing invoice schedule")
elif status == "unpause" and invoice_set.status != "paused":
elif status == "unpause" and invoice_profile.status != "paused":
return return_message(request, "Can only unpause a paused invoice schedule")

if status == "refresh":
print("using refresh")
if invoice_set.boto_schedule_uuid:
boto_get_response = get_boto_schedule(str(invoice_set.boto_schedule_uuid))
if invoice_profile.boto_schedule_uuid:
boto_get_response = get_boto_schedule(str(invoice_profile.boto_schedule_uuid))

if boto_get_response.failed:
print("TASK 1 - no schedule found, let's create one")
Task().queue_task(create_boto_schedule, invoice_set.pk)
return render(request, "pages/invoices/recurring/dashboard/poll_update.html", {"invoice_set_id": invoice_set_id})
Task().queue_task(create_boto_schedule, invoice_profile.pk)
return render(request, "pages/invoices/recurring/dashboard/poll_update.html", {"invoice_profile_id": invoice_profile_id})

invoice_set.status = "ongoing" if boto_get_response.response["State"] == "ENABLED" else "paused"
invoice_set.save(update_fields=["status"])
invoice_profile.status = "ongoing" if boto_get_response.response["State"] == "ENABLED" else "paused"
invoice_profile.save(update_fields=["status"])
else:
Task().queue_task(create_boto_schedule, invoice_set.pk)
return render(request, "pages/invoices/recurring/dashboard/poll_update.html", {"invoice_set_id": invoice_set_id})
Task().queue_task(create_boto_schedule, invoice_profile.pk)
return render(request, "pages/invoices/recurring/dashboard/poll_update.html", {"invoice_profile_id": invoice_profile_id})
send_message(request, f"Invoice status has been refreshed!", success=True)
else:
if status == "pause":
Task().queue_task(pause_boto_schedule, str(invoice_set.boto_schedule_uuid), pause=True)
Task().queue_task(pause_boto_schedule, str(invoice_profile.boto_schedule_uuid), pause=True)
elif status == "unpause":
Task().queue_task(pause_boto_schedule, str(invoice_set.boto_schedule_uuid), pause=False)
Task().queue_task(pause_boto_schedule, str(invoice_profile.boto_schedule_uuid), pause=False)

new_status = "ongoing" if status == "unpause" else "paused"

invoice_set.status = new_status
invoice_set.save(update_fields=["status"])
invoice_profile.status = new_status
invoice_profile.save(update_fields=["status"])

send_message(request, f"Invoice status been changed to <strong>{new_status}</strong>", success=True)

Expand All @@ -75,7 +75,7 @@ def recurring_profile_change_status_endpoint(request: WebRequest, invoice_set_id
return render(
request,
"pages/invoices/recurring/dashboard/_modify_status.html",
{"status": status, "invoice_set_id": invoice_set_id, "poll_end_timestamp": poll_end_timestamp_unix},
{"status": status, "invoice_profile_id": invoice_profile_id, "poll_end_timestamp": poll_end_timestamp_unix},
)


Expand Down
22 changes: 11 additions & 11 deletions backend/api/invoices/reminders/urls.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from django.urls import path

from . import delete, fetch, create

urlpatterns = [
# path("reminders/create/", create.create_reminder_view, name="create"),
# path("reminders/<str:invoice_id>/fetch/", fetch.fetch_reminders, name="fetch"),
# path("reminder/<str:reminder_id>/cancel/", delete.cancel_reminder_view, name="cancel"),
]

app_name = "reminders"
# from django.urls import path
#
# from . import delete, fetch, create
#
# urlpatterns = [
# # path("reminders/create/", create.create_reminder_view, name="create"),
# # path("reminders/<str:invoice_id>/fetch/", fetch.fetch_reminders, name="fetch"),
# # path("reminder/<str:reminder_id>/cancel/", delete.cancel_reminder_view, name="cancel"),
# ]
#
# app_name = "reminders"
8 changes: 4 additions & 4 deletions backend/api/invoices/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@

RECURRING_INVOICE_URLS = [
path("fetch/", fetch_all_recurring_invoices_endpoint, name="fetch"),
path("edit/<int:invoice_set_id>/set_status/<str:status>/", recurring_profile_change_status_endpoint, name="edit status"),
path("poll/<str:invoice_set_id>/update_schedule/", poll_recurring_schedule_update_endpoint, name="poll_update_schedule"),
path("<str:invoice_set_id>/generate_next_invoice/", generate_next_invoice_now_endpoint, name="generate next invoice"),
path("<str:invoice_set_id>/edit/", edit_invoice_recurring_profile_endpoint, name="edit"),
path("edit/<int:invoice_profile_id>/set_status/<str:status>/", recurring_profile_change_status_endpoint, name="edit status"),
path("poll/<str:invoice_profile_id>/update_schedule/", poll_recurring_schedule_update_endpoint, name="poll_update_schedule"),
path("<str:invoice_profile_id>/generate_next_invoice/", generate_next_invoice_now_endpoint, name="generate next invoice"),
path("<str:invoice_profile_id>/edit/", edit_invoice_recurring_profile_endpoint, name="edit"),
path("delete/", delete_invoice_recurring_profile_endpoint, name="delete"),
]

Expand Down
2 changes: 1 addition & 1 deletion backend/service/boto3/scheduler/create_schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def create_boto_schedule(instance_id: int | str | InvoiceRecurringProfile):
"Target": {
"Arn": BOTO3_HANDLER.scheduler_lambda_arn,
"RoleArn": BOTO3_HANDLER.scheduler_lambda_access_role_arn,
"Input": json.dumps({"invoice_set_id": instance.id, "endpoint_url": f"{SITE_URL}"}),
"Input": json.dumps({"invoice_profile_id": instance.id, "endpoint_url": f"{SITE_URL}"}),
"RetryPolicy": {"MaximumRetryAttempts": 20, "MaximumEventAgeInSeconds": 21600}, # 6 hours
},
"ActionAfterCompletion": "NONE",
Expand Down
2 changes: 1 addition & 1 deletion backend/service/boto3/scheduler/update_schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def update_boto_schedule(instance_id: int | str):
# "Target": {
# "Arn": BOTO3_HANDLER.scheduler_lambda_arn,
# "RoleArn": BOTO3_HANDLER.scheduler_lambda_access_role_arn,
# "Input": json.dumps({"invoice_set_id": instance.id, "endpoint_url": f"{SITE_URL}"}),
# "Input": json.dumps({"invoice_profile_id": instance.id, "endpoint_url": f"{SITE_URL}"}),
# "RetryPolicy": {"MaximumRetryAttempts": 20, "MaximumEventAgeInSeconds": 21600}, # 6 hours
# },
# "ActionAfterCompletion": "NONE",
Expand Down
16 changes: 8 additions & 8 deletions backend/service/invoices/recurring/create/save.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@ def save_invoice(request: WebRequest, invoice_items) -> SaveInvoiceServiceRespon
finally:
end_date_obj: date | None = datetime.strptime(end_date_str, "%Y-%m-%d").date() if end_date_str else None

invoice_set = InvoiceRecurringProfile(
invoice_profile = InvoiceRecurringProfile(
end_date=end_date_obj,
date_issued=request.POST.get("date_issued"),
currency=currency,
)

save_invoice_common(request, invoice_items, invoice_set)
save_invoice_common(request, invoice_items, invoice_profile)

frequency = request.POST.get("frequency", "")
frequency_day_of_week = request.POST.get("frequency_day_of_week", "")
Expand All @@ -44,7 +44,7 @@ def save_invoice(request: WebRequest, invoice_items) -> SaveInvoiceServiceRespon
# Yearly = day_of_month + month_of_year

frequency_validate_response = validate_and_update_frequency(
invoice_set=invoice_set,
invoice_profile=invoice_profile,
frequency=frequency,
frequency_day_of_week=frequency_day_of_week,
frequency_day_of_month=frequency_day_of_month,
Expand All @@ -55,7 +55,7 @@ def save_invoice(request: WebRequest, invoice_items) -> SaveInvoiceServiceRespon
messages.error(request, frequency_validate_response.error_message)

try:
invoice_set.full_clean()
invoice_profile.full_clean()

if frequency_validate_response.failed:
raise ValidationError(frequency_validate_response.error)
Expand All @@ -65,9 +65,9 @@ def save_invoice(request: WebRequest, invoice_items) -> SaveInvoiceServiceRespon
messages.error(request, f"{field}: {e.messages[0]}")
return SaveInvoiceServiceResponse(error_message="There's at least one invalid input; please check the above error messages")

invoice_set.save()
invoice_set.items.set(invoice_items)
invoice_profile.save()
invoice_profile.items.set(invoice_items)

QuotaUsage.create_str(request.user, "invoices-count", invoice_set.id)
QuotaUsage.create_str(request.user, "invoices-count", invoice_profile.id)

return SaveInvoiceServiceResponse(True, invoice_set)
return SaveInvoiceServiceResponse(True, invoice_profile)
4 changes: 2 additions & 2 deletions backend/service/invoices/recurring/generation/next_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def generate_next_invoice_service(
) -> GenerateNextInvoiceServiceResponse:

if not invoice_recurring_profile:
return GenerateNextInvoiceServiceResponse(error_message="Invoice recurring set not found")
return GenerateNextInvoiceServiceResponse(error_message="Invoice recurring profile not found")

generated_invoice = Invoice(
invoice_recurring_profile=invoice_recurring_profile,
Expand Down Expand Up @@ -74,7 +74,7 @@ def generate_next_invoice_service(
logger.info(f"Invoice generated with the ID of {generated_invoice.pk}")

AuditLog.objects.create(
action=f"[SYSTEM] Generated invoice #{generated_invoice.pk} from Recurring Set #{invoice_recurring_profile.pk}",
action=f"[SYSTEM] Generated invoice #{generated_invoice.pk} from the recurring profile #{invoice_recurring_profile.pk}",
user=invoice_recurring_profile.user,
organization=invoice_recurring_profile.organization,
)
Expand Down
12 changes: 6 additions & 6 deletions backend/service/invoices/recurring/get.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@
class GetRecurringSetServiceResponse(BaseServiceResponse[InvoiceRecurringProfile]): ...


def get_invoice_set(request: WebRequest, invoice_set_id: int | str, check_permissions: bool = True):
def get_invoice_profile(request: WebRequest, invoice_profile_id: int | str, check_permissions: bool = True):
try:
invoice_set = InvoiceRecurringProfile.objects.get(id=invoice_set_id, active=True)
invoice_profile = InvoiceRecurringProfile.objects.get(id=invoice_profile_id, active=True)
except InvoiceRecurringProfile.DoesNotExist:
return GetRecurringSetServiceResponse(error_message="Invoice Set not found", status_code=404)
return GetRecurringSetServiceResponse(error_message="invoice recurring profile not found", status_code=404)

if check_permissions:
if not invoice_set.has_access(request.user):
if not invoice_profile.has_access(request.user):
return GetRecurringSetServiceResponse(
error_message="You do not have permission to view this invoice set",
error_message="You do not have permission to view this invoice recurring profile",
status_code=403,
)

return GetRecurringSetServiceResponse(True, invoice_set)
return GetRecurringSetServiceResponse(True, invoice_profile)
Loading

0 comments on commit 071adf0

Please sign in to comment.