diff --git a/inventory/urls.py b/inventory/urls.py index e57596fe..25956e4e 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -465,9 +465,9 @@ urlpatterns = [ views.RepresentativeDeleteView.as_view(), name="representative_delete", ), - path("/ledgers/", views.LedgerModelListView.as_view(), name="ledger_list"), + path("/ledgers//", views.LedgerModelListView.as_view(), name="ledger_list"), path( - "/ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create" + "/ledgers//create/", views.LedgerModelCreateView.as_view(), name="ledger_create" ), path( "/ledgers//detail//", diff --git a/inventory/views.py b/inventory/views.py index 641c7f9e..94bb6158 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -1232,7 +1232,7 @@ def inventory_stats_view(request, dealer_slug): "trims": {}, } try: - logger.debug(f"Attempting to update inventory for Car ID: {car.id}, Make: {make.name} ({make.id_car_make}), " + logger.debug(f"Attempting to update inventory for Car ID: {car.id}, Make: {make.name} ({make.id_car_make}), " f"Model: {model.name} ({model.id_car_model}).") inventory[make.id_car_make]["models"][model.id_car_model]["total_cars"] += 1 @@ -1260,7 +1260,7 @@ def inventory_stats_view(request, dealer_slug): f"Error updating inventory counts for car ID {getattr(car, 'id', 'N/A')}. " f"Make ID: {getattr(make, 'id_car_make', 'N/A')}, Model ID: {getattr(model, 'id_car_model', 'N/A')}, " f"Trim ID: {getattr(trim, 'id_car_trim', 'N/A')}. Error: {e}", - exc_info=True + exc_info=True ) print(e) result = { @@ -2922,7 +2922,7 @@ def GroupPermissionView(request, dealer_slug, pk): ("inventory", "notes"), ("inventory", "tasks"), ("inventory", "activity"), - + ("django_ledger", "purchaseordermodel"), ("django_ledger", "bankaccountmodel"), @@ -2972,7 +2972,7 @@ def GroupPermissionView(request, dealer_slug, pk): group.permissions.clear() if valid_perms.exists(): group.permissions.add(*valid_perms) - + # --- Logging for successful permission update --- logger.info( f"Permissions for Group '{group.name}' (ID: {group.id}) " @@ -4654,7 +4654,7 @@ def create_sale_order(request, dealer_slug, pk): item.item_model.additional_info["car_info"]["status"] = "sold" item.item_model.save() logger.debug(f"Car status updated to 'sold' for item.item_model PK: {getattr(item.item_model, 'pk', 'N/A')}.") - + except KeyError: logger.warning(f"KeyError: 'car_info' or 'status' key missing when attempting to update status to 'sold' for item.item_model PK: {getattr(item.item_model, 'pk', 'N/A')}.") pass @@ -4887,7 +4887,7 @@ def estimate_mark_as(request, dealer_slug, pk): except Exception as e: logger.error(f"Failed to update car status to 'available' for Estimate ID: {getattr(estimate, 'pk', 'N/A')}. " f"Attempted VIN: '{car.vin}'. Error: {e}",exc_info=True ) - + messages.success(request, _("Quotation canceled successfully")) estimate.save() messages.success(request, _("Quotation marked as ") + mark.upper()) @@ -5336,7 +5336,7 @@ def PaymentCreateView(request, dealer_slug, pk): elif bill: set_bill_payment(dealer, entity, bill, amount, payment_method) logger.info(f"User {user_username} (ID: {user_id}) successfully processed payment for Bill ID: {bill.pk} (Dealer: {dealer.slug}) Amount: {amount}, Method: {payment_method}.") - + messages.success(request, _("Payment created successfully")) return redirect(redirect_url, dealer_slug=dealer.slug, pk=model.pk) except Exception as e: @@ -5344,7 +5344,7 @@ def PaymentCreateView(request, dealer_slug, pk): f"User {user_username} (ID: {user_id}) encountered error creating payment " f"for (Dealer: {dealer.slug}). " f"Attempted Amount: {amount}, Method: {payment_method}. Error: {e}", - exc_info=True + exc_info=True ) messages.error(request, f"Error creating payment: {str(e)}") else: @@ -5652,9 +5652,9 @@ def lead_create(request,dealer_slug): user_username = request.user.username if request.user.is_authenticated else 'anonymous' # Log intent before trying to mark as paid - + form = forms.LeadForm(request.POST) - + # Filter car models based on the selected make (for POST requests) if "id_car_make" in request.POST: form.fields["id_car_model"].queryset = models.CarModel.objects.filter( @@ -5859,7 +5859,7 @@ def update_lead_actions(request,dealer_slug): ) return JsonResponse({"success": False, "message": "Lead not found"}, status=404) except Exception as e: - involved_lead_id = request.POST.get("lead_id", "N/A") + involved_lead_id = request.POST.get("lead_id", "N/A") logger.error( f"User {user_username} encountered an unexpected error while updating Lead ID: '{involved_lead_id}' " f"for dealer '{dealer_slug}'. Error: {e}", @@ -5927,14 +5927,14 @@ def LeadDeleteView(request,dealer_slug, slug): """ # get the user info for logging user_username = request.user.username if request.user.is_authenticated else 'anonymous' - + lead = get_object_or_404(models.Lead, slug=slug) # Log intent before attempting deletion logger.debug( f"User {user_username} attempting to delete Lead ID: {lead.id} ('{lead.name}') " f"and its associated customer/user for dealer '{dealer_slug}'." - ) + ) try: @@ -5951,7 +5951,7 @@ def LeadDeleteView(request,dealer_slug, slug): f"User {user_username} encountered an error deleting associated user/customer " f"for Lead ID: {lead.id} ('{lead.name}') (Email: {getattr(lead.customer, 'email', 'N/A')}). " # Safely get email f"Error: {e}", - exc_info=True + exc_info=True ) print(e) lead_id_final = lead.id # Capture before deletion @@ -7049,9 +7049,9 @@ class BillModelCreateView(LoginRequiredMixin,PermissionRequiredMixin,CreateView) for_purchase_order = False for_estimate = False permission_required = "django_ledger.add_billmodel" - + # Get user info for logging - + def get(self, request, dealer_slug, **kwargs): user_username = request.user.username if request.user.is_authenticated else 'anonymous' @@ -7082,7 +7082,7 @@ class BillModelCreateView(LoginRequiredMixin,PermissionRequiredMixin,CreateView) context = super(BillModelCreateView, self).get_context_data(**kwargs) user_username = self.request.user.username if self.request.user.is_authenticated else 'anonymous' - + if self.for_purchase_order: po_pk = self.kwargs["po_pk"] po_item_uuids_qry_param = self.request.GET.get("item_uuids") @@ -7191,7 +7191,7 @@ class BillModelCreateView(LoginRequiredMixin,PermissionRequiredMixin,CreateView) entity_slug=self.kwargs["entity_slug"], user_model=self.request.user ) po_model: PurchaseOrderModel = get_object_or_404(po_qs, uuid__exact=po_pk) - + user_username = self.request.user.username if self.request.user.is_authenticated else 'anonymous' try: bill_model.can_bind_po(po_model, raise_exception=True) @@ -8638,7 +8638,7 @@ class LedgerModelListView(LoginRequiredMixin,PermissionRequiredMixin, ListView, show_visible = False allow_empty = True paginate_by = 30 - permission_required = "ledger.view_ledgermodel" + permission_required = "django_ledger.view_ledgermodel" def get_queryset(self): qs = super().get_queryset() @@ -8683,7 +8683,7 @@ class LedgerModelDetailView(LoginRequiredMixin, PermissionRequiredMixin,DetailVi model = LedgerModel context_object_name = "ledger" template_name = "ledger/ledger/ledger_detail.html" - permission_required = "ledger.view_ledgermodel" + permission_required = "django_ledger.view_ledgermodel" class LedgerModelCreateView(LedgerModelCreateViewBase): @@ -8718,7 +8718,10 @@ class LedgerModelCreateView(LedgerModelCreateViewBase): return super().form_valid(form) def get_success_url(self): - return reverse("ledger_list") + return reverse("ledger_list", kwargs={ + "dealer_slug": self.kwargs["dealer_slug"], + "entity_slug": self.kwargs["entity_slug"] + }) class LedgerModelModelActionView(LedgerModelModelActionViewBase): @@ -8736,7 +8739,10 @@ class LedgerModelModelActionView(LedgerModelModelActionViewBase): """ def get_redirect_url(self, *args, **kwargs): - return reverse("ledger_list", args=[self.kwargs["dealer_slug"]]) + return reverse("ledger_list", kwargs={ + "dealer_slug": self.kwargs["dealer_slug"], + "entity_slug": self.kwargs["entity_slug"] + }) class LedgerModelDeleteView(LedgerModelDeleteViewBase, SuccessMessageMixin): @@ -8760,7 +8766,10 @@ class LedgerModelDeleteView(LedgerModelDeleteViewBase, SuccessMessageMixin): permission_required = ["django_ledger.delete_ledgermodel"] def get_success_url(self): - return reverse("ledger_list", args=[self.kwargs["dealer_slug"]]) + return reverse("ledger_list", kwargs={ + "dealer_slug": self.kwargs["dealer_slug"], + "entity_slug": self.kwargs["entity_slug"] + }) # class LedgerModelCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView): @@ -9389,7 +9398,7 @@ def add_note(request,dealer_slug, content_type, slug): logger.info( f"User {user_username} successfully added a note " f"for {content_type} ID: {obj.slug} (Dealer: {dealer_slug}). " - f"Note: '{note.notes[:50]}...'." + f"Note: '{note.notes[:50]}...'." ) messages.success(request, _("Note added successfully")) else: @@ -9608,7 +9617,7 @@ def activate_account(request,dealer_slug, content_type, slug): # --- Single-line log for successful account activation --- logger.info( f"User {user_username} successfully activated account " - f"for {content_type} ID: {obj.slug} ('{obj.name if hasattr(obj, 'name') else obj}') " + f"for {content_type} ID: {obj.slug} ('{obj.name if hasattr(obj, 'name') else obj}') " f"on dealer '{dealer_slug}'." ) messages.success(request, _("Account activated successfully")) @@ -9670,7 +9679,7 @@ def permenant_delete_account(request,dealer_slug, content_type, slug): f"User {user_username} encountered an unexpected error " f"while permanently deleting account for {content_type} ID: {obj.slug} " f"('{obj.name if hasattr(obj, 'name') else obj}') on dealer '{dealer_slug}'. Error: {e}", - exc_info=True + exc_info=True ) messages.error(request, _(f"Error deleting account: {e}")) return redirect("user_management", dealer_slug=dealer_slug) @@ -9686,7 +9695,7 @@ def permenant_delete_account(request,dealer_slug, content_type, slug): def PurchaseOrderCreateView(request, dealer_slug,entity_slug): dealer = get_object_or_404(models.Dealer, slug=dealer_slug) entity = dealer.entity - + # Get user information for logging user_username = request.user.username if request.user.is_authenticated else 'anonymous' @@ -10103,7 +10112,7 @@ class BasePurchaseOrderActionActionView(BasePurchaseOrderActionActionViewBase): request, dealer_slug, entity_slug, po_pk, *args, **kwargs ) po_model: PurchaseOrderModel = self.get_object() - + # Log the attempt to perform the action logger.debug( f"User {user_username} attempting to call action '{self.action_name}' " @@ -10312,7 +10321,7 @@ def upload_cars(request, dealer_slug, pk=None): logger.error( f"User {user_username} encountered an error while preparing car data " f"for upload (Item PK: {pk if pk else 'N/A'}, Dealer: {dealer_slug}). Error: {e}", - exc_info=True + exc_info=True ) messages.error(request, f"Error processing CSV: {str(e)}") return response diff --git a/templates/header.html b/templates/header.html index 417cc98b..44795d54 100644 --- a/templates/header.html +++ b/templates/header.html @@ -230,7 +230,7 @@ {% if perms.django_ledger.view_journalentrymodel %}