block user in django admin

This commit is contained in:
javad committed 2026-10-14 12:27:55 +03:30
1 parent 089db0afa4
commit fe7a10cb61
19 files changed
+574 -11

No files matched your search

+2 -2
View File
@@ -11,8 +11,8 @@ class ContactGroupAdmin(admin.ModelAdmin):
@admin.register(CustomerProfile)
class CustomerProfileAdmin(admin.ModelAdmin):
list_display = ("user", "stakeholder_type", "organization_name", "first_name", "last_name")
list_filter = ("stakeholder_type", "groups")
list_display = ("user", "stakeholder_type", "organization_name", "first_name", "last_name", "login_blocked")
list_filter = ("stakeholder_type", "groups", "login_blocked")
search_fields = ("user__mobile", "organization_name", "first_name", "last_name")
filter_horizontal = ("groups",)
@@ -0,0 +1,28 @@
# Generated by Django 5.1.1 on 2026-10-14 08:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('customers', '0006_backfill_customer_profiles'),
]
operations = [
migrations.AddField(
model_name='customerprofile',
name='login_access_version',
field=models.PositiveIntegerField(default=0, editable=False),
),
migrations.AddField(
model_name='customerprofile',
name='login_block_reason',
field=models.TextField(blank=True, help_text='این متن به مشتری یا مخاطب نمایش داده می\u200cشود. ورود کارکنان و کارشناسان تحت تأثیر نیست.', verbose_name='دلیل مسدودی ورود'),
),
migrations.AddField(
model_name='customerprofile',
name='login_blocked',
field=models.BooleanField(default=False, verbose_name='مسدود کردن ورود مشتری / مخاطب'),
),
]
+30
View File
@@ -1,5 +1,7 @@
from django.conf import settings
from django.db import models
from django.db import transaction
from django.core.exceptions import ValidationError
from apps.core.models import PersianTextNormalizationMixin, TimeStampedModel
@@ -51,6 +53,34 @@ class CustomerProfile(PersianTextNormalizationMixin, TimeStampedModel):
groups = models.ManyToManyField(ContactGroup, blank=True, related_name="contacts")
province = models.CharField(max_length=100, blank=True)
city = models.CharField(max_length=100, blank=True)
login_blocked = models.BooleanField("مسدود کردن ورود مشتری / مخاطب", default=False)
login_block_reason = models.TextField(
"دلیل مسدودی ورود", blank=True,
help_text="این متن به مشتری یا مخاطب نمایش داده می‌شود. ورود کارکنان و کارشناسان تحت تأثیر نیست.",
)
login_access_version = models.PositiveIntegerField(default=0, editable=False)
def clean(self):
super().clean()
if self.login_blocked and not self.login_block_reason.strip():
raise ValidationError({"login_block_reason": "برای مسدود کردن ورود، دلیل مسدودی را بنویسید."})
def save(self, *args, **kwargs):
# Keep old sessions revoked even if the administrator later unblocks access.
with transaction.atomic():
previous = type(self).objects.select_for_update().filter(pk=self.pk).first()
if previous is None and self.login_blocked:
self.login_access_version = 1
if previous is not None:
self.login_access_version = previous.login_access_version
fields = kwargs.get("update_fields")
changes_access = fields is None or "login_blocked" in fields
if changes_access and self.login_blocked and not previous.login_blocked:
self.login_access_version += 1
if fields is not None:
kwargs["update_fields"] = set(fields) | {"login_access_version"}
super().save(*args, **kwargs)
def __str__(self): return (f"{self.first_name} {self.last_name}".strip() or self.user.mobile or self.user.username)