add retry sms manually

This commit is contained in:
javad committed 2026-09-23 18:23:18 +03:30
1 parent 33930e972c
commit cb92abbb41
42 files changed
+1628 -1484

No files matched your search

+37 -37
View File
@@ -1,37 +1,37 @@
# Generated by Django 5.1.1 on 2026-09-05 07:03
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='StaffProfile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('display_name', models.CharField(max_length=150)),
('avatar', models.ImageField(blank=True, upload_to='staff/avatars/')),
('mobile', models.CharField(blank=True, max_length=16)),
('bale_chat_id', models.CharField(blank=True, max_length=100)),
('bale_notifications_enabled', models.BooleanField(default=True)),
('is_customer_selectable', models.BooleanField(default=True)),
('sort_order', models.PositiveIntegerField(default=0)),
('is_active', models.BooleanField(default=True)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='staff_profile', to=settings.AUTH_USER_MODEL)),
],
options={
'ordering': ['sort_order', 'display_name'],
},
),
]
# Generated by Django 5.1.1 on 2026-09-05 07:03
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='StaffProfile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('display_name', models.CharField(max_length=150)),
('avatar', models.ImageField(blank=True, upload_to='staff/avatars/')),
('mobile', models.CharField(blank=True, max_length=16)),
('bale_chat_id', models.CharField(blank=True, max_length=100)),
('bale_notifications_enabled', models.BooleanField(default=True)),
('is_customer_selectable', models.BooleanField(default=True)),
('sort_order', models.PositiveIntegerField(default=0)),
('is_active', models.BooleanField(default=True)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='staff_profile', to=settings.AUTH_USER_MODEL)),
],
options={
'ordering': ['sort_order', 'display_name'],
},
),
]
@@ -1,28 +1,28 @@
# Generated by Django 5.1.1 on 2026-09-06 10:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='staffprofile',
name='first_name',
field=models.CharField(blank=True, max_length=100),
),
migrations.AddField(
model_name='staffprofile',
name='job_title',
field=models.CharField(blank=True, default='کارشناس فروش', max_length=150),
),
migrations.AddField(
model_name='staffprofile',
name='last_name',
field=models.CharField(blank=True, max_length=100),
),
]
# Generated by Django 5.1.1 on 2026-09-06 10:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='staffprofile',
name='first_name',
field=models.CharField(blank=True, max_length=100),
),
migrations.AddField(
model_name='staffprofile',
name='job_title',
field=models.CharField(blank=True, default='کارشناس فروش', max_length=150),
),
migrations.AddField(
model_name='staffprofile',
name='last_name',
field=models.CharField(blank=True, max_length=100),
),
]
+18 -18
View File
@@ -1,18 +1,18 @@
# Generated by Django 5.1.1 on 2026-09-07 11:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0002_staffprofile_first_name_staffprofile_job_title_and_more'),
]
operations = [
migrations.AddField(
model_name='staffprofile',
name='role',
field=models.CharField(choices=[('SALES_EXPERT', 'کارشناس فروش'), ('SALES_SUPERVISOR', 'سرپرست فروش'), ('SALES_MANAGER', 'مدیر فروش'), ('CEO', 'مدیرعامل'), ('GENERAL_ADMIN', 'مدیرکل Admin')], db_index=True, default='SALES_EXPERT', max_length=24),
),
]
# Generated by Django 5.1.1 on 2026-09-07 11:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0002_staffprofile_first_name_staffprofile_job_title_and_more'),
]
operations = [
migrations.AddField(
model_name='staffprofile',
name='role',
field=models.CharField(choices=[('SALES_EXPERT', 'کارشناس فروش'), ('SALES_SUPERVISOR', 'سرپرست فروش'), ('SALES_MANAGER', 'مدیر فروش'), ('CEO', 'مدیرعامل'), ('GENERAL_ADMIN', 'مدیرکل Admin')], db_index=True, default='SALES_EXPERT', max_length=24),
),
]
@@ -1,61 +1,61 @@
# Generated by Django 5.1.1 on 2026-09-08 09:57
import apps.core.models
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
('staff', '0003_staffprofile_role'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='OrganizationalUnit',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('name', models.CharField(max_length=120, unique=True)),
('slug', models.SlugField(max_length=80, unique=True)),
('description', models.TextField(blank=True)),
('is_active', models.BooleanField(default=True)),
('permissions', models.ManyToManyField(blank=True, help_text='مجوزهایی که به تمام اعضای فعال این واحد داده می\u200cشود.', related_name='organizational_units', to='auth.permission')),
],
options={
'verbose_name': 'واحد سازمانی',
'verbose_name_plural': 'واحدهای سازمانی',
'ordering': ['name'],
},
bases=(apps.core.models.PersianTextNormalizationMixin, models.Model),
),
migrations.AddField(
model_name='staffprofile',
name='primary_unit',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='primary_staff', to='staff.organizationalunit'),
),
migrations.CreateModel(
name='UnitMembership',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('is_primary', models.BooleanField(default=False)),
('is_active', models.BooleanField(default=True)),
('permissions', models.ManyToManyField(blank=True, help_text='مجوزهای اضافه مخصوص این عضو در همین واحد.', related_name='unit_memberships', to='auth.permission')),
('unit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberships', to='staff.organizationalunit')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='unit_memberships', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'عضویت واحد',
'verbose_name_plural': 'عضویت\u200cهای واحد',
'ordering': ['unit__name', 'user__username'],
'constraints': [models.UniqueConstraint(fields=('user', 'unit'), name='unique_unit_membership')],
},
),
]
# Generated by Django 5.1.1 on 2026-09-08 09:57
import apps.core.models
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
('staff', '0003_staffprofile_role'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='OrganizationalUnit',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('name', models.CharField(max_length=120, unique=True)),
('slug', models.SlugField(max_length=80, unique=True)),
('description', models.TextField(blank=True)),
('is_active', models.BooleanField(default=True)),
('permissions', models.ManyToManyField(blank=True, help_text='مجوزهایی که به تمام اعضای فعال این واحد داده می\u200cشود.', related_name='organizational_units', to='auth.permission')),
],
options={
'verbose_name': 'واحد سازمانی',
'verbose_name_plural': 'واحدهای سازمانی',
'ordering': ['name'],
},
bases=(apps.core.models.PersianTextNormalizationMixin, models.Model),
),
migrations.AddField(
model_name='staffprofile',
name='primary_unit',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='primary_staff', to='staff.organizationalunit'),
),
migrations.CreateModel(
name='UnitMembership',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('is_primary', models.BooleanField(default=False)),
('is_active', models.BooleanField(default=True)),
('permissions', models.ManyToManyField(blank=True, help_text='مجوزهای اضافه مخصوص این عضو در همین واحد.', related_name='unit_memberships', to='auth.permission')),
('unit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberships', to='staff.organizationalunit')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='unit_memberships', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'عضویت واحد',
'verbose_name_plural': 'عضویت\u200cهای واحد',
'ordering': ['unit__name', 'user__username'],
'constraints': [models.UniqueConstraint(fields=('user', 'unit'), name='unique_unit_membership')],
},
),
]
@@ -1,18 +1,18 @@
# Generated by Django 5.1.1 on 2026-09-09 05:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0004_organizationalunit_staffprofile_primary_unit_and_more'),
]
operations = [
migrations.AddField(
model_name='organizationalunit',
name='accepts_external_tickets',
field=models.BooleanField(default=True, help_text='اگر غیرفعال باشد، مشتریان نمی\u200cتوانند مستقیماً برای این واحد تیکت ثبت کنند.', verbose_name='قابل انتخاب برای تیکت مشتری'),
),
]
# Generated by Django 5.1.1 on 2026-09-09 05:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0004_organizationalunit_staffprofile_primary_unit_and_more'),
]
operations = [
migrations.AddField(
model_name='organizationalunit',
name='accepts_external_tickets',
field=models.BooleanField(default=True, help_text='اگر غیرفعال باشد، مشتریان نمی\u200cتوانند مستقیماً برای این واحد تیکت ثبت کنند.', verbose_name='قابل انتخاب برای تیکت مشتری'),
),
]
@@ -1,27 +1,27 @@
# Generated by Django 5.1.1 on 2026-09-09 09:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0005_organizationalunit_accepts_external_tickets'),
]
operations = [
migrations.AlterModelOptions(
name='organizationalunit',
options={'ordering': ['sort_order', 'name', 'pk'], 'verbose_name': 'واحد سازمانی', 'verbose_name_plural': 'واحدهای سازمانی'},
),
migrations.AddField(
model_name='organizationalunit',
name='search_keywords',
field=models.TextField(blank=True, help_text='واژه\u200cها و عبارت\u200cهای مترادف را با فاصله یا ویرگول وارد کنید.', verbose_name='کلیدواژه\u200cهای جستجو'),
),
migrations.AddField(
model_name='organizationalunit',
name='sort_order',
field=models.PositiveIntegerField(db_index=True, default=0, verbose_name='ترتیب نمایش'),
),
]
# Generated by Django 5.1.1 on 2026-09-09 09:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0005_organizationalunit_accepts_external_tickets'),
]
operations = [
migrations.AlterModelOptions(
name='organizationalunit',
options={'ordering': ['sort_order', 'name', 'pk'], 'verbose_name': 'واحد سازمانی', 'verbose_name_plural': 'واحدهای سازمانی'},
),
migrations.AddField(
model_name='organizationalunit',
name='search_keywords',
field=models.TextField(blank=True, help_text='واژه\u200cها و عبارت\u200cهای مترادف را با فاصله یا ویرگول وارد کنید.', verbose_name='کلیدواژه\u200cهای جستجو'),
),
migrations.AddField(
model_name='organizationalunit',
name='sort_order',
field=models.PositiveIntegerField(db_index=True, default=0, verbose_name='ترتیب نمایش'),
),
]
@@ -1,18 +1,18 @@
# Generated by Django 5.1.1 on 2026-09-09 09:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0006_alter_organizationalunit_options_and_more'),
]
operations = [
migrations.AddField(
model_name='organizationalunit',
name='show_in_customer_form',
field=models.BooleanField(default=True, help_text='در صورت خاموش بودن، واحد در فرم ثبت تیکت و جستجوی مشتری نمایش داده نمی\u200cشود.', verbose_name='نمایش در فرم مشتری'),
),
]
# Generated by Django 5.1.1 on 2026-09-09 09:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0006_alter_organizationalunit_options_and_more'),
]
operations = [
migrations.AddField(
model_name='organizationalunit',
name='show_in_customer_form',
field=models.BooleanField(default=True, help_text='در صورت خاموش بودن، واحد در فرم ثبت تیکت و جستجوی مشتری نمایش داده نمی\u200cشود.', verbose_name='نمایش در فرم مشتری'),
),
]
@@ -1,18 +1,18 @@
# Generated by Django 5.1.1 on 2026-09-10 05:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0008_unitmembership_ticket_scope_and_roles'),
]
operations = [
migrations.AlterField(
model_name='staffprofile',
name='sort_order',
field=models.PositiveIntegerField(db_index=True, default=0, help_text='عدد کمتر، کارشناس را زودتر در فهرست همان واحد نمایش می\u200cدهد.', verbose_name='ترتیب نمایش در انتخاب کارشناس'),
),
]
# Generated by Django 5.1.1 on 2026-09-10 05:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('staff', '0008_unitmembership_ticket_scope_and_roles'),
]
operations = [
migrations.AlterField(
model_name='staffprofile',
name='sort_order',
field=models.PositiveIntegerField(db_index=True, default=0, help_text='عدد کمتر، کارشناس را زودتر در فهرست همان واحد نمایش می\u200cدهد.', verbose_name='ترتیب نمایش در انتخاب کارشناس'),
),
]