This commit is contained in:
Marwan Alwali 2025-03-26 22:10:32 +03:00
parent 62813388d7
commit 4aadba8c62
3 changed files with 608 additions and 240 deletions

View File

@ -207,7 +207,7 @@ def dealer_signup(request, *args, **kwargs):
address = wf3.get("address")
if password != password_confirm:
return JsonResponse({"error": "Passwords do not match."}, status=400)
return JsonResponse({"error": _("Passwords do not match")}, status=400)
try:
with transaction.atomic():
@ -230,7 +230,7 @@ def dealer_signup(request, *args, **kwargs):
address=address,
)
return JsonResponse(
{"message": "User created successfully."}, status=200
{"message": _("User created successfully")}, status=200
)
except Exception as e:
return JsonResponse({"error": str(e)}, status=400)
@ -492,7 +492,7 @@ class CarCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView):
dealer = get_user_type(self.request)
form.instance.dealer = dealer
form.save()
messages.success(self.request, "Car saved successfully.")
messages.success(self.request, _("Car saved successfully"))
return super().form_valid(form)
def car_history(request,pk):
@ -934,7 +934,7 @@ class CarFinanceCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateVie
def form_valid(self, form):
form.instance.car = self.car
messages.success(self.request, _("Car finance details saved successfully."))
messages.success(self.request, _("Car finance details saved successfully"))
return super().form_valid(form)
def get_success_url(self):
@ -958,7 +958,7 @@ class CarFinanceUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessMe
model = models.CarFinance
form_class = forms.CarFinanceForm
template_name = "inventory/car_finance_form.html"
success_message = _("Car finance details updated successfully.")
success_message = _("Car finance details updated successfully")
permission_required = ['inventory.change_carfinance']
def get_success_url(self):
@ -988,7 +988,7 @@ class CarUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessMessageMi
model = models.Car
form_class = forms.CarUpdateForm
template_name = "inventory/car_edit.html"
success_message = _("Car updated successfully.")
success_message = _("Car updated successfully")
permission_required = ['inventory.change_car']
def get_success_url(self):
@ -1002,7 +1002,7 @@ class CarDeleteView(LoginRequiredMixin,PermissionRequiredMixin, SuccessMessageMi
permission_required = ['inventory.delete_car']
def delete(self, request, *args, **kwargs):
messages.success(request, _("Car deleted successfully."))
messages.success(request, _("Car deleted successfully"))
return super().delete(request, *args, **kwargs)
@ -1020,7 +1020,7 @@ class CarLocationCreateView(LoginRequiredMixin,PermissionRequiredMixin,CreateVie
dealer = get_user_type(self.request)
form.instance.owner = dealer
form.save()
messages.success(self.request, "Location saved successfully.")
messages.success(self.request, _("Location saved successfully"))
return super().form_valid(form)
@ -1040,7 +1040,7 @@ class CarLocationUpdateView(LoginRequiredMixin,PermissionRequiredMixin,UpdateVie
dealer = get_user_type(self.request)
form.instance.owner = dealer
form.save()
messages.success(self.request, "Location updated successfully.")
messages.success(self.request, _("Location updated successfully"))
return super().form_valid(form)
def get_success_url(self):
@ -1095,7 +1095,7 @@ def car_transfer_approve(request, car_pk, transfer_pk):
transfer.save()
transfer.car.status = "available"
transfer.car.save()
messages.success(request, _("Car transfer canceled successfully."))
messages.success(request, _("Car transfer canceled successfully"))
models.Notification.objects.create(
user=transfer.from_dealer.user,
message=f"Car transfer request from {transfer.to_dealer} is canceled.",
@ -1112,7 +1112,7 @@ def car_transfer_approve(request, car_pk, transfer_pk):
user=transfer.to_dealer.user,
message=f"Car transfer request from {transfer.from_dealer} is waiting for your acceptance. <a href='{url}'> Accept</a>",
)
messages.success(request, _("Car transfer approved successfully."))
messages.success(request, _("Car transfer approved successfully"))
return redirect("car_detail", pk=car.pk)
@ -1124,7 +1124,7 @@ def car_transfer_accept_reject(request, car_pk, transfer_pk):
if status == "rejected":
transfer.status = "reject"
transfer.active = False
messages.success(request, _("Car transfer rejected successfully."))
messages.success(request, _("Car transfer rejected successfully"))
models.Notification.objects.create(
user=transfer.from_dealer.user,
message=f"Car transfer request from {transfer.to_dealer} is rejected.",
@ -1136,7 +1136,7 @@ def car_transfer_accept_reject(request, car_pk, transfer_pk):
transfer_process = CarTransfer(car, transfer)
success = transfer_process.transfer_car()
if success:
messages.success(request, _("Car Transfer Completed successfully."))
messages.success(request, _("Car Transfer Completed successfully"))
models.Activity.objects.create(content_object=car,notes=f"Transfered from {transfer.from_dealer} to {transfer.to_dealer}",created_by=request.user)
models.Notification.objects.create(
user=transfer.from_dealer.user,
@ -1169,7 +1169,7 @@ class CustomCardCreateView(LoginRequiredMixin, CreateView):
return context
def get_success_url(self):
messages.success(self.request, _("Custom Card added successfully."))
messages.success(self.request, _("Custom Card added successfully"))
return reverse_lazy("car_detail", kwargs={"pk": self.kwargs["car_pk"]})
@ -1189,7 +1189,7 @@ class CarRegistrationCreateView(LoginRequiredMixin, CreateView):
return context
def get_success_url(self):
messages.success(self.request, _("Registration added successfully."))
messages.success(self.request, _("Registration added successfully"))
return reverse_lazy("car_detail", kwargs={"pk": self.kwargs["car_pk"]})
@ -1198,12 +1198,12 @@ def reserve_car_view(request, car_id):
if request.method == "POST":
car = get_object_or_404(models.Car, pk=car_id)
if car.is_reserved():
messages.error(request, _("This car is already reserved."))
messages.error(request, _("This car is already reserved"))
return redirect("car_detail", pk=car.pk)
response = reserve_car(car, request)
return response
return JsonResponse(
{"success": False, "message": "Invalid request method."}, status=400
{"success": False, "message": "Invalid request method"}, status=400
)
@ -1218,7 +1218,7 @@ def manage_reservation(request, reservation_id):
if action == "renew":
reservation.reserved_until = timezone.now() + timezone.timedelta(hours=24)
reservation.save()
messages.success(request, _("Reservation renewed successfully."))
messages.success(request, _("Reservation renewed successfully"))
return redirect("car_detail", pk=reservation.car.pk)
elif action == "cancel":
@ -1226,16 +1226,16 @@ def manage_reservation(request, reservation_id):
reservation.delete()
car.status = models.CarStatusChoices.AVAILABLE
car.save()
messages.success(request, _("Reservation canceled successfully."))
messages.success(request, _("Reservation canceled successfully"))
return redirect("car_detail", pk=reservation.car.pk)
else:
return JsonResponse(
{"success": False, "message": _("Invalid action.")}, status=400
{"success": False, "message": _("Invalid action")}, status=400
)
return JsonResponse(
{"success": False, "message": _("Invalid request method.")}, status=400
{"success": False, "message": _("Invalid request method")}, status=400
)
@ -1276,7 +1276,7 @@ class DealerUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
form_class = forms.DealerForm
template_name = "dealers/dealer_form.html"
success_url = reverse_lazy("dealer_detail")
success_message = _("Dealer updated successfully.")
success_message = _("Dealer updated successfully")
def get_success_url(self):
return reverse("dealer_detail", kwargs={"pk": self.object.pk})
@ -1367,7 +1367,7 @@ def CustomerCreateView(request):
if form.is_valid():
if dealer.entity.get_customers().filter(email=form.cleaned_data["email"]).exists():
messages.error(request, _("Customer with this email already exists."))
messages.error(request, _("Customer with this email already exists"))
else:
# Create customer name
customer_name = (
@ -1391,14 +1391,14 @@ def CustomerCreateView(request):
customer.additional_info.update({"type": "customer"})
customer.save()
messages.success(request, _("Customer created successfully."))
messages.success(request, _("Customer created successfully"))
return redirect("customer_list")
except Exception as e:
messages.error(request, _(f"An error occurred: {str(e)}"))
else:
# Form is invalid, show errors
messages.error(request, _("Please correct the errors below."))
messages.error(request, _("Please correct the errors below"))
return render(request, "customers/customer_form.html", {"form": form})
@ -1437,7 +1437,7 @@ def CustomerUpdateView(request, pk):
raise Exception(e)
instance.save()
messages.success(request, _("Customer updated successfully."))
messages.success(request, _("Customer updated successfully"))
return redirect("customer_list")
else:
form = forms.CustomerForm(
@ -1458,7 +1458,7 @@ def delete_customer(request, pk):
customer.save()
user.save()
messages.success(request, _("Customer deleted successfully."))
messages.success(request, _("Customer deleted successfully"))
return redirect("customer_list")
@ -1490,7 +1490,7 @@ class VendorCreateView(
form_class = forms.VendorForm
template_name = "vendors/vendor_form.html"
success_url = reverse_lazy("vendor_list")
success_message = _("Vendor created successfully.")
success_message = _("Vendor created successfully")
def form_valid(self, form):
dealer = get_user_type(self.request)
@ -1508,7 +1508,7 @@ class VendorUpdateView(
form_class = forms.VendorForm
template_name = "vendors/vendor_form.html"
success_url = reverse_lazy("vendor_list")
success_message = _("Vendor updated successfully.")
success_message = _("Vendor updated successfully")
@login_required
@ -1516,7 +1516,7 @@ def delete_vendor(request, pk):
vendor = get_object_or_404(models.Vendor, pk=pk)
# vendor.active = False
vendor.delete()
messages.success(request, _("Vendor deleted successfully."))
messages.success(request, _("Vendor deleted successfully"))
return redirect("vendor_list")
#group
@ -1545,7 +1545,7 @@ class GroupCreateView(
form_class = forms.GroupForm
template_name = "groups/group_form.html"
success_url = reverse_lazy("group_list")
success_message = _("Group created successfully.")
success_message = _("Group created successfully")
def form_valid(self, form):
dealer = get_user_type(self.request)
@ -1566,7 +1566,7 @@ class GroupUpdateView(
form_class = forms.GroupForm
template_name = "groups/group_form.html"
success_url = reverse_lazy("group_list")
success_message = _("Group updated successfully.")
success_message = _("Group updated successfully")
def form_valid(self, form):
dealer = get_user_type(self.request)
@ -1580,7 +1580,7 @@ class GroupUpdateView(
def GroupDeleteview(request, pk):
group = get_object_or_404(models.CustomGroup, pk=pk)
group.delete()
messages.success(request, _("Group deleted successfully."))
messages.success(request, _("Group deleted successfully"))
return redirect("group_list")
@login_required
@ -1592,7 +1592,7 @@ def GroupPermissionView(request, pk):
permissions = request.POST.getlist("name")
for i in permissions:
group.add_permission(Permission.objects.get(id=int(i)))
messages.success(request, _("Permission added successfully."))
messages.success(request, _("Permission added successfully"))
return redirect("group_detail", pk=group.pk)
form = forms.PermissionForm(initial={"name": group.permissions})
return render(request,"groups/group_permission_form.html",{"group": group, "form": form})
@ -1610,7 +1610,7 @@ def UserGroupView(request, pk):
cg = models.CustomGroup.objects.get(id=int(i))
staff.add_group(cg.group)
messages.success(request, _("Group added successfully."))
messages.success(request, _("Group added successfully"))
return redirect("user_detail", pk=staff.pk)
form = forms.UserGroupForm(initial={"name": staff.groups})
@ -1645,7 +1645,7 @@ class UserCreateView(
form_class = forms.StaffForm
template_name = "users/user_form.html"
success_url = reverse_lazy("user_list")
success_message = _("User created successfully.")
success_message = _("User created successfully")
def form_valid(self, form):
dealer = get_user_type(self.request)
@ -1653,12 +1653,12 @@ class UserCreateView(
allowed_users = quota_dict.get("Users")
if allowed_users is None:
messages.error(self.request, _("The user quota for staff members is not defined. Please contact support."))
messages.error(self.request, _("The user quota for staff members is not defined. Please contact support"))
return self.form_invalid(form)
current_staff_count = dealer.staff.count()
if current_staff_count >= allowed_users:
messages.error(self.request, _("You have reached the maximum number of staff users allowed for your plan."))
messages.error(self.request, _("You have reached the maximum number of staff users allowed for your plan"))
return self.form_invalid(form)
email = form.cleaned_data["email"]
@ -1690,7 +1690,7 @@ class UserUpdateView(
form_class = forms.StaffForm
template_name = "users/user_form.html"
success_url = reverse_lazy("user_list")
success_message = _("User updated successfully.")
success_message = _("User updated successfully")
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
@ -1728,7 +1728,7 @@ def UserDeleteview(request, pk):
staff = get_object_or_404(models.Staff, pk=pk)
staff.staff_member.delete()
staff.delete()
messages.success(request, _("User deleted successfully."))
messages.success(request, _("User deleted successfully"))
return redirect("user_list")
@ -1757,7 +1757,7 @@ def OrganizationCreateView(request):
if request.method == "POST":
form = forms.OrganizationForm(request.POST)
if CustomerModel.objects.filter(email=request.POST["email"]).exists():
messages.error(request, _("An organization with this email already exists."))
messages.error(request, _("An organization with this email already exists"))
return redirect("organization_create")
organization_dict = {
@ -1784,7 +1784,7 @@ def OrganizationCreateView(request):
customer.additional_info.update({"customer_info": organization_dict})
customer.additional_info.update({"type": "organization"})
customer.save()
messages.success(request, _("Organization created successfully."))
messages.success(request, _("Organization created successfully"))
return redirect("organization_list")
else:
form = forms.OrganizationForm()
@ -1823,7 +1823,7 @@ def OrganizationUpdateView(request,pk):
instance.additional_info["customer_info"] = organization_dict
instance.additional_info["type"] = "organization"
instance.save()
messages.success(request, _("Organization created successfully."))
messages.success(request, _("Organization created successfully"))
return redirect("organization_list")
else:
form = forms.OrganizationForm(
@ -1844,7 +1844,7 @@ def OrganizationDeleteView(request, pk):
try:
User.objects.get(email=organization.email).delete()
organization.delete()
messages.success(request, _("Organization deleted successfully."))
messages.success(request, _("Organization deleted successfully"))
except Exception as e:
print("unable to delete user", e)
messages.error(request,_("Unable to delete organization"))
@ -1874,7 +1874,7 @@ class RepresentativeCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateVi
form_class = forms.RepresentativeForm
template_name = "representatives/representative_form.html"
success_url = reverse_lazy("representative_list")
success_message = "Representative created successfully."
success_message = _("Representative created successfully")
def form_valid(self, form):
if form.is_valid():
@ -1890,14 +1890,14 @@ class RepresentativeUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateVi
form_class = forms.RepresentativeForm
template_name = "representatives/representative_form.html"
success_url = reverse_lazy("representative_list")
success_message = "Representative updated successfully."
success_message = _("Representative updated successfully")
class RepresentativeDeleteView(LoginRequiredMixin, SuccessMessageMixin, DeleteView):
model = models.Representative
template_name = "representatives/representative_confirm_delete.html"
success_url = reverse_lazy("representative_list")
success_message = "Representative deleted successfully."
success_message = _("Representative deleted successfully")
# BANK ACCOUNT
@ -1920,7 +1920,7 @@ class BankAccountCreateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessM
form_class = BankAccountCreateForm
template_name = "ledger/bank_accounts/bank_account_form.html"
success_url = reverse_lazy("bank_account_list")
success_message = "Bank account created successfully."
success_message = _("Bank account created successfully")
permission_required = ['inventory.view_carfinance']
def form_valid(self, form):
@ -1949,7 +1949,7 @@ class BankAccountUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessM
form_class = BankAccountUpdateForm
template_name = "ledger/bank_accounts/bank_account_form.html"
success_url = reverse_lazy("bank_account_list")
success_message = "Bank account updated successfully."
success_message = _("Bank account updated successfully")
permission_required = ['inventory.view_carfinance']
def get_form_kwargs(self):
@ -1966,7 +1966,7 @@ def bank_account_delete(request, pk):
bank_account = get_object_or_404(BankAccountModel, pk=pk)
if request.method == "POST":
bank_account.delete()
messages.success(request, "Bank account deleted successfully.")
messages.success(request, _("Bank account deleted successfully"))
return redirect("bank_account_list")
return render(
request,
@ -1995,7 +1995,7 @@ class AccountCreateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessMessa
form_class = AccountModelCreateForm
template_name = "ledger/coa_accounts/account_form.html"
success_url = reverse_lazy("account_list")
success_message = "Account created successfully."
success_message = _("Account created successfully")
permission_required = ['inventory.view_carfinance']
def form_valid(self, form):
@ -2062,7 +2062,7 @@ class AccountUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessMessa
form_class = AccountModelUpdateForm
template_name = "ledger/coa_accounts/account_form.html"
success_url = reverse_lazy("account_list")
success_message = "Account updated successfully."
success_message = _("Account updated successfully")
permission_required = ['inventory.view_carfinance']
def get_form(self, form_class=None):
@ -2078,7 +2078,7 @@ def account_delete(request, pk):
account = get_object_or_404(AccountModel, pk=pk)
account.delete()
messages.success(request, "Account deleted successfully.")
messages.success(request, _("Account deleted successfully"))
return redirect("account_list")
@ -2135,30 +2135,30 @@ def create_estimate(request,pk=None):
if not all([items, quantities]):
return JsonResponse(
{"status": "error", "message": "Items and Quantities are required"},
{"status": "error", "message": _("Items and Quantities are required")},
status=400,
)
if isinstance(quantities, list):
if "0" in quantities:
return JsonResponse(
{"status": "error", "message": "Quantity must be greater than zero"}
{"status": "error", "message": _("Quantity must be greater than zero")}
)
else:
if int(quantities) <= 0:
return JsonResponse(
{"status": "error", "message": "Quantity must be greater than zero"}
{"status": "error", "message": _("Quantity must be greater than zero")}
)
if isinstance(items, list):
for item, quantity in zip(items, quantities):
if int(quantity) > models.Car.objects.filter(hash=item,status='available').count():
return JsonResponse(
{"status": "error", "message": "Quantity must be less than or equal to the number of cars in stock"},
{"status": "error", "message": _("Quantity must be less than or equal to the number of cars in stock")},
)
else:
if int(quantities) > models.Car.objects.filter(hash=items,status='available').count():
return JsonResponse(
{"status": "error", "message": "Quantity must be less than or equal to the number of cars in stock"},
{"status": "error", "message": _("Quantity must be less than or equal to the number of cars in stock")},
)
estimate = entity.create_estimate(
estimate_title=title, customer_model=customer, contract_terms=terms
@ -2240,7 +2240,7 @@ def create_estimate(request,pk=None):
return JsonResponse(
{
"status": "success",
"message": "Quotation created successfully!",
"message": _("Quotation created successfully"),
"url": f"{url}",
}
)
@ -2255,8 +2255,8 @@ def create_estimate(request,pk=None):
customer = opportunity.customer
form.initial['customer'] = customer
car_list = models.Car.objects.filter(dealer=dealer,colors__isnull=False,finances__isnull=False,status="available").annotate(color=F('colors__exterior__rgb'),color_name=F('colors__exterior__name')).values_list(
'id_car_make__name', 'id_car_model__name','id_car_serie__name','id_car_trim__name','color','color_name','hash').annotate(hash_count=Count('hash')).distinct()
car_list = models.Car.objects.filter(dealer=dealer,colors__isnull=False,finances__isnull=False,status="available").annotate(color=F('colors__exterior__rgb'),color_name=F('colors__exterior__arabic_name')).values_list(
'id_car_make__arabic_name', 'id_car_model__arabic_name','id_car_serie__arabic_name','id_car_trim__arabic_name','color','color_name','hash').annotate(hash_count=Count('hash')).distinct()
context = {
"form": form,
"items": [
@ -2392,29 +2392,29 @@ def estimate_mark_as(request, pk):
if mark:
if mark == "review":
if not estimate.can_review():
messages.error(request, _("Estimate is not ready for review"))
messages.error(request, _("Quotation is not ready for review"))
return redirect("estimate_detail", pk=estimate.pk)
estimate.mark_as_review()
elif mark == "approved":
if not estimate.can_approve():
messages.error(request, _("Estimate is not ready for approval"))
messages.error(request, _("Quotation is not ready for approval"))
return redirect("estimate_detail", pk=estimate.pk)
estimate.mark_as_approved()
messages.success(request, _("Estimate approved successfully."))
messages.success(request, _("Quotation approved successfully"))
elif mark == "rejected":
if not estimate.can_cancel():
messages.error(request, _("Estimate is not ready for rejection"))
messages.error(request, _("Quotation is not ready for rejection"))
return redirect("estimate_detail", pk=estimate.pk)
estimate.mark_as_canceled()
messages.success(request, _("Estimate canceled successfully."))
messages.success(request, _("Quotation canceled successfully"))
elif mark == "completed":
if not estimate.can_complete():
messages.error(request, _("Estimate is not ready for completion"))
messages.error(request, _("Quotation is not ready for completion"))
return redirect("estimate_detail", pk=estimate.pk)
elif mark == "canceled":
if not estimate.can_cancel():
messages.error(request, _("Estimate is not ready for cancelation"))
messages.error(request, _("Quotation is not ready for cancellation"))
return redirect("estimate_detail", pk=estimate.pk)
estimate.mark_as_canceled()
try:
@ -2423,9 +2423,9 @@ def estimate_mark_as(request, pk):
car.save()
except Exception as e:
pass
messages.success(request, _("Estimate canceled successfully."))
messages.success(request, _("Quotation canceled successfully"))
estimate.save()
messages.success(request, "Estimate marked as " + mark.upper())
messages.success(request, _("Quotation marked as ") + mark.upper())
return redirect("estimate_detail", pk=estimate.pk)
@ -2585,7 +2585,7 @@ def invoice_create(request, pk):
estimate.mark_as_completed()
estimate.save()
invoice.save()
messages.success(request, "Invoice created successfully!")
messages.success(request, "Invoice created successfully")
return redirect("invoice_detail", pk=invoice.pk)
else:
print(form.errors)
@ -2649,10 +2649,10 @@ def PaymentCreateView(request, pk):
if not model.is_approved():
model.mark_as_approved(user_model=entity.admin)
if model.amount_paid == model.amount_due:
messages.error(request,"fully paid")
messages.error(request,_("fully paid"))
return redirect(redirect_url, pk=model.pk)
if model.amount_paid + amount > model.amount_due:
messages.error(request,"Amount exceeds due amount")
messages.error(request,_("Amount exceeds due amount"))
return redirect(redirect_url, pk=model.pk)
try:
@ -2660,7 +2660,7 @@ def PaymentCreateView(request, pk):
set_invoice_payment(dealer, entity, invoice, amount, payment_method)
elif bill:
set_bill_payment(dealer, entity, bill, amount, payment_method)
messages.success(request, "Payment created successfully!")
messages.success(request, _("Payment created successfully"))
return redirect(redirect_url, pk=model.pk)
except Exception as e:
messages.error(request, f"Error creating payment: {str(e)}")
@ -2724,11 +2724,11 @@ def payment_mark_as_paid(request, pk):
invoice.ledger.post()
invoice.ledger.save()
messages.success(request, "Payment created successfully!")
messages.success(request, _("Payment created successfully"))
else:
messages.error(
request,
"Invoice is not fully paid. Payment cannot be marked as paid.",
_("Invoice is not fully paid, Payment cannot be marked as paid"),
)
except Exception as e:
messages.error(request, f"Error: {str(e)}")
@ -2853,7 +2853,7 @@ def lead_create(request):
# except Exception as e:
# print(e)
instance.save()
messages.success(request, "Lead created successfully!")
messages.success(request, _("Lead created successfully"))
return redirect("lead_list")
except Exception as e:
messages.error(request, f"Lead was not created ... : {str(e)}")
@ -2884,7 +2884,7 @@ def LeadDeleteView(request,pk):
except Exception as e:
print(e)
lead.delete()
messages.success(request, "Lead deleted successfully!")
messages.success(request, _("Lead deleted successfully"))
return redirect("lead_list")
@ -2899,7 +2899,7 @@ def add_note_to_lead(request, pk):
note.content_object = lead
note.created_by = request.user
note.save()
messages.success(request, "Note added successfully!")
messages.success(request, _("Note added successfully"))
return redirect("lead_detail", pk=lead.pk)
else:
form = forms.NoteForm()
@ -2912,10 +2912,10 @@ def add_note_to_opportunity(request, pk):
if request.method == "POST":
notes = request.POST.get("notes")
if not notes:
messages.error(request, "Notes field is required.")
messages.error(request, _("Notes field is required"))
else:
models.Notes.objects.create(content_object=opportunity, created_by=request.user,note=notes)
messages.success(request, "Note added successfully!")
messages.success(request, _("Note added successfully"))
return redirect("opportunity_detail", pk=opportunity.pk)
@ -2932,7 +2932,7 @@ def update_note(request, pk):
updated_note.content_object = note.content_object
updated_note.created_by = request.user
updated_note.save()
messages.success(request, "Note updated successfully!")
messages.success(request, _("Note updated successfully"))
return redirect("lead_detail", pk=lead_pk)
else:
form = forms.NoteForm(instance=note)
@ -2946,7 +2946,7 @@ def delete_note(request, pk):
note = get_object_or_404(models.Notes, pk=pk, created_by=request.user)
lead_pk = note.content_object.pk
note.delete()
messages.success(request, _("Note deleted successfully."))
messages.success(request, _("Note deleted successfully"))
return redirect("lead_detail", pk=lead_pk)
@ -2956,18 +2956,18 @@ def lead_convert(request, pk):
lead = get_object_or_404(models.Lead, pk=pk)
dealer = get_user_type(request)
if hasattr(lead, "opportunity"):
messages.error(request, "Lead is already converted to customer.")
messages.error(request, _("Lead is already converted to customer"))
else:
customer = lead.convert_to_customer(dealer.entity,lead)
models.Opportunity.objects.create(dealer=dealer,customer=customer,lead=lead,probability=50,stage=models.Stage.PROSPECT,staff=lead.staff,status=models.Status.QUALIFIED)
messages.success(request, "Lead converted to customer successfully!")
messages.success(request, _("Lead converted to customer successfully"))
return redirect("lead_list")
@login_required
@permission_required('inventory.add_appointmentrequest',raise_exception=True)
def schedule_lead(request, pk):
if not request.is_staff:
messages.error(request, "You do not have permission to schedule lead.")
messages.error(request, _("You do not have permission to schedule lead"))
return redirect("lead_list")
dealer = get_user_type(request)
lead = get_object_or_404(models.Lead, pk=pk, dealer=dealer)
@ -2982,7 +2982,7 @@ def schedule_lead(request, pk):
# Create AppointmentRequest
service = Service.objects.filter(name=instance.scheduled_type).first()
if not service:
messages.error(request, "Service not found!")
messages.error(request, _("Service not found"))
return redirect("lead_list")
try:
@ -3007,7 +3007,7 @@ def schedule_lead(request, pk):
)
instance.save()
messages.success(request, "Lead scheduled and appointment created successfully!")
messages.success(request, _("Lead scheduled and appointment created successfully"))
return redirect("lead_list")
else:
messages.error(request, f"Invalid form data: {str(form.errors)}")
@ -3026,7 +3026,7 @@ def lead_transfer(request,pk):
if form.is_valid():
lead.staff = form.cleaned_data["transfer_to"]
lead.save()
messages.success(request, "Lead transferred successfully!")
messages.success(request, _("Lead transferred successfully"))
else:
messages.error(request, f"Invalid form data: {str(form.errors)}")
return redirect("lead_list")
@ -3040,7 +3040,7 @@ def send_lead_email(request, pk,email_pk=None):
if status == 'draft':
models.Email.objects.create(content_object=lead, created_by=request.user,from_email="manager@tenhal.com", to_email=request.GET.get("to"), subject=request.GET.get("subject"), message=request.GET.get("message"),status=models.EmailStatus.DRAFT)
models.Activity.objects.create(dealer=dealer,content_object=lead, notes="Email Draft",created_by=request.user,activity_type=models.ActionChoices.EMAIL)
messages.success(request, _("Email Draft successfully!"))
messages.success(request, _("Email Draft successfully"))
response = HttpResponse(redirect("lead_detail", pk=lead.pk))
response['HX-Redirect'] = reverse('lead_detail', args=[lead.pk])
return response
@ -3065,7 +3065,7 @@ def send_lead_email(request, pk,email_pk=None):
)
dealer = get_user_type(request)
models.Activity.objects.create(dealer=dealer,content_object=lead, notes="Email sent",created_by=request.user,activity_type=models.ActionChoices.EMAIL)
messages.success(request, _("Email sent successfully!"))
messages.success(request, _("Email sent successfully"))
return redirect("lead_list")
msg = f"""
السلام عليكم
@ -3191,7 +3191,7 @@ class OpportunityListView(LoginRequiredMixin,ListView):
def delete_opportunity(request, pk):
opportunity = get_object_or_404(models.Opportunity, pk=pk)
opportunity.delete()
messages.success(request, _("Opportunity deleted successfully."))
messages.success(request, _("Opportunity deleted successfully"))
return redirect("opportunity_list")
@login_required
@ -3204,7 +3204,7 @@ def opportunity_update_status(request,pk):
if stage:
opportunity.stage = stage
opportunity.save()
messages.success(request,"Opportunity status updated successfully")
messages.success(request,_("Opportunity status updated successfully"))
response = HttpResponse(redirect("opportunity_detail",pk=opportunity.pk))
response['HX-Refresh'] = 'true'
return response
@ -3226,7 +3226,7 @@ def mark_notification_as_read(request, pk):
notification = get_object_or_404(models.Notification, pk=pk, user=request.user)
notification.is_read = True
notification.save()
messages.success(request, _("Notification marked as read."))
messages.success(request, _("Notification marked as read"))
return redirect("notifications_history")
@ -3244,7 +3244,7 @@ class ItemServiceCreateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessM
form_class = forms.AdditionalServiceForm
template_name = "items/service/service_create.html"
success_url = reverse_lazy("item_service_list")
success_message = _("Service created successfully.")
success_message = _("Service created successfully")
context_object_name = "service"
permission_required = ["django_ledger.add_itemmodel"]
@ -3262,7 +3262,7 @@ class ItemServiceUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessM
form_class = forms.AdditionalServiceForm
template_name = "items/service/service_create.html"
success_url = reverse_lazy("item_service_list")
success_message = _("Service updated successfully.")
success_message = _("Service updated successfully")
context_object_name = "service"
permission_required = ["django_ledger.change_itemmodel"]
@ -3385,7 +3385,7 @@ class InReviewBillView(LoginRequiredMixin,PermissionRequiredMixin, UpdateView):
form_class = InReviewBillModelUpdateForm
template_name = "ledger/bills/bill_update_form.html"
success_url = reverse_lazy("bill_list")
success_message = _("Bill updated successfully.")
success_message = _("Bill updated successfully")
context_object_name = "bill"
permission_required = ["django_ledger.change_billmodel"]
@ -3411,7 +3411,7 @@ class ApprovedBillModelView(LoginRequiredMixin,PermissionRequiredMixin, UpdateVi
form_class = ApprovedBillModelUpdateForm
template_name = "ledger/bills/bill_update_form.html"
success_url = reverse_lazy("bill_list")
success_message = _("Bill updated successfully.")
success_message = _("Bill updated successfully")
context_object_name = "bill"
permission_required = ["django_ledger.change_billmodel"]
@ -3440,11 +3440,11 @@ def bill_mark_as_approved(request, pk):
if request.method == "POST":
dealer = get_user_type(request)
if bill.is_approved():
messages.error(request, _("Bill is already approved."))
messages.error(request, _("Bill is already approved"))
return redirect("bill_detail", pk=bill.pk)
bill.mark_as_approved(user_model=dealer.entity.admin)
bill.save()
messages.success(request, _("Bill marked as approved successfully."))
messages.success(request, _("Bill marked as approved successfully"))
return redirect("bill_detail", pk=bill.pk)
@ -3455,7 +3455,7 @@ def bill_mark_as_paid(request, pk):
if request.method == "POST":
dealer = get_user_type(request)
if bill.is_paid():
messages.error(request, _("Bill is already paid."))
messages.error(request, _("Bill is already paid"))
return redirect("bill_detail", pk=bill.pk)
if bill.amount_due == bill.amount_paid:
bill.mark_as_paid(user_model=dealer.entity.admin)
@ -3464,9 +3464,9 @@ def bill_mark_as_paid(request, pk):
bill.ledger.post_journal_entries()
bill.ledger.post()
bill.ledger.save()
messages.success(request, _("Bill marked as paid successfully."))
messages.success(request, _("Bill marked as paid successfully"))
else:
messages.error(request, _("Amount paid is not equal to amount due."))
messages.error(request, _("Amount paid is not equal to amount due"))
return redirect("bill_detail", pk=bill.pk)
@login_required
@ -3486,18 +3486,18 @@ def bill_create(request):
if not all([items, quantities]):
return JsonResponse(
{"status": "error", "message": "Items and Quantities are required"},
{"status": "error", "message": _("Items and Quantities are required")},
status=400,
)
if isinstance(quantities, list):
if "0" in quantities:
return JsonResponse(
{"status": "error", "message": "Quantity must be greater than zero"}
{"status": "error", "message": _("Quantity must be greater than zero")}
)
else:
if int(quantities) <= 0:
return JsonResponse(
{"status": "error", "message": "Quantity must be greater than zero"}
{"status": "error", "message": _("Quantity must be greater than zero")}
)
bill = entity.create_bill(vendor_model=vendor, terms=terms)
@ -3558,7 +3558,7 @@ def bill_create(request):
return JsonResponse(
{
"status": "success",
"message": "Bill created successfully!",
"message": _("Bill created successfully"),
"url": f"{url}",
}
)
@ -3649,7 +3649,7 @@ def send_email_view(request, pk):
)
estimate.mark_as_review()
messages.success(request, _("Email sent successfully!"))
messages.success(request, _("Email sent successfully"))
return redirect("estimate_detail", pk=estimate.pk)
@ -3893,7 +3893,7 @@ class PayableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View):
})
return JsonResponse({
'message': 'Unauthorized'
'message': _('Unauthorized')
}, status=401)
@ -3919,7 +3919,7 @@ class ReceivableNetAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View):
})
return JsonResponse({
'message': 'Unauthorized'
'message': _('Unauthorized')
}, status=401)
@ -3968,7 +3968,7 @@ class PnLAPIView(DjangoLedgerSecurityMixIn, EntityUnitMixIn, View):
})
return JsonResponse({
'message': 'Unauthorized'
'message': _('Unauthorized')
}, status=401)
@ -4021,7 +4021,7 @@ def DealerSettingsView(request,pk):
instance = form.save(commit=False)
instance.dealer = dealer
instance.save()
messages.success(request, 'Settings updated')
messages.success(request, _('Settings updated'))
return redirect('dealer_detail', pk=dealer.pk)
else:
print(form.errors)
@ -4134,7 +4134,7 @@ class JournalEntryCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView)
template_name = "ledger/journal_entry/journal_entry_form.html"
form_class = forms.JournalEntryModelCreateForm
ledger_model = None
success_message = "Journal Entry created"
success_message = _("Journal Entry created")
def get_form(self, form_class=None):
dealer = get_user_type(self.request)
@ -4160,7 +4160,7 @@ def JournalEntryDeleteView(request,pk):
journal_entry = get_object_or_404(JournalEntryModel, pk=pk)
ledger = journal_entry.ledger
if not journal_entry.can_delete():
messages.error(request, 'Journal Entry cannot be deleted')
messages.error(request, _('Journal Entry cannot be deleted'))
return redirect("journalentry_list", pk=ledger.pk)
journal_entry.delete()
messages.success(request, 'Journal Entry deleted')
@ -4187,7 +4187,7 @@ class JournalEntryModelTXSDetailView(JournalEntryModelTXSDetailViewBase):
def ledger_lock_all_journals(request,entity_slug,pk):
ledger = LedgerModel.objects.filter(pk=pk).first()
if ledger.is_locked():
messages.error(request, "Ledger is already locked.")
messages.error(request, _("Ledger is already locked"))
return redirect("journalentry_list", pk=ledger.pk)
ledger.lock_journal_entries()
ledger.lock()
@ -4197,7 +4197,7 @@ def ledger_lock_all_journals(request,entity_slug,pk):
def ledger_unlock_all_journals(request,entity_slug,pk):
ledger = LedgerModel.objects.filter(pk=pk).first()
if not ledger.is_locked():
messages.error(request, "Ledger is already Unlocked.")
messages.error(request, _("Ledger is already Unlocked"))
return redirect("journalentry_list", pk=ledger.pk)
ledger.unlock()
@ -4211,7 +4211,7 @@ def ledger_unlock_all_journals(request,entity_slug,pk):
def ledger_post_all_journals(request,entity_slug,pk):
ledger = LedgerModel.objects.filter(pk=pk).first()
if ledger.is_posted():
messages.error(request, "Ledger is already posted.")
messages.error(request, _("Ledger is already posted"))
return redirect("journalentry_list", pk=ledger.pk)
ledger.post_journal_entries()
ledger.post()
@ -4221,7 +4221,7 @@ def ledger_post_all_journals(request,entity_slug,pk):
def ledger_unpost_all_journals(request,entity_slug,pk):
ledger = LedgerModel.objects.filter(pk=pk).first()
if not ledger.is_posted():
messages.error(request, "Ledger is already Unposted.")
messages.error(request, _("Ledger is already Unposted"))
return redirect("journalentry_list", pk=ledger.pk)
qs = ledger.journal_entries.posted()
for je in qs:

File diff suppressed because it is too large Load Diff