fix the uploaded

This commit is contained in:
ismail 2025-06-26 17:59:13 +03:00
parent 3f85df0124
commit f49c63da95
5 changed files with 54 additions and 51 deletions

View File

@ -97,7 +97,7 @@ class InjectDealerMiddleware:
request.is_staff = False request.is_staff = False
if hasattr(request.user, "dealer"): if hasattr(request.user, "dealer"):
request.is_dealer = True request.is_dealer = True
if hasattr(request.user, "staffmember"): elif hasattr(request.user, "staffmember"):
request.is_staff = True request.is_staff = True
except Exception: except Exception:
pass pass

View File

@ -31,6 +31,8 @@ from django_ledger.models import (
InvoiceModel, InvoiceModel,
AccountModel, AccountModel,
EntityManagementModel, EntityManagementModel,
PurchaseOrderModel,
ItemTransactionModel,
) )
from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
@ -2835,3 +2837,18 @@ class PaymentHistory(models.Model):
###################################################################################################### ######################################################################################################
###################################################################################################### ######################################################################################################
###################################################################################################### ######################################################################################################
class PoItemsUploaded(models.Model):
dealer = models.ForeignKey(Dealer, on_delete=models.CASCADE, null=True, blank=True)
po = models.ForeignKey(
PurchaseOrderModel, on_delete=models.CASCADE, null=True, blank=True, related_name="items"
)
item = models.ForeignKey(
ItemTransactionModel,
on_delete=models.CASCADE,
null=True,
blank=True,
related_name="po_items",
)
status = models.CharField(max_length=100, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

View File

@ -2916,21 +2916,22 @@ class UserCreateView(
return self.form_invalid(form) return self.form_invalid(form)
email = form.cleaned_data["email"] email = form.cleaned_data["email"]
password = "Tenhal@123" if User.objects.filter(email=email).exists():
try:
user = User.objects.create_user(
username=email, email=email, password=password
)
user.is_staff = True
user.save()
except IntegrityError as e:
messages.error( messages.error(
self.request, self.request,
_( _(
"A user with this email already exists. Please use a different email." "A user with this email already exists. Please use a different email."
), ),
) )
return redirect("user_create") return redirect("user_create", dealer_slug=dealer.slug)
password = "Tenhal@123"
user = User.objects.create_user(
username=email, email=email, password=password
)
user.is_staff = True
user.save()
staff_member = StaffMember.objects.create(user=user) staff_member = StaffMember.objects.create(user=user)
for service in form.cleaned_data["service_offered"]: for service in form.cleaned_data["service_offered"]:
staff_member.services_offered.add(service) staff_member.services_offered.add(service)
@ -9522,6 +9523,11 @@ class PurchaseOrderMarkAsApprovedView(BasePurchaseOrderActionActionView):
class PurchaseOrderMarkAsFulfilledView(BasePurchaseOrderActionActionView): class PurchaseOrderMarkAsFulfilledView(BasePurchaseOrderActionActionView):
action_name = "mark_as_fulfilled" action_name = "mark_as_fulfilled"
def get(self, request, dealer_slug, entity_slug, po_pk, *args, **kwargs):
po = get_object_or_404(PurchaseOrderModel, pk=po_pk)
for item in po.get_itemtxs_data()[0]:
models.PoItemsUploaded.objects.create(po=po, item=item, status="fulfilled")
return super().get(request, dealer_slug, entity_slug, po_pk, *args, **kwargs)
class PurchaseOrderMarkAsCanceledView(BasePurchaseOrderActionActionView): class PurchaseOrderMarkAsCanceledView(BasePurchaseOrderActionActionView):
action_name = "mark_as_canceled" action_name = "mark_as_canceled"
@ -9589,36 +9595,23 @@ class BillModelActionForceMigrateView(BaseBillActionView):
def view_items_inventory(request, dealer_slug, entity_slug, po_pk): def view_items_inventory(request, dealer_slug, entity_slug, po_pk):
dealer = get_object_or_404(models.Dealer, slug=dealer_slug) get_object_or_404(models.Dealer, slug=dealer_slug)
po = PurchaseOrderModel.objects.get(pk=po_pk) po = PurchaseOrderModel.objects.get(pk=po_pk)
items = po.get_itemtxs_data()[0] items = po.items.all()
items_per_page = 30
paginator = Paginator(items, items_per_page)
page_number = request.GET.get("page") return render(request,"purchase_orders/po_upload_cars.html",{"po": po, "items": items})
try:
page_obj = paginator.get_page(page_number)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
page_obj = paginator.get_page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
page_obj = paginator.get_page(paginator.num_pages)
return render(
request,
"purchase_orders/po_upload_cars.html",
{"po": po, "items": items, "page_obj": page_obj},
)
def upload_cars(request, dealer_slug, pk=None): def upload_cars(request, dealer_slug, pk=None):
item = None item = None
po_item = None
dealer = get_object_or_404(models.Dealer, slug=dealer_slug) dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
response = redirect("upload_cars", dealer_slug=dealer_slug) response = redirect("upload_cars", dealer_slug=dealer_slug)
if pk: if pk:
item = get_object_or_404(ItemTransactionModel, pk=pk) item = get_object_or_404(ItemTransactionModel, pk=pk)
po_item = models.PoItemsUploaded.objects.get(dealer=dealer, item=item)
response = redirect("upload_cars", dealer_slug=dealer_slug, pk=pk) response = redirect("upload_cars", dealer_slug=dealer_slug, pk=pk)
if item.item_model.additional_info.get("uploaded"): if po_item.status == "uploaded":
messages.add_message(request, messages.ERROR, "Item already uploaded.") messages.add_message(request, messages.ERROR, "Item already uploaded.")
return redirect( return redirect(
"view_items_inventory", "view_items_inventory",
@ -9632,7 +9625,6 @@ def upload_cars(request, dealer_slug, pk=None):
try: try:
if item: if item:
item = ItemTransactionModel.objects.get(pk=pk)
data = [x.strip() for x in item.item_model.name.split("||")] data = [x.strip() for x in item.item_model.name.split("||")]
make = models.CarMake.objects.filter(is_sa_import=True).get( make = models.CarMake.objects.filter(is_sa_import=True).get(
name=data[0] name=data[0]
@ -9712,9 +9704,9 @@ def upload_cars(request, dealer_slug, pk=None):
) )
car.add_colors(exterior=exterior, interior=interior) car.add_colors(exterior=exterior, interior=interior)
cars_created += 1 cars_created += 1
if item: if po_item:
item.item_model.additional_info["uploaded"] = True po_item.status = "uploaded"
item.item_model.save() po_item.save()
messages.success(request, f"Successfully imported {cars_created} cars") messages.success(request, f"Successfully imported {cars_created} cars")
return response return response

View File

@ -66,7 +66,11 @@
<button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button> <button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button>
<div class="dropdown-menu dropdown-menu-end py-2"> <div class="dropdown-menu dropdown-menu-end py-2">
<a href="{% url 'purchase_order_detail' request.dealer.slug po.pk %}" class="dropdown-item text-success-dark">{% trans 'Detail' %}</a> <a href="{% url 'purchase_order_detail' request.dealer.slug po.pk %}" class="dropdown-item text-success-dark">{% trans 'Detail' %}</a>
<a href="{% url 'view_items_inventory' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po.pk %}" class="dropdown-item text-success-dark">{% trans 'View Inventory Items' %}</a> {% if po.po_status == 'fulfilled' %}
<a href="{% url 'view_items_inventory' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po.pk %}" class="dropdown-item text-success-dark">{% trans 'View Inventory Items' %}</a>
{% else %}
<button class="dropdown-item text-warning-dark" disabled><span class="fas fa-exclamation-triangle me-1"></span> Fulfill the PO Before Viewing Inventory</button>
{% endif %}
</div> </div>
</div> </div>
</td> </td>

View File

@ -33,16 +33,16 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for item in items %} {% for i in items %}
<tr> <tr>
<th scope="row">{{ item.item_model }}</th> <th scope="row">{{ i.item.item_model }}</th>
<th scope="row">{{ item.po_quantity }}</th> <th scope="row">{{ i.item.po_quantity }}</th>
<th scope="row">{{ item.po_unit_cost }}</th> <th scope="row">{{ i.item.po_unit_cost }}</th>
<th scope="row"> <th scope="row">
{% if item.item_model.additional_info.uploaded %} {% if i.status == "uploaded" %}
<i data-feather="check-circle" class="text-success"></i> <i data-feather="check-circle" class="text-success"></i>
{% else %} {% else %}
<a href="{% url 'upload_cars' request.dealer.slug item.pk %}" class="btn btn-sm btn-phoenix-primary"> <a href="{% url 'upload_cars' request.dealer.slug i.item.pk %}" class="btn btn-sm btn-phoenix-primary">
<i data-feather="upload" class="me-2"></i>Upload Data <i data-feather="upload" class="me-2"></i>Upload Data
</a> </a>
{% endif %} {% endif %}
@ -52,15 +52,5 @@
</tbody> </tbody>
</table> </table>
</div> </div>
{% if page_obj.paginator.num_pages > 1 %}
<div class="d-flex justify-content-end mt-3">
<div class="d-flex">
{% include 'partials/pagination.html'%}
</div>
</div>
{% endif %}
<div> <div>
{% endblock content %} {% endblock content %}