diff --git a/apps/pos_device/migrations/0003_remove_deviceversion_created_by_and_more.py b/apps/pos_device/migrations/0003_remove_deviceversion_created_by_and_more.py new file mode 100644 index 0000000..77aee58 --- /dev/null +++ b/apps/pos_device/migrations/0003_remove_deviceversion_created_by_and_more.py @@ -0,0 +1,49 @@ +# Generated by Django 5.0 on 2025-07-21 08:14 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('pos_device', '0002_device_acceptor_device_company_device_latitude_and_more'), + ] + + operations = [ + migrations.RemoveField( + model_name='deviceversion', + name='created_by', + ), + migrations.RemoveField( + model_name='deviceversion', + name='modified_by', + ), + migrations.RemoveField( + model_name='paymentcompany', + name='created_by', + ), + migrations.RemoveField( + model_name='paymentcompany', + name='modified_by', + ), + migrations.RemoveField( + model_name='sessions', + name='created_by', + ), + migrations.RemoveField( + model_name='sessions', + name='modified_by', + ), + migrations.DeleteModel( + name='Device', + ), + migrations.DeleteModel( + name='DeviceVersion', + ), + migrations.DeleteModel( + name='PaymentCompany', + ), + migrations.DeleteModel( + name='Sessions', + ), + ] diff --git a/apps/pos_device/migrations/0004_initial.py b/apps/pos_device/migrations/0004_initial.py new file mode 100644 index 0000000..a6c797a --- /dev/null +++ b/apps/pos_device/migrations/0004_initial.py @@ -0,0 +1,152 @@ +# Generated by Django 5.0 on 2025-07-21 08:39 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('authentication', '0027_remove_organizationstats_total_buyers_and_more'), + ('pos_device', '0003_remove_deviceversion_created_by_and_more'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Device', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('creator_info', models.CharField(max_length=100, null=True)), + ('modifier_info', models.CharField(max_length=100, null=True)), + ('trash', models.BooleanField(default=False)), + ('acceptor', models.IntegerField(default=0)), + ('terminal', models.IntegerField(default=0)), + ('serial', models.TextField(null=True)), + ('password', models.CharField(max_length=25, null=True)), + ('multi_device', models.BooleanField(default=False)), + ('server_in', models.BooleanField(default=False)), + ('latitude', models.DecimalField(decimal_places=10, max_digits=20, null=True)), + ('longitude', models.DecimalField(decimal_places=10, max_digits=20, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createddby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='POSClient', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('creator_info', models.CharField(max_length=100, null=True)), + ('modifier_info', models.CharField(max_length=100, null=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=255, null=True)), + ('client_type', models.CharField(choices=[('business', 'صنف'), ('person', 'شخص آزاد'), ('organization', 'سازمان')], max_length=25)), + ('is_organization', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createddby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ('organization', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='client', to='authentication.organization')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='POSClientAttribute', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('creator_info', models.CharField(max_length=100, null=True)), + ('modifier_info', models.CharField(max_length=100, null=True)), + ('trash', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createddby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ProviderCompany', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('creator_info', models.CharField(max_length=100, null=True)), + ('modifier_info', models.CharField(max_length=100, null=True)), + ('trash', models.BooleanField(default=False)), + ('name_fa', models.CharField(max_length=250, null=True)), + ('name_en', models.CharField(max_length=250, null=True)), + ('activation', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createddby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='DeviceVersion', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('creator_info', models.CharField(max_length=100, null=True)), + ('modifier_info', models.CharField(max_length=100, null=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=250, null=True)), + ('code', models.IntegerField(default=0)), + ('description', models.TextField(null=True)), + ('enable', models.BooleanField(default=True)), + ('remove', models.BooleanField(default=False)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createddby', to=settings.AUTH_USER_MODEL)), + ('device', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='devices_version', to='pos_device.device')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ('company', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='devices_company', to='pos_device.providercompany')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='device', + name='company', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='devices', to='pos_device.providercompany'), + ), + migrations.CreateModel( + name='Sessions', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('creator_info', models.CharField(max_length=100, null=True)), + ('modifier_info', models.CharField(max_length=100, null=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=125, null=True)), + ('password', models.CharField(max_length=25, null=True)), + ('version', models.IntegerField(default=0)), + ('mac', models.CharField(max_length=50, null=True)), + ('ip', models.CharField(default='0.0.0.0', max_length=15)), + ('sdk', models.TextField(null=True)), + ('serial', models.TextField(null=True)), + ('latitude', models.DecimalField(decimal_places=10, max_digits=20, null=True)), + ('longitude', models.DecimalField(decimal_places=10, max_digits=20, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createddby', to=settings.AUTH_USER_MODEL)), + ('device', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='devices', to='pos_device.device')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/pos_device/models.py b/apps/pos_device/models.py index a3718d9..40efd77 100644 --- a/apps/pos_device/models.py +++ b/apps/pos_device/models.py @@ -1,8 +1,9 @@ from django.db import models from apps.core.models import BaseModel +from apps.authentication.models import Organization -class PaymentCompany(BaseModel): +class ProviderCompany(BaseModel): name_fa = models.CharField(max_length=250, null=True) name_en = models.CharField(max_length=250, null=True) activation = models.BooleanField(default=False) @@ -11,7 +12,7 @@ class PaymentCompany(BaseModel): return f'Payment Company: {self.name_fa}-{self.id}' def save(self, *args, **kwargs): - return super(PaymentCompany, self).save(*args, **kwargs) + return super(ProviderCompany, self).save(*args, **kwargs) class Device(BaseModel): @@ -24,7 +25,7 @@ class Device(BaseModel): latitude = models.DecimalField(max_digits=20, decimal_places=10, null=True) longitude = models.DecimalField(max_digits=20, decimal_places=10, null=True) company = models.ForeignKey( - PaymentCompany, + ProviderCompany, on_delete=models.CASCADE, related_name='devices', null=True @@ -41,13 +42,13 @@ class DeviceVersion(BaseModel): device = models.ForeignKey( Device, on_delete=models.CASCADE, - related_name='devices', + related_name='devices_version', null=True ) company = models.ForeignKey( - PaymentCompany, + ProviderCompany, on_delete=models.CASCADE, - related_name='devices', + related_name='devices_company', null=True ) name = models.CharField(max_length=250, null=True) @@ -55,10 +56,10 @@ class DeviceVersion(BaseModel): description = models.TextField(null=True) enable = models.BooleanField(default=True) remove = models.BooleanField(default=False) - + def __str__(self): return f'Version: {self.name}-{self.device.serial}' - + def save(self, *args, **kwargs): return super(DeviceVersion, self).save(*args, **kwargs) @@ -79,9 +80,35 @@ class Sessions(BaseModel): serial = models.TextField(null=True) latitude = models.DecimalField(max_digits=20, decimal_places=10, null=True) longitude = models.DecimalField(max_digits=20, decimal_places=10, null=True) - + def __str__(self): return f'Session: {self.name}-{self.version}-{self.id}' - + def save(self, *args, **kwargs): return super(Sessions, self).save(*args, **kwargs) + + +class POSClient(BaseModel): + name = models.CharField(max_length=255, null=True) + client_type = models.CharField(max_length=25, choices=[ + ('business', 'صنف'), + ('person', 'شخص آزاد'), # noqa + ('organization', 'سازمان') # noqa + ]) + is_organization = models.BooleanField(default=False) + organization = models.OneToOneField( + Organization, + on_delete=models.CASCADE, + related_name='client', + null=True + ) + + def __str__(self): + return f'POSClient: {self.name}-{self.id}' + + def save(self, *args, **kwargs): + return super(POSClient, self).save(*args, **kwargs) + + +class POSClientAttribute(BaseModel): + pass diff --git a/apps/product/web/api/v1/serializers/quota_serializers.py b/apps/product/web/api/v1/serializers/quota_serializers.py index 9da4623..8f2562e 100644 --- a/apps/product/web/api/v1/serializers/quota_serializers.py +++ b/apps/product/web/api/v1/serializers/quota_serializers.py @@ -40,6 +40,11 @@ class QuotaSerializer(serializers.ModelSerializer): many=True ).data + representation['limit_by_organizations'] = OrganizationSerializer( + instance.limit_by_organizations.all(), + many=True + ).data + return representation def update(self, instance, validated_data): diff --git a/apps/product/web/api/v1/viewsets/quota_api.py b/apps/product/web/api/v1/viewsets/quota_api.py index dc6f2da..33f2fd4 100644 --- a/apps/product/web/api/v1/viewsets/quota_api.py +++ b/apps/product/web/api/v1/viewsets/quota_api.py @@ -261,7 +261,7 @@ class QuotaViewSet(viewsets.ModelViewSet): # noqa Q(assigned_organizations=organization) | Q(registerer_organization=organization), Q(is_closed=False) - ) + ).order_by('-modify_date') ) if page is not None: serializer = self.get_serializer(page, many=True)