Merge branch 'main' of http://10.10.1.136:3000/ismail/haikal into frontend

This commit is contained in:
Faheedkhan 2025-06-30 12:46:54 +03:00
commit 4cc10b48c1
7 changed files with 73 additions and 109 deletions

View File

@ -135,10 +135,15 @@ class StaffForm(forms.ModelForm):
),
label=_("Phone Number"),
)
group = forms.ModelMultipleChoiceField(
label=_("Group"),
widget=forms.CheckboxSelectMultiple(attrs={"class": "form-check-input"}),
queryset=CustomGroup.objects.all(),
required=True,
)
class Meta:
model = Staff
fields = ["name", "arabic_name", "phone_number", "staff_type"]
fields = ["name", "arabic_name", "phone_number", "group"]
# Dealer Form

View File

@ -1188,31 +1188,33 @@ class Staff(models.Model, LocalizedNameMixin):
return [x.customgroup for x in self.user.groups.all()]
def clear_groups(self):
EntityManagementModel.objects.filter(
user=self.user, entity=self.dealer.entity
).delete()
self.remove_superuser_permission()
return self.user.groups.clear()
def add_group(self, group):
def add_group(self, group,clean=False):
if clean:
self.clear_groups()
try:
self.user.groups.add(group)
if self.staff_type in ["accountant", "manager"]:
self.add_as_manager()
if "accountant" in group.name.lower() or "manager" in group.name.lower():
self.add_as_superuser()
except Exception as e:
print(e)
def add_as_manager(self):
if self.staff_type in ["accountant", "manager"]:
EntityManagementModel.objects.get_or_create(
user=self.user, entity=self.dealer.entity
)
else:
self.user.groups.clear()
group = Group.objects.filter(
customgroup__name__iexact=self.staff_type
).first()
if group:
self.add_group(group)
def add_as_superuser(self):
EntityManagementModel.objects.get_or_create(
user=self.user, entity=self.dealer.entity
)
def remove_superuser_permission(self):
EntityManagementModel.objects.filter(
user=self.user, entity=self.dealer.entity
).delete()
# self.user.groups.clear()
# group = Group.objects.filter(
# customgroup__name__iexact=self.staff_type
# ).first()
# if group:
# self.add_group(group)
class Meta:
verbose_name = _("Staff")
@ -2519,7 +2521,7 @@ class CustomGroup(models.Model):
@property
def entity(self):
return self.invoice.entity
return self.dealer.entity
@property
def users(self):

View File

@ -913,7 +913,6 @@ urlpatterns = [
name="bill-action-force-migrate",
),
# path("items/bills/create/", views.bill_create, name="bill_create"),
# >>>>>>>>>>>>>>>>>>>>>>...
path(
"items/bills/<uuid:pk>/bill_detail/",
views.BillDetailView.as_view(),

View File

@ -318,6 +318,7 @@ def dealer_signup(request):
if password != password_confirm:
return JsonResponse({"error": _("Passwords do not match")}, status=400)
try:
#TODO make this a django-q task
create_user_dealer(
email, password, name, arabic_name, phone, crn, vrn, address
)
@ -2666,20 +2667,26 @@ class GroupCreateView(
success_message = _("Group created successfully")
def form_valid(self, form):
dealer = get_user_type(self.request)
dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"])
instance = form.save(commit=False)
group_name = f"{dealer.slug}_{instance.name}"
group,created = Group.objects.get_or_create(name=group_name)
try:
group, created = Group.objects.get_or_create(name=group_name)
instance.dealer = dealer
instance.group = group
instance.save()
except IntegrityError as e:
from django.utils.translation import gettext_lazy as _
print(e)
messages.error(self.request, _("Group name already exists"))
return redirect("group_create", dealer_slug=dealer.slug)
if created:
group_manager, created = models.CustomGroup.objects.get_or_create(
name=group_name, dealer=dealer, group=group
group_manager, _ = models.CustomGroup.objects.get_or_create(
name=instance.name, dealer=dealer, group=group
)
group_manager.set_default_permissions()
dealer.user.groups.add(group)
else:
instance.dealer = dealer
instance.group = group
instance.save()
return super().form_valid(form)
def get_success_url(self):
@ -2915,6 +2922,12 @@ class UserCreateView(
success_url = reverse_lazy("user_list")
success_message = _("User created successfully")
def get_form(self, form_class=None):
form = super().get_form(form_class)
dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"])
form.fields["group"].queryset = models.CustomGroup.objects.filter(dealer=dealer)
return form
def form_valid(self, form):
dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"])
# quota_dict = get_user_quota(dealer.user)
@ -2956,11 +2969,9 @@ class UserCreateView(
staff = form.save(commit=False)
staff.staff_member = staff_member
staff.dealer = dealer
staff.add_as_manager()
group = models.CustomGroup.objects.filter(dealer=dealer,name__iexact=staff.staff_type).first()
staff.save()
if group:
staff.add_group(group.group)
for customgroup in form.cleaned_data["group"]:
staff.add_group(customgroup.group)
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy("user_list", args=[self.request.dealer.slug])
@ -3004,30 +3015,32 @@ class UserUpdateView(
def get_form(self, form_class=None):
form = super().get_form(form_class)
dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"])
form.fields["group"].queryset = models.CustomGroup.objects.filter(dealer=dealer)
form.fields["email"].disabled = True
return form
def get_initial(self):
initial = super().get_initial()
initial["email"] = self.object.staff_member.user.email
initial["service_offered"] = self.object.staff_member.services_offered.all()
initial["group"] = self.object.groups
return initial
def form_valid(self, form):
services = form.cleaned_data["service_offered"]
if not services:
self.object.staff_member.services_offered.clear()
else:
for service in services:
self.object.staff_member.services_offered.add(service)
# services = form.cleaned_data["service_offered"]
# if not services:
# self.object.staff_member.services_offered.clear()
# else:
# for service in services:
# self.object.staff_member.services_offered.add(service)
staff = form.save(commit=False)
staff.name = form.cleaned_data["name"]
staff.arabic_name = form.cleaned_data["arabic_name"]
staff.phone_number = form.cleaned_data["phone_number"]
staff.staff_type = form.cleaned_data["staff_type"]
staff.add_as_manager()
for customgroup in form.cleaned_data["group"]:
staff.add_group(customgroup.group,True)
staff.save()
return super().form_valid(form)
def get_success_url(self):

View File

@ -81,10 +81,6 @@
{{ _("Sale Order")}} #{{ saleorder.formatted_order_id }}
</h1>
<div>
<<<<<<< HEAD
=======
>>>>>>> e9e2fd3 (add bulk insert + po item insert)
<button class="btn btn-sm btn-outline-light me-2">
<i class="fas fa-print me-1"></i> {{ _("Print") }}
</button>
@ -275,18 +271,10 @@
<!-- Documents Card -->
<div class="card mb-4 shadow-sm">
<div class="card-header d-flex justify-content-between align-items-center">
<<<<<<< HEAD
<h5 class="mb-0">{{ _("Documents") }}</h5>
<button class="btn btn-sm btn-primary">
<i class="fas fa-plus me-1"></i> {{ _("Add Document")}}
=======
<h5 class="mb-0">{{ _("Documents") }}</h5>
<button class="btn btn-sm btn-primary">
<i class="fas fa-plus me-1"></i> {{ _("Add Document")}}
>>>>>>> e9e2fd3 (add bulk insert + po item insert)
</button>
</button>
</div>
<div class="card-body">
<div class="file-upload mb-3">
@ -330,13 +318,7 @@
<div class="mb-3">
<textarea class="form-control" name="comment" rows="3" placeholder="Add a comment or note..." required></textarea>
<div class="d-flex justify-content-end mt-2">
<<<<<<< HEAD
<button type="submit" class="btn btn-primary btn-sm">{{ _("Post Comment")}}</button>
=======
<button type="submit" class="btn btn-primary btn-sm">{{ _("Post Comment")}}</button>
>>>>>>> e9e2fd3 (add bulk insert + po item insert)
</div>
</div>
</form>
@ -379,52 +361,27 @@
{% endif %}
{% comment %} <a href="{% url 'edit_sale_order' saleorder.pk %}" class="btn btn-primary"> {% endcomment %}
<<<<<<< HEAD
=======
>>>>>>> e9e2fd3 (add bulk insert + po item insert)
<a href="" class="btn btn-primary">
<i class="fas fa-edit me-2"></i> {{ _("Edit Order")}}
</a>
{% if not saleorder.invoice %}
{% comment %} <a href="{% url 'create_invoice_from_order' saleorder.pk %}" class="btn btn-info"> {% endcomment %}
<<<<<<< HEAD
<a href="" class="btn btn-info">
<i class="fas fa-file-invoice-dollar me-2"></i> {{ _("Create Invoice")}}
=======
<a href="" class="btn btn-info">
<i class="fas fa-file-invoice-dollar me-2"></i> {{ _("Create Invoice")}}
>>>>>>> e9e2fd3 (add bulk insert + po item insert)
</a>
</a>
{% endif %}
{% if saleorder.status == 'approved' and not saleorder.actual_delivery_date %}
<<<<<<< HEAD
<button class="btn btn-warning" data-bs-toggle="modal" data-bs-target="#deliveryModal">
<i class="fas fa-truck me-2"></i> {{ _("Schedule Delivery")}}
=======
<button class="btn btn-warning" data-bs-toggle="modal" data-bs-target="#deliveryModal">
<i class="fas fa-truck me-2"></i> {{ _("Schedule Delivery")}}
>>>>>>> e9e2fd3 (add bulk insert + po item insert)
</button>
</button>
{% endif %}
{% if saleorder.status != 'cancelled' %}
<<<<<<< HEAD
<button class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#cancelModal">
<i class="fas fa-times-circle me-2"></i> {{ _("Cancel Order")}}
=======
<button class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#cancelModal">
<i class="fas fa-times-circle me-2"></i> {{ _("Cancel Order")}}
>>>>>>> e9e2fd3 (add bulk insert + po item insert)
</button>
</button>
{% endif %}
</div>
</div>
@ -575,15 +532,8 @@
</div>
</div>
<div class="modal-footer">
<<<<<<< HEAD
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{ _("Close") }}</button>
<button type="submit" class="btn btn-danger">{{ _("Confirm Cancellation")}}</button>
=======
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{ _("Close") }}</button>
<button type="submit" class="btn btn-danger">{{ _("Confirm Cancellation")}}</button>
>>>>>>> e9e2fd3 (add bulk insert + po item insert)
</div>
</form>
</div>
@ -612,15 +562,8 @@
</div>
</div>
<div class="modal-footer">
<<<<<<< HEAD
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{ _("Close") }}</button>
<button type="submit" class="btn btn-primary">{{ _("Schedule Delivery")}}</button>
=======
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{ _("Close") }}</button>
<button type="submit" class="btn btn-primary">{{ _("Schedule Delivery")}}</button>
>>>>>>> e9e2fd3 (add bulk insert + po item insert)
</div>
</form>
</div>

View File

@ -39,8 +39,7 @@
{{ form.arabic_name|as_crispy_field }}
{{ form.email|as_crispy_field }}
{{ form.phone_number|as_crispy_field }}
{{ form.staff_type|as_crispy_field }}
{{ form.service_offered|as_crispy_field }}
{{ form.group|as_crispy_field }}
{% for error in form.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
@ -55,4 +54,5 @@
</div>
</div>
</div>
{% endblock %}
{% endblock %}

View File

@ -47,7 +47,9 @@
<td class="align-middle white-space-nowrap align-items-center">{{ user.email }}</td>
<td class="align-middle white-space-nowrap align-items-center justify-content-center">{{ user.phone_number }}</td>
<td>
<span class="badge badge-sm bg-primary text-center"><i class="fa-solid fa-scroll"></i> {% trans user.staff_type|title %}</span>
{% for group in user.groups %}
<span class="badge badge-sm bg-primary text-center"><i class="fa-solid fa-scroll"></i> {% trans group.name|title %}</span>
{% endfor %}
</td>
<td class="align-middle white-space-nowrap">