diff --git a/inventory/views.py b/inventory/views.py index 5c7a5afb..3825b055 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -2183,7 +2183,7 @@ class CustomerDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView model = models.Customer template_name = "customers/view_customer.html" context_object_name = "customer" - permission_required = ["django_ledger.view_customermodel"] + permission_required = ["inventory.view_customer"] def get_context_data(self, **kwargs): dealer = get_user_type(self.request) @@ -2292,7 +2292,7 @@ class CustomerCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView model = models.Customer form_class = forms.CustomerForm - permission_required = ["django_ledger.add_customermodel"] + permission_required = ["inventory.add_customer"] template_name = "customers/customer_form.html" success_url = reverse_lazy("customer_list") success_message = "Customer created successfully" @@ -2359,7 +2359,7 @@ class CustomerUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView model = models.Customer form_class = forms.CustomerForm - permission_required = ["django_ledger.change_customermodel"] + permission_required = ["inventory.change_customer"] template_name = "customers/customer_form.html" success_url = reverse_lazy("customer_list") success_message = "Customer updated successfully" @@ -2371,6 +2371,7 @@ class CustomerUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView def get_success_url(self): return reverse_lazy("customer_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]}) +@permission_required('inventory.delete_customer',raise_exception=True) @login_required def delete_customer(request, dealer_slug ,slug): """ @@ -2425,6 +2426,7 @@ class VendorListView(LoginRequiredMixin, ListView): context_object_name = "vendors" paginate_by = 30 template_name = "vendors/vendors_list.html" + permission_required='django_ledger.view_vendormodel' def get_queryset(self): query = self.request.GET.get("q") @@ -2436,6 +2438,7 @@ class VendorListView(LoginRequiredMixin, ListView): @login_required +@permission_required('django_ledger.view_vendormodel',raise_exception=True) def vendorDetailView(request, dealer_slug,slug): """ Fetches and renders the detail view for a specific vendor. @@ -2485,6 +2488,7 @@ class VendorCreateView( form_class = forms.VendorForm template_name = "vendors/vendor_form.html" success_message = _("Vendor created successfully") + permission_required='django_ledger.add_vendormodel' def form_valid(self, form): if vendor := models.Vendor.objects.filter(email=form.instance.email).first(): @@ -2536,6 +2540,7 @@ class VendorUpdateView( form_class = forms.VendorForm template_name = "vendors/vendor_form.html" success_message = _("Vendor updated successfully") + permission_required='django_ledger.change_vendormodel' # def get_initial(self): # initial = super().get_initial() @@ -2560,6 +2565,7 @@ class VendorUpdateView( return reverse_lazy("vendor_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]}) @login_required +@permission_required('django_ledger.delete_vendormodel',raise_exception=True) def delete_vendor(request, dealer_slug,slug): """ Deletes an existing vendor record from the database. @@ -3318,6 +3324,7 @@ class OrganizationListView(LoginRequiredMixin, ListView): template_name = "organizations/organization_list.html" context_object_name = "organizations" paginate_by = 20 + permission_required='inventory.view_organization' def get_queryset(self): query = self.request.GET.get("q") @@ -3349,6 +3356,7 @@ class OrganizationDetailView(LoginRequiredMixin, DetailView): model = models.Organization template_name = "organizations/organization_detail.html" context_object_name = "organization" + permission_required='inventory.view_organization' class OrganizationCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView): """ @@ -3368,7 +3376,7 @@ class OrganizationCreateView(LoginRequiredMixin, PermissionRequiredMixin, Create model = models.Organization form_class = forms.OrganizationForm - permission_required = ["django_ledger.add_customermodel"] + permission_required='inventory.add_organization' template_name = "organizations/organization_form.html" success_url = reverse_lazy("organization_list") success_message = "Organization created successfully" @@ -3422,7 +3430,7 @@ class OrganizationUpdateView(LoginRequiredMixin, PermissionRequiredMixin, Update model = models.Organization form_class = forms.OrganizationForm - permission_required = ["django_ledger.change_customermodel"] + permission_required='inventory.change_organization' template_name = "organizations/organization_form.html" success_url = reverse_lazy("organization_list") success_message = "Organization updated successfully" @@ -3436,6 +3444,7 @@ class OrganizationUpdateView(LoginRequiredMixin, PermissionRequiredMixin, Update return reverse_lazy("organization_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]}) @login_required +@permission_required('inventory.delete_organization',raise_exception=True) def OrganizationDeleteView(request,dealer_slug, slug): """ Handles the deletion of an organization based on the provided primary key (pk). Looks up @@ -3678,7 +3687,7 @@ class BankAccountCreateView( form_class = BankAccountCreateForm template_name = "ledger/bank_accounts/bank_account_form.html" success_message = _("Bank account created successfully") - permission_required = ["inventory.view_carfinance"] + permission_required = ["django_ledger.add_bankaccountmodel"] def form_valid(self, form): dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"]) @@ -3732,7 +3741,7 @@ class BankAccountDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailV model = BankAccountModel template_name = "ledger/bank_accounts/bank_account_detail.html" context_object_name = "bank_account" - permission_required = ["inventory.view_carfinance"] + permission_required = ["django_ledger.view_bankaccountmodel"] class BankAccountUpdateView( @@ -3765,7 +3774,7 @@ class BankAccountUpdateView( form_class = BankAccountUpdateForm template_name = "ledger/bank_accounts/bank_account_form.html" success_message = _("Bank account updated successfully") - permission_required = ["inventory.view_carfinance"] + permission_required = ["django_ledger.change_bankaccountmodel"] def get_form_kwargs(self): dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"]) @@ -3794,6 +3803,7 @@ class BankAccountUpdateView( @login_required +@permission_required("django_ledger.delete_bankaccountmodel",raise_exception=True) def bank_account_delete(request, dealer_slug, pk): """ Delete a bank account entry from the database. @@ -3852,8 +3862,7 @@ class AccountListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): model = AccountModel template_name = "ledger/coa_accounts/account_list.html" context_object_name = "accounts" - - permission_required = ["inventory.view_carfinance"] + permission_required = ["django_ledger.view_accountmodel"] def get_queryset(self): query = self.request.GET.get("q") @@ -3901,7 +3910,7 @@ class AccountCreateView( form_class = AccountModelCreateForm template_name = "ledger/coa_accounts/account_form.html" success_message = _("Account created successfully") - permission_required = ["inventory.view_carfinance"] + permission_required = ["django_ledger.add_accountmodel"] def form_valid(self, form): dealer = get_user_type(self.request) @@ -3959,7 +3968,7 @@ class AccountDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView) context_object_name = "account" slug_field = "uuid" DEFAULT_TXS_DAYS = 30 - permission_required = ["inventory.view_carfinance"] + permission_required = ["django_ledger.view_accountmodel"] extra_context = { "DEFAULT_TXS_DAYS": DEFAULT_TXS_DAYS, "header_subtitle_icon": "ic:round-account-tree", @@ -4019,7 +4028,7 @@ class AccountUpdateView( form_class = AccountModelUpdateForm template_name = "ledger/coa_accounts/account_form.html" success_message = _("Account updated successfully") - permission_required = ["inventory.view_carfinance"] + permission_required = ["django_ledger.change_accountmodel"] def get_form(self, form_class=None): form = super().get_form(form_class) @@ -4034,7 +4043,7 @@ class AccountUpdateView( @login_required -@permission_required("inventory.view_carfinance") +@permission_required("django_ledger.view_accountmodel",raise_exception=True) def account_delete(request, dealer_slug, pk): """ Handles the deletion of an account object identified by its primary key (pk). Ensures @@ -4092,6 +4101,7 @@ class SaleOrderDetailView(LoginRequiredMixin, DetailView): model = models.SaleOrder template_name = "sales/saleorder_detail.html" context_object_name = "sale_order" + permission_required='inventory.view_saleorder' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) @@ -4524,6 +4534,7 @@ class SaleOrderDetail(DetailView): model = models.SaleOrder template_name = "sales/orders/order_details.html" context_object_name = "saleorder" + permission_required='inventory.view_saleorder' def get_object(self, queryset=None): order_pk = self.kwargs.get("order_pk") @@ -4542,6 +4553,7 @@ class SaleOrderDetail(DetailView): @login_required +@permission_required("inventory.view_saleorder",raise_exception=True) def preview_sale_order(request, dealer_slug, pk): """ Handles rendering of the sale order preview page for a specific estimate. @@ -4829,7 +4841,7 @@ class DraftInvoiceModelUpdateFormView( form_class = DraftInvoiceModelUpdateForm template_name = "sales/invoices/draft_invoice_update.html" success_url = reverse_lazy("invoice_list") - permission_required = ["django_ledger.view_invoicemodel"] + permission_required = ["django_ledger.change_invoicemodel"] def get_form_kwargs(self): kwargs = super().get_form_kwargs() @@ -4871,7 +4883,7 @@ class ApprovedInvoiceModelUpdateFormView( form_class = ApprovedInvoiceModelUpdateForm template_name = "sales/invoices/approved_invoice_update.html" success_url = reverse_lazy("invoice_list") - permission_required = ["django_ledger.view_invoicemodel"] + permission_required = ["django_ledger.change_invoicemodel"] def get_form_kwargs(self): kwargs = super().get_form_kwargs() @@ -4919,7 +4931,7 @@ class PaidInvoiceModelUpdateFormView( form_class = PaidInvoiceModelUpdateForm template_name = "sales/invoices/paid_invoice_update.html" success_url = reverse_lazy("invoice_list") - permission_required = ["django_ledger.view_invoicemodel"] + permission_required = ["django_ledger.change_invoicemodel"] def get_form_kwargs(self): kwargs = super().get_form_kwargs() @@ -5101,7 +5113,7 @@ class InvoicePreviewView(LoginRequiredMixin, PermissionRequiredMixin, DetailView @login_required -@permission_required("django_ledger.add_journalentrymodel", raise_exception=True) +@permission_required("inventory.add_payment", raise_exception=True) def PaymentCreateView(request, dealer_slug, pk): """ Handles the creation of a payment entry associated with an invoice or bill. Validates @@ -5176,7 +5188,7 @@ def PaymentCreateView(request, dealer_slug, pk): @login_required -@permission_required("django_ledger.view_journalentrymodel", raise_exception=True) +@permission_required("inventory.view_payment", raise_exception=True) def PaymentListView(request, dealer_slug): """ Handles the view for listing payment information associated with the journals of a specific @@ -5206,7 +5218,7 @@ def PaymentListView(request, dealer_slug): @login_required -@permission_required("django_ledger.view_journalentrymodel", raise_exception=True) +@permission_required("inventory.view_payment", raise_exception=True) def PaymentDetailView(request, dealer_slug, pk): """ This function handles the detail view for a payment by fetching a journal entry @@ -5236,7 +5248,7 @@ def PaymentDetailView(request, dealer_slug, pk): @login_required -@permission_required("django_ledger.change_journalentrymodel", raise_exception=True) +@permission_required("inventory.change_payment", raise_exception=True) def payment_mark_as_paid(request, dealer_slug, pk): """ Marks an invoice as paid if it meets the conditions of being fully paid and eligible @@ -5567,6 +5579,7 @@ def lead_tracking(request,dealer_slug): # @require_POST +@permission_required("inventory.change_lead", raise_exception=True) def update_lead_actions(request,dealer_slug): try: lead_id = request.POST.get("lead_id") @@ -5682,6 +5695,7 @@ def LeadDeleteView(request,dealer_slug, slug): @login_required +@permission_required("inventory.change_lead", raise_exception=True) def add_note_to_lead(request,dealer_slug, slug): """ Adds a note to a specific lead. This view is accessible only to authenticated @@ -5714,6 +5728,7 @@ def add_note_to_lead(request,dealer_slug, slug): @login_required +@permission_required("inventory.change_opportunity", raise_exception=True) def add_note_to_opportunity(request,dealer_slug, slug): """ Add a note to a specific opportunity identified by its primary key. @@ -6090,6 +6105,7 @@ class OpportunityCreateView(CreateView, SuccessMessageMixin, LoginRequiredMixin) form_class = forms.OpportunityForm template_name = "crm/opportunities/opportunity_form.html" success_message = "Opportunity created successfully." + permission_required='inventory.add_opportunity' def get_initial(self): initial = super().get_initial() @@ -6141,6 +6157,7 @@ class OpportunityUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView) form_class = forms.OpportunityForm template_name = "crm/opportunities/opportunity_form.html" success_message = "Opportunity updated successfully." + permission_required='inventory.change_opportunity' def get_success_url(self): return reverse_lazy("opportunity_detail", kwargs={"dealer_slug":self.kwargs.get("dealer_slug"),"slug": self.object.slug}) @@ -6166,6 +6183,7 @@ class OpportunityDetailView(LoginRequiredMixin, DetailView): model = models.Opportunity template_name = "crm/opportunities/opportunity_detail.html" context_object_name = "opportunity" + permission_required='inventory.view_opportunity' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) @@ -6265,6 +6283,7 @@ class OpportunityListView(LoginRequiredMixin, ListView): @login_required +@permission_required('inventory.delete_opportunity',raise_exception=True) def delete_opportunity(request,dealer_slug, pk): """ Deletes an opportunity object from the database and redirects to the opportunity @@ -6436,7 +6455,7 @@ class ItemServiceCreateView( template_name = "items/service/service_create.html" success_message = _("Service created successfully") context_object_name = "service" - permission_required = ["django_ledger.add_itemmodel"] + permission_required = ["inventory.add_additionalservices"] def form_valid(self, form): vat = models.VatRate.objects.get(is_active=True) @@ -6482,7 +6501,8 @@ class ItemServiceUpdateView( template_name = "items/service/service_create.html" success_message = _("Service updated successfully") context_object_name = "service" - permission_required = ["django_ledger.change_itemmodel"] + permission_required = ["inventory.change_additionalservices"] + def form_valid(self, form): vat = models.VatRate.objects.get(is_active=True) @@ -6520,7 +6540,8 @@ class ItemServiceListView(LoginRequiredMixin, PermissionRequiredMixin, ListView) template_name = "items/service/service_list.html" context_object_name = "services" paginate_by = 30 - permission_required = ["django_ledger.view_itemmodel"] + permission_required = ["inventory.view_additionalservices"] + def get_queryset(self): dealer = get_user_type(self.request) @@ -7031,6 +7052,7 @@ def bill_mark_as_paid(request, pk): class BillModelCreateView(CreateView): template_name = "bill/bill_create.html" PAGE_TITLE = _("Create Bill") + permission_required = ["django_ledger.add_billmodel"] extra_context = { "page_title": PAGE_TITLE, "header_title": PAGE_TITLE, @@ -7213,6 +7235,7 @@ class BillModelCreateView(CreateView): class BillModelDetailViewView(BillModelDetailView): template_name = "bill/bill_detail.html" + permission_required = ["django_ledger.view_billmodel"] def get_context_data(self, **kwargs): context = super(BillModelDetailViewView, self).get_context_data(**kwargs) @@ -7222,6 +7245,8 @@ class BillModelDetailViewView(BillModelDetailView): class BillModelUpdateViewView(BillModelUpdateView): template_name = "bill/bill_update.html" + permission_required = ["django_ledger.change_billmodel"] + def post(self, request, dealer_slug, entity_slug, bill_pk, *args, **kwargs): if self.action_update_items: @@ -7492,7 +7517,7 @@ class OrderListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): # email @login_required -@permission_required("django_ledger.view_estimatemodel", raise_exception=True) +@permission_required("django_ledger.change_estimatemodel", raise_exception=True) def send_email_view(request, dealer_slug, pk): """ View function to send an email for an estimate. This function allows authenticated and @@ -8578,6 +8603,7 @@ class LedgerModelListView(LoginRequiredMixin, ListView, ArchiveIndexView): model = LedgerModel context_object_name = "ledgers" template_name = "ledger/ledger/ledger_list.html" + permission_required = ["django_ledger.view_ledgermodel"] date_field = "created" ordering = "-created" show_all = False @@ -8629,6 +8655,7 @@ class LedgerModelDetailView(LoginRequiredMixin, DetailView): model = LedgerModel context_object_name = "ledger" template_name = "ledger/ledger/ledger_detail.html" + permission_required = ["django_ledger.view_ledgermodel"] class LedgerModelCreateView(LedgerModelCreateViewBase): @@ -8646,6 +8673,7 @@ class LedgerModelCreateView(LedgerModelCreateViewBase): """ template_name = "ledger/ledger/ledger_form.html" + permission_required = ["django_ledger.add_ledgermodel"] def get_form(self, form_class=None): dealer = get_user_type(self.request) @@ -8701,6 +8729,7 @@ class LedgerModelDeleteView(LedgerModelDeleteViewBase, SuccessMessageMixin): template_name = "ledger/ledger/ledger_delete.html" success_message = "Ledger deleted" + permission_required = ["django_ledger.delete_ledgermodel"] def get_success_url(self): return reverse("ledger_list", args=[self.kwargs["dealer_slug"]]) @@ -8749,6 +8778,7 @@ class JournalEntryListView(LoginRequiredMixin, ListView): model = JournalEntryModel context_object_name = "journal_entries" template_name = "ledger/journal_entry/journal_entry_list.html" + permission_required = ["django_ledger.view_journalentrymodel"] ordering = ["-timestamp"] def get_queryset(self): @@ -8786,6 +8816,7 @@ class JournalEntryCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView model = JournalEntryModel template_name = "ledger/journal_entry/journal_entry_form.html" + permission_required = ["django_ledger.add_journalentrymodel"] form_class = forms.JournalEntryModelCreateForm ledger_model = None success_message = _("Journal Entry created") @@ -8808,7 +8839,7 @@ class JournalEntryCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView ledger = LedgerModel.objects.filter(pk=self.kwargs["pk"]).first() return reverse("journalentry_list", kwargs={"dealer_slug":self.kwargs["dealer_slug"],"pk": ledger.pk}) - +@permission_required("django_ledger.view_journalentrymodel",raise_exception=True) def JournalEntryDeleteView(request, pk): """ Handles the deletion of a specific journal entry. This view facilitates @@ -9458,10 +9489,11 @@ def permenant_delete_account(request,dealer_slug, content_type, slug): ##################################################################### - +@permission_required("django_ledger.add_purchaseordermodel",raise_exception=True) def PurchaseOrderCreateView(request, dealer_slug,entity_slug): dealer = get_object_or_404(models.Dealer, slug=dealer_slug) entity = dealer.entity + if request.method == "POST": try: po = entity.create_purchase_order(po_title=request.POST.get("po_title")) @@ -9479,7 +9511,7 @@ def PurchaseOrderCreateView(request, dealer_slug,entity_slug): ) return render(request, "purchase_orders/po_form.html", {"form": form}) - +@permission_required("inventory.add_car",raise_exception=True) def InventoryItemCreateView(request, dealer_slug): dealer = get_object_or_404(models.Dealer, slug=dealer_slug) for_po = request.GET.get("for_po") @@ -9592,8 +9624,9 @@ def inventory_items_filter(request, dealer_slug): class PurchaseOrderDetailView(PurchaseOrderModelDetailViewBase): template_name = "purchase_orders/po_detail.html" context_object_name = "po_model" - permission_required = ["inventory.view_carfinance"] - + permission_required=["django_ledger.view_purchaseordermodel"] + + def get_queryset(self): dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"]) self.queryset = dealer.entity.get_purchase_orders().select_related("entity", "ce_model") @@ -9611,7 +9644,8 @@ class PurchaseOrderListView(LoginRequiredMixin, PermissionRequiredMixin, ListVie context_object_name = "purchase_orders" paginate_by = 20 template_name = "purchase_orders/po_list.html" - permission_required = ["inventory.view_carfinance"] + permission_required=["django_ledger.view_purchaseordermodel"] + def get_queryset(self): dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"]) @@ -9695,6 +9729,8 @@ class PurchaseOrderListView(LoginRequiredMixin, PermissionRequiredMixin, ListVie class PurchaseOrderUpdateView(PurchaseOrderModelUpdateViewBase): template_name = "purchase_orders/po_update.html" context_object_name = "po_model" + permission_required=["django_ledger.change_purchaseordermodel"] + def get_context_data(self, itemtxs_formset=None, **kwargs): dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"]) @@ -9868,6 +9904,8 @@ class BasePurchaseOrderActionActionView(BasePurchaseOrderActionActionViewBase): class PurchaseOrderModelDeleteView(PurchaseOrderModelDeleteViewBase): template_name = "purchase_orders/po_delete.html" + permission_required=["django_ledger.delete_purchaseordermodel"] + def get_success_url(self): messages.add_message( @@ -10129,6 +10167,7 @@ def bulk_update_car_price(request): class InventoryListView(InventoryListViewBase): template_name = "inventory/list.html" + permission_required=['inventory.view_car'] def get_queryset(self): dealer = get_user_type(self.request) diff --git a/templates/crm/leads/lead_detail.html b/templates/crm/leads/lead_detail.html index d7de8861..f3110d1e 100644 --- a/templates/crm/leads/lead_detail.html +++ b/templates/crm/leads/lead_detail.html @@ -172,6 +172,7 @@
23 tasks
{{opportunity.get_all_notes}}