Compare commits
7 Commits
85efc27bf1
...
23a67d22a0
| Author | SHA1 | Date | |
|---|---|---|---|
| 23a67d22a0 | |||
| b66e1dd0ed | |||
| 1ae5f93f6c | |||
| e29f520d6c | |||
| 4e97f0523b | |||
| 0c56fcf50a | |||
| 4c3f068f03 |
@ -2550,6 +2550,15 @@ class CustomGroup(models.Model):
|
||||
pass
|
||||
|
||||
def set_default_permissions(self):
|
||||
Permission.objects.get_or_create(name="Can approve estimate",codename="can_approve_estimatemodel",content_type=ContentType.objects.get_for_model(EstimateModel))
|
||||
Permission.objects.get_or_create(name="Can approve bill",codename="can_approve_billmodel",content_type=ContentType.objects.get_for_model(BillModel))
|
||||
|
||||
Permission.objects.get_or_create(name="Can view inventory",codename="can_view_inventory",content_type=ContentType.objects.get_for_model(Car))
|
||||
Permission.objects.get_or_create(name="Can view sales",codename="can_view_sales",content_type=ContentType.objects.get_for_model(EstimateModel))
|
||||
Permission.objects.get_or_create(name="Can view crm",codename="can_view_crm",content_type=ContentType.objects.get_for_model(Lead))
|
||||
Permission.objects.get_or_create(name="Can view financials",codename="can_view_financials",content_type=ContentType.objects.get_for_model(AccountModel))
|
||||
Permission.objects.get_or_create(name="Can view reports",codename="can_view_reports",content_type=ContentType.objects.get_for_model(LedgerModel))
|
||||
|
||||
self.clear_permissions()
|
||||
######################################
|
||||
######################################
|
||||
@ -2599,6 +2608,8 @@ class CustomGroup(models.Model):
|
||||
"vendormodel",
|
||||
"journalentrymodel",
|
||||
"purchaseordermodel",
|
||||
"ledgermodel",
|
||||
"transactionmodel"
|
||||
],
|
||||
other_perms=["can_approve_estimatemodel","can_approve_billmodel","can_view_inventory","can_view_sales","can_view_crm","can_view_financials","can_view_reports"],
|
||||
|
||||
@ -2689,6 +2700,7 @@ class CustomGroup(models.Model):
|
||||
"view_carcolors",
|
||||
"view_cartransfer",
|
||||
"view_saleorder",
|
||||
|
||||
],
|
||||
)
|
||||
self.set_permissions(
|
||||
@ -2706,7 +2718,8 @@ class CustomGroup(models.Model):
|
||||
"estimatemodel",
|
||||
"customermodel",
|
||||
"vendormodel",
|
||||
"TransactionModel"
|
||||
"ledgermodel",
|
||||
"transactionmodel"
|
||||
],
|
||||
other_perms=["view_customermodel", "view_estimatemodel","can_view_inventory","can_view_sales","can_view_crm","can_view_financials","can_view_reports"],
|
||||
)
|
||||
@ -2956,22 +2969,4 @@ class ExtraInfo(models.Model):
|
||||
verbose_name_plural = "Extra Info"
|
||||
|
||||
def __str__(self):
|
||||
return f"ExtraInfo for {self.content_object} ({self.content_type})"
|
||||
|
||||
@classmethod
|
||||
def get_sale_orders(cls, staff=None,is_dealer=False):
|
||||
if not staff and not is_dealer:
|
||||
return []
|
||||
if is_dealer:
|
||||
qs = ExtraInfo.objects.filter(
|
||||
content_type=ContentType.objects.get_for_model(EstimateModel),
|
||||
related_content_type=ContentType.objects.get_for_model(Staff),
|
||||
)
|
||||
else:
|
||||
qs = ExtraInfo.objects.filter(
|
||||
content_type=ContentType.objects.get_for_model(EstimateModel),
|
||||
related_content_type=ContentType.objects.get_for_model(Staff),
|
||||
related_object_id=staff.pk,
|
||||
)
|
||||
|
||||
return [x.content_object.sale_orders.first for x in qs]
|
||||
return f"ExtraInfo for {self.content_object} ({self.content_type})"
|
||||
@ -465,9 +465,9 @@ urlpatterns = [
|
||||
views.RepresentativeDeleteView.as_view(),
|
||||
name="representative_delete",
|
||||
),
|
||||
path("<slug:dealer_slug>/ledgers/", views.LedgerModelListView.as_view(), name="ledger_list"),
|
||||
path("<slug:dealer_slug>/ledgers/<slug:entity_slug>/", views.LedgerModelListView.as_view(), name="ledger_list"),
|
||||
path(
|
||||
"<slug:dealer_slug>/ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create"
|
||||
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/create/", views.LedgerModelCreateView.as_view(), name="ledger_create"
|
||||
),
|
||||
path(
|
||||
"<slug:dealer_slug>/ledgers/<slug:entity_slug>/detail/<uuid:pk>/",
|
||||
|
||||
@ -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):
|
||||
@ -8712,13 +8712,15 @@ class LedgerModelCreateView(LedgerModelCreateViewBase):
|
||||
)
|
||||
|
||||
def form_valid(self, form):
|
||||
dealer = get_user_type(self.request)
|
||||
instance = form.save(commit=False)
|
||||
instance.entity = dealer.entity
|
||||
dealer = get_user_type(self.request)
|
||||
form.field["entity"] = dealer.entity
|
||||
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 +8738,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 +8765,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):
|
||||
@ -8808,7 +8816,6 @@ class JournalEntryListView(LoginRequiredMixin,PermissionRequiredMixin, ListView)
|
||||
template_name = "ledger/journal_entry/journal_entry_list.html"
|
||||
permission_required = ["django_ledger.view_journalentrymodel"]
|
||||
ordering = ["-timestamp"]
|
||||
permission_required = "ledger.view_ledger"
|
||||
|
||||
def get_queryset(self):
|
||||
qs = super().get_queryset()
|
||||
@ -8849,7 +8856,6 @@ class JournalEntryCreateView(LoginRequiredMixin, PermissionRequiredMixin,Success
|
||||
form_class = forms.JournalEntryModelCreateForm
|
||||
ledger_model = None
|
||||
success_message = _("Journal Entry created")
|
||||
permission_required = ["django_ledger.add_journalentrymodel"]
|
||||
|
||||
def get_form(self, form_class=None):
|
||||
dealer = get_user_type(self.request)
|
||||
@ -9389,7 +9395,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 +9614,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 +9676,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 +9692,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 +10109,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 +10318,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
|
||||
|
||||
@ -230,7 +230,7 @@
|
||||
|
||||
{% if perms.django_ledger.view_journalentrymodel %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'ledger_list' request.dealer.slug %}">
|
||||
<a class="nav-link" href="{% url 'ledger_list' request.dealer.slug request.dealer.entity.slug %}">
|
||||
<div class="d-flex align-items-center">
|
||||
<span class="nav-link-icon"><span class="fas fa-book"></span></span><span class="nav-link-text">{% trans "Ledgers"|capfirst %}</span>
|
||||
</div>
|
||||
|
||||
@ -36,7 +36,9 @@
|
||||
|
||||
<div class="d-flex justify-content-between mb-2">
|
||||
<h3 class="">{% trans "Journal Entries" %}</h3>
|
||||
<a href="{% url 'journalentry_create' request.dealer.slug ledger.pk %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Journal Entry" %}</a>
|
||||
{% if perms.django_ledger.add_journalentrymodel %}
|
||||
<a href="{% url 'journalentry_create' request.dealer.slug ledger.pk %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans "Add Journal Entry" %}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
||||
@ -96,9 +98,11 @@
|
||||
<span class="fas fa-ellipsis-h fs-10"></span>
|
||||
</button>
|
||||
<div class="dropdown-menu dropdown-menu-end py-2">
|
||||
<a class="dropdown-item" href="{% url 'journalentry_transactions' request.dealer.slug je.pk %}">{% trans "View" %}</a>
|
||||
<a class="dropdown-item" href="{% url 'journalentry_txs' request.dealer.slug je.entity_slug je.ledger_id je.pk %}">{% trans "Transactions" %}</a>
|
||||
{% if je.can_delete %}
|
||||
{% if perms.django_ledger.view_transactionmodel %}
|
||||
<a class="dropdown-item" href="{% url 'journalentry_transactions' request.dealer.slug je.pk %}">{% trans "View" %}</a>
|
||||
<a class="dropdown-item" href="{% url 'journalentry_txs' request.dealer.slug je.entity_slug je.ledger_id je.pk %}">{% trans "Transactions" %}</a>
|
||||
{% endif %}
|
||||
{% if je.can_delete and perms.django_ledger.delete_journalentrymodel %}
|
||||
<a class="dropdown-item" href="{% url 'journalentry_delete' request.dealer.slug je.pk %}">{% trans "Delete" %}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
@ -10,7 +10,9 @@
|
||||
|
||||
<div class="d-flex justify-content-between mb-2">
|
||||
<h3 class="">{% trans "Ledger" %}</h3>
|
||||
<a href="{% url 'ledger_create' request.dealer.slug %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans 'Create Ledger' %}</a>
|
||||
{% if perms.django_ledger.add_ledgermodel %}
|
||||
<a href="{% url 'ledger_create' request.dealer.slug request.dealer.entity.slug %}" class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{% trans 'Create Ledger' %}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="table-responsive px-1 scrollbar mt-3">
|
||||
<table class="table align-items-center table-flush">
|
||||
@ -32,14 +34,19 @@
|
||||
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
|
||||
<td class="align-middle product white-space-nowrap px-1">
|
||||
{% if ledger.invoicemodel %}
|
||||
{% if perms.django_ledger.view_invoicemodel%}
|
||||
<a href="{% url 'invoice_detail' request.dealer.slug ledger.invoicemodel.pk %}">{{ ledger.get_wrapped_model_instance }}</a>
|
||||
{% endif %}
|
||||
{% elif ledger.billmodel %}
|
||||
{% if perms.django_ledger.view_billmodel %}
|
||||
<a href="{% url 'bill-detail' request.dealer.slug request.dealer.entity.slug ledger.billmodel.pk %}">{{ ledger.get_wrapped_model_instance }}</a>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<a href="#">{{ ledger.name }}</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="align-middle product white-space-nowrap">
|
||||
{% if perms.django_ledger.view_journalentrymodel %}
|
||||
<a class="btn btn-sm btn-phoenix-primary"
|
||||
href="{% url 'journalentry_list' request.dealer.slug ledger.pk %}">
|
||||
<i class="fa-solid fa-right-left"></i>
|
||||
@ -48,6 +55,7 @@
|
||||
<span>{{ _('Journal Entries') }}</span>
|
||||
</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="align-middle product white-space-nowrap">
|
||||
{{ ledger.created |date }}
|
||||
@ -79,6 +87,7 @@
|
||||
<span class="fas fa-ellipsis-h fs-10"></span>
|
||||
</button>
|
||||
<div class="dropdown-menu dropdown-menu-end py-2">
|
||||
{% if perms.django_ledger.change_ledgermodel%}
|
||||
{% if ledger.can_lock %}
|
||||
<a href="{% url 'ledger-action-lock' dealer_slug=request.dealer.slug entity_slug=entity_slug ledger_pk=ledger.uuid %}"
|
||||
class="dropdown-item has-text-info has-text-weight-bold">{% trans 'Lock' %}</a>
|
||||
@ -109,6 +118,7 @@
|
||||
<a href="{% url 'ledger-delete' dealer_slug=request.dealer.slug entity_slug=entity_slug ledger_pk=ledger.uuid %}"
|
||||
class="dropdown-item has-text-danger has-text-weight-bold text-danger">{% trans 'Delete' %}</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user