Skip to content

Commit

Permalink
feature: Added invoice overview page (#222)
Browse files Browse the repository at this point in the history
* nf-feat: Started working on tabs

* nf-feat: Started working on tabs

* Added more control options for invoice overview

* Ran formatters

* Added option in dropdown
  • Loading branch information
TreyWW authored Mar 16, 2024
1 parent 0a9a1bf commit c1b57ec
Show file tree
Hide file tree
Showing 17 changed files with 983 additions and 456 deletions.
19 changes: 16 additions & 3 deletions backend/api/invoices/delete.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from django.contrib import messages
from django.http import HttpRequest, JsonResponse, QueryDict
from django.http import HttpRequest, JsonResponse, QueryDict, HttpResponse
from django.shortcuts import render
from django.urls import resolve
from django.urls.exceptions import Resolver404
from django.views.decorators.http import require_http_methods

from backend.models import Invoice
Expand All @@ -11,6 +13,7 @@ def delete_invoice(request: HttpRequest):
delete_items = QueryDict(request.body)

invoice = delete_items.get("invoice")
redirect = delete_items.get("redirect", None)

try:
invoice = Invoice.objects.get(id=invoice)
Expand All @@ -26,7 +29,17 @@ def delete_invoice(request: HttpRequest):
invoice.delete()

if request.htmx:
messages.success(request, "Invoice deleted")
return render(request, "base/toasts.html")
print("should send msg")
if not redirect:
messages.success(request, "Invoice deleted")
return render(request, "base/toasts.html")

try:
resolve(redirect)
response = HttpResponse(request, status=200)
response["HX-Location"] = redirect
return response
except Resolver404:
...

return JsonResponse({"message": "Invoice successfully deleted"}, status=200)
74 changes: 74 additions & 0 deletions backend/api/invoices/manage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
from dataclasses import dataclass
from typing import Literal, TypedDict

from django.contrib import messages
from django.http import HttpRequest
from django.shortcuts import render, redirect
from django.views.decorators.http import require_http_methods

from backend.models import Invoice, UserSettings


class PreviewContext(TypedDict):
type: Literal["preview"]
invoice: Invoice
currency_symbol: str


@dataclass(frozen=True)
class SuccessResponse:
context: PreviewContext
success: Literal[True] = True


@dataclass(frozen=True)
class ErrorResponse:
message: str
success: Literal[False] = False


@require_http_methods(["GET"])
def tab_preview_invoice(request: HttpRequest, invoice_id):
# Redirect if not an HTMX request
if not request.htmx:
return redirect("invoices dashboard") # Maybe should be 404?

prev_invoice = preview_invoice(request, invoice_id)

if prev_invoice.success:
return render(request, "pages/invoices/view/invoice.html", prev_invoice.context)

messages.error(request, prev_invoice.message)

return render(request, "base/toasts.html")


def preview_invoice(request: HttpRequest, invoice_id) -> SuccessResponse | ErrorResponse:
context = {"type": "preview"}

try:
invoice = Invoice.objects.prefetch_related("items").get(id=invoice_id)

except Invoice.DoesNotExist:
return ErrorResponse("Invoice not found")

if request.user.logged_in_as_team:
if invoice.organization != request.user.logged_in_as_team:
return ErrorResponse("You don't have access to this invoice")
else:
if invoice.user != request.user:
return ErrorResponse("You don't have access to this invoice")
try:
currency_symbol = request.user.user_profile.get_currency_symbol
except UserSettings.DoesNotExist:
currency_symbol = "$"

context.update({"invoice": invoice, "currency_symbol": currency_symbol})

context_object = PreviewContext(
type="preview",
invoice=invoice,
currency_symbol=currency_symbol,
)

return SuccessResponse(context=context_object)
3 changes: 2 additions & 1 deletion backend/api/invoices/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.urls import path

from . import fetch, delete, edit, schedule
from . import fetch, delete, edit, schedule, manage
from .create import set_destination
from .create.services import add

Expand Down Expand Up @@ -36,6 +36,7 @@
path("create_schedule/", schedule.create_schedule, name="create_schedule"),
path("schedules/onetime/<str:schedule_id>/cancel/", schedule.cancel_onetime_schedule, name="schedules onetime cancel"),
path("schedules/onetime/fetch/<str:invoice_id>/", schedule.fetch_onetime_schedules, name="schedules onetime fetch"),
path("manage/<int:invoice_id>/tabs/preview/", manage.tab_preview_invoice, name="tab preview"),
]

app_name = "invoices"
Empty file added backend/api/invoices/view.py
Empty file.
6 changes: 6 additions & 0 deletions backend/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
receipts,
)
from backend.views.core.currency_converter import dashboard as cc_dashboard
from backend.views.core.invoices.overview import manage_invoice
from backend.views.core.other.index import index, dashboard

url(
Expand All @@ -26,6 +27,11 @@
path("dashboard/", dashboard, name="dashboard"),
path("dashboard/settings/", settings_v.view.settings_page, name="user settings"),
path("dashboard/invoices/", include("backend.views.core.invoices.urls")),
path(
"dashboard/invoice/<str:invoice_id>/",
manage_invoice,
name="invoice overview",
),
path("favicon.ico", RedirectView.as_view(url="favicon.ico")),
path(
"dashboard/settings/teams",
Expand Down
20 changes: 16 additions & 4 deletions backend/views/core/auth/login.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from django.contrib.auth.hashers import check_password
from django.core.validators import validate_email
from django.http import HttpRequest
from django.urls import reverse
from django.urls import reverse, resolve
from django.urls.exceptions import Resolver404
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.http import require_GET, require_POST
Expand All @@ -26,10 +27,12 @@
@require_GET
@not_authenticated
def login_initial_page(request: HttpRequest):
next = request.GET.get("next")

return render(
request,
"pages/auth/login_initial.html",
{"github_enabled": SOCIAL_AUTH_GITHUB_ENABLED, "google_enabled": SOCIAL_AUTH_GOOGLE_OAUTH2_ENABLED},
{"github_enabled": SOCIAL_AUTH_GITHUB_ENABLED, "next": next, "google_enabled": SOCIAL_AUTH_GOOGLE_OAUTH2_ENABLED},
)


Expand All @@ -41,12 +44,13 @@ def login_manual(request: HttpRequest): # HTMX POST
email = request.POST.get("email")
password = request.POST.get("password")
page = str(request.POST.get("page"))
next = request.POST.get("next")

if not page or page == "1":
return render(
request,
"pages/auth/login.html",
context={"email": email, "magic_links_enabled": ARE_EMAILS_ENABLED},
context={"email": email, "next": next, "magic_links_enabled": ARE_EMAILS_ENABLED},
)

if not email:
Expand All @@ -71,8 +75,16 @@ def login_manual(request: HttpRequest): # HTMX POST

login(request, user)
messages.success(request, "Successfully logged in")

response = HttpResponse(request, status=200)
response["HX-Refresh"] = "true"

try:
resolve(next)
response["HX-Location"] = next
except Resolver404:
print(f"did not resolve: {next}")
...

return response


Expand Down
22 changes: 22 additions & 0 deletions backend/views/core/invoices/overview.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from django.http import HttpRequest

from backend.decorators import *
from backend.models import *


def invoices_dashboard(request: HttpRequest):
context = {}

return render(request, "pages/invoices/dashboard/dashboard.html", context)


def manage_invoice(request: HttpRequest, invoice_id: str):
if not invoice_id.isnumeric():
messages.error(request, "Invalid invoice ID")
return redirect("invoices:dashboard")

invoice = Invoice.objects.get(id=invoice_id)

if not invoice:
return redirect("invoices:dashboard")
return render(request, "pages/invoices/dashboard/manage.html", {"invoice": invoice})
4 changes: 2 additions & 2 deletions backend/views/core/invoices/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def preview(request, invoice_id):

return render(
request,
"pages/invoices/view/invoice.html",
"pages/invoices/view/invoice_page.html",
context,
)

Expand All @@ -57,6 +57,6 @@ def view(request, uuid):

return render(
request,
"pages/invoices/view/invoice.html",
"pages/invoices/view/invoice_page.html",
context,
)
Loading

0 comments on commit c1b57ec

Please sign in to comment.