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

This commit is contained in:
Faheedkhan 2025-07-02 16:33:51 +03:00
commit 152eb15f90
3 changed files with 98 additions and 12 deletions

View File

@ -38,6 +38,7 @@ from django_ledger.models import (
)
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.core.serializers.json import DjangoJSONEncoder
from appointment.models import StaffMember
from plans.quota import get_user_quota
from plans.models import UserPlan
@ -2521,7 +2522,7 @@ class CustomGroup(models.Model):
@property
def users(self):
return self.group.user_set.all()
return self.group.user_set.exclude(email=self.dealer.user.email).all()
@property
def permissions(self):
@ -2862,4 +2863,58 @@ class PoItemsUploaded(models.Model):
)
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)
updated_at = models.DateTimeField(auto_now=True)
class ExtraInfo(models.Model):
"""
Stores additional information for any model with:
- Multiple generic relationships
- JSON data storage
- Tracking fields
"""
# Primary GenericForeignKey (main linked object)
content_type = models.ForeignKey(
ContentType,
on_delete=models.CASCADE,
related_name="extra_info_primary"
)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
# Secondary GenericForeignKey (optional additional link)
related_content_type = models.ForeignKey(
ContentType,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="extra_info_secondary"
)
related_object_id = models.PositiveIntegerField(null=True, blank=True)
related_object = GenericForeignKey('related_content_type', 'related_object_id')
# JSON Data Storage
data = models.JSONField(
encoder=DjangoJSONEncoder,
default=dict,
blank=True
)
# Metadata
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
created_by = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
related_name="created_extra_info"
)
class Meta:
indexes = [
models.Index(fields=['content_type', 'object_id']),
models.Index(fields=['related_content_type', 'related_object_id']),
]
verbose_name_plural = "Extra Info"
def __str__(self):
return f"ExtraInfo for {self.content_object} ({self.content_type})"

View File

@ -15,7 +15,8 @@ from django_ledger.models import (
TransactionModel,
LedgerModel,
AccountModel,
PurchaseOrderModel
PurchaseOrderModel,
EstimateModel
)
from . import models
from django.utils.timezone import now
@ -977,13 +978,42 @@ def sale_order_created_notification(sender, instance, created, **kwargs):
@receiver(post_save, sender=models.Lead)
def lead_created_notification(sender, instance, created, **kwargs):
if created:
models.Notification.objects.create(
user=instance.staff.user,
message=f"""
New Lead has been added.
<a href="{reverse('lead_detail',kwargs={'dealer_slug':instance.dealer.slug,'slug':instance.slug})}" target="_blank">View</a>
""",
)
if instance.staff:
models.Notification.objects.create(
user=instance.staff.user,
message=f"""
New Lead has been added.
<a href="{reverse('lead_detail',kwargs={'dealer_slug':instance.dealer.slug,'slug':instance.slug})}" target="_blank">View</a>
""",
)
@receiver(post_save, sender=EstimateModel)
def estimate_in_review_notification(sender, instance, created, **kwargs):
if instance.is_review():
recipients = models.CustomGroup.objects.filter(dealer=instance.dealer,name="Manager").first().group.user_set.exclude(email=instance.dealer.user.email)
dealer = models.Dealer.objects.get(entity=instance.entity)
for recipient in recipients:
models.Notification.objects.create(
user=recipient,
message=f"""
Estimate {instance.estimate_number} is in review.
Please review and approve it at your earliest convenience.
<a href="{reverse('estimate_detail', kwargs={'dealer_slug': dealer.slug, 'pk': instance.pk})}" target="_blank">View</a>
""")
@receiver(post_save, sender=EstimateModel)
def estimate_in_approve_notification(sender, instance, created, **kwargs):
if instance.is_approved():
recipients = models.CustomGroup.objects.filter(dealer=instance.dealer,name="Manager").first().group.user_set.exclude(email=instance.dealer.user.email)
dealer = models.Dealer.objects.get(entity=instance.entity)
for recipient in recipients:
models.Notification.objects.create(
user=recipient,
message=f"""
Estimate {instance.estimate_number} is in review.
Please review and approve it at your earliest convenience.
<a href="{reverse('estimate_detail', kwargs={'dealer_slug': dealer.slug, 'pk': instance.pk})}" target="_blank">View</a>
""")
# @receiver(post_save, sender=models.Lead)
# def lead_created_notification(sender, instance, created, **kwargs):
# if created:

View File

@ -2611,7 +2611,7 @@ class GroupListView(LoginRequiredMixin, ListView):
template_name = "groups/group_list.html"
def get_queryset(self):
dealer = get_user_type(self.request)
dealer = get_object_or_404(models.Dealer,slug=self.kwargs["dealer_slug"])
return dealer.groups.all()
@ -5532,10 +5532,11 @@ def lead_create(request,dealer_slug):
is_sa_import=True, pk__in=dealer_make_list
)
form.fields["staff"].queryset = form.fields["staff"].queryset.filter(
dealer=dealer,staff_member__user__groups__name__contains="Sales")
dealer=dealer,staff_member__user__groups__permissions__codename__contains="add_lead")
# form.fields["staff"].queryset = form.fields["staff"].queryset.filter(
# dealer=dealer
# )
print(form.fields["staff"].queryset)
if hasattr(request.user.staffmember, "staff"):
form.initial["staff"] = request.user.staffmember.staff