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.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.serializers.json import DjangoJSONEncoder
from appointment.models import StaffMember from appointment.models import StaffMember
from plans.quota import get_user_quota from plans.quota import get_user_quota
from plans.models import UserPlan from plans.models import UserPlan
@ -2521,7 +2522,7 @@ class CustomGroup(models.Model):
@property @property
def users(self): def users(self):
return self.group.user_set.all() return self.group.user_set.exclude(email=self.dealer.user.email).all()
@property @property
def permissions(self): def permissions(self):
@ -2863,3 +2864,57 @@ class PoItemsUploaded(models.Model):
status = models.CharField(max_length=100, null=True, blank=True) status = models.CharField(max_length=100, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=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, TransactionModel,
LedgerModel, LedgerModel,
AccountModel, AccountModel,
PurchaseOrderModel PurchaseOrderModel,
EstimateModel
) )
from . import models from . import models
from django.utils.timezone import now 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) @receiver(post_save, sender=models.Lead)
def lead_created_notification(sender, instance, created, **kwargs): def lead_created_notification(sender, instance, created, **kwargs):
if created: if created:
models.Notification.objects.create( if instance.staff:
user=instance.staff.user, models.Notification.objects.create(
message=f""" user=instance.staff.user,
New Lead has been added. message=f"""
<a href="{reverse('lead_detail',kwargs={'dealer_slug':instance.dealer.slug,'slug':instance.slug})}" target="_blank">View</a> 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) # @receiver(post_save, sender=models.Lead)
# def lead_created_notification(sender, instance, created, **kwargs): # def lead_created_notification(sender, instance, created, **kwargs):
# if created: # if created:

View File

@ -2611,7 +2611,7 @@ class GroupListView(LoginRequiredMixin, ListView):
template_name = "groups/group_list.html" template_name = "groups/group_list.html"
def get_queryset(self): 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() return dealer.groups.all()
@ -5532,10 +5532,11 @@ def lead_create(request,dealer_slug):
is_sa_import=True, pk__in=dealer_make_list is_sa_import=True, pk__in=dealer_make_list
) )
form.fields["staff"].queryset = form.fields["staff"].queryset.filter( 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( # form.fields["staff"].queryset = form.fields["staff"].queryset.filter(
# dealer=dealer # dealer=dealer
# ) # )
print(form.fields["staff"].queryset)
if hasattr(request.user.staffmember, "staff"): if hasattr(request.user.staffmember, "staff"):
form.initial["staff"] = request.user.staffmember.staff form.initial["staff"] = request.user.staffmember.staff