Merge branch 'main' of http://10.10.1.136:3000/ismail/haikal into frontend
This commit is contained in:
commit
4cc10b48c1
@ -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
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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(),
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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 %}
|
||||||
|
|
||||||
|
|||||||
@ -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">
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user