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"), label=_("Phone Number"),
) )
group = forms.ModelMultipleChoiceField(
label=_("Group"),
widget=forms.CheckboxSelectMultiple(attrs={"class": "form-check-input"}),
queryset=CustomGroup.objects.all(),
required=True,
)
class Meta: class Meta:
model = Staff model = Staff
fields = ["name", "arabic_name", "phone_number", "staff_type"] fields = ["name", "arabic_name", "phone_number", "group"]
# Dealer Form # Dealer Form

View File

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

View File

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

View File

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

View File

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

View File

@ -39,8 +39,7 @@
{{ form.arabic_name|as_crispy_field }} {{ form.arabic_name|as_crispy_field }}
{{ form.email|as_crispy_field }} {{ form.email|as_crispy_field }}
{{ form.phone_number|as_crispy_field }} {{ form.phone_number|as_crispy_field }}
{{ form.staff_type|as_crispy_field }} {{ form.group|as_crispy_field }}
{{ form.service_offered|as_crispy_field }}
{% for error in form.errors %} {% for error in form.errors %}
<div class="text-danger">{{ error }}</div> <div class="text-danger">{{ error }}</div>
{% endfor %} {% endfor %}
@ -55,4 +54,5 @@
</div> </div>
</div> </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">{{ user.email }}</td>
<td class="align-middle white-space-nowrap align-items-center justify-content-center">{{ user.phone_number }}</td> <td class="align-middle white-space-nowrap align-items-center justify-content-center">{{ user.phone_number }}</td>
<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>
<td class="align-middle white-space-nowrap"> <td class="align-middle white-space-nowrap">