Files
RasadDam_Backend/apps/pos_device/models.py

267 lines
8.1 KiB
Python
Raw Normal View History

import datetime
2025-07-26 08:18:09 +03:30
import random
import string
2025-07-21 12:35:24 +03:30
from apps.authentication.models import Organization
from django.contrib.postgres.fields import ArrayField
from apps.authorization.models import UserRelations
from apps.core.models import BaseModel
from django.db import models
2025-07-21 12:35:24 +03:30
class ProviderCompany(BaseModel):
user_relation = models.ForeignKey(
UserRelations,
related_name='pos_provider',
on_delete=models.CASCADE,
null=True,
)
name_fa = models.CharField(max_length=250, null=True)
name_en = models.CharField(max_length=250, null=True)
activation = models.BooleanField(default=False)
class Meta:
unique_together = ('user_relation', 'name_fa')
def __str__(self):
return f'Payment Company: {self.name_fa}-{self.id}'
def save(self, *args, **kwargs):
2025-07-21 12:35:24 +03:30
return super(ProviderCompany, self).save(*args, **kwargs)
class Device(BaseModel):
2025-07-26 08:18:09 +03:30
device_identity = models.CharField(max_length=25, null=True)
2025-08-07 17:22:50 +03:30
acceptor = models.CharField(max_length=50)
terminal = models.CharField(max_length=50)
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)
2025-08-07 17:22:50 +03:30
latitude = models.FloatField(default=0)
longitude = models.FloatField(default=0)
is_activated = models.BooleanField(default=False)
2025-08-17 09:57:14 +03:30
# pre_registered = models.BooleanField(default=False)
organization = models.ForeignKey(
Organization,
on_delete=models.CASCADE,
related_name='devices',
null=True
)
2025-08-16 15:55:00 +03:30
assigned_state = models.BooleanField(default=False)
def __str__(self):
return f'Device: {self.serial} - {self.id}'
2025-08-07 17:17:28 +03:30
def generate_device_identity(self): # noqa
2025-07-26 08:18:09 +03:30
""" generate identity for every device """
prefix = "POS"
while True:
number_part = ''.join(random.choices(string.digits, k=6))
code = f"{prefix}{number_part}"
2025-08-07 17:17:28 +03:30
if not Device.objects.filter(device_identity=code).exists():
2025-07-26 08:18:09 +03:30
return code
def save(self, *args, **kwargs):
if not self.device_identity:
self.device_identity = self.generate_device_identity()
return super(Device, self).save(*args, **kwargs)
class DeviceActivationCode(BaseModel):
device = models.ForeignKey(
Device,
on_delete=models.CASCADE,
related_name="code",
null=True
)
organization = models.ForeignKey(
Organization,
on_delete=models.CASCADE,
related_name='device_activations',
null=True
)
code = models.CharField(max_length=10, null=True, unique=True)
expires_at = models.DateTimeField(auto_now_add=True)
is_used = models.BooleanField(default=False)
def __str__(self):
return f'Device: {self.device.serial} - code: {self.code}'
def save(self, *args, **kwargs):
return super(DeviceActivationCode, self).save(*args, **kwargs)
class DeviceVersion(BaseModel):
2025-07-21 11:29:20 +03:30
device = models.ForeignKey(
Device,
on_delete=models.CASCADE,
2025-07-21 12:35:24 +03:30
related_name='devices_version',
2025-07-21 11:29:20 +03:30
null=True
)
organization = models.ForeignKey(
Organization,
2025-07-21 11:29:20 +03:30
on_delete=models.CASCADE,
related_name='device_versions',
2025-07-21 11:29:20 +03:30
null=True
)
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)
2025-07-21 12:35:24 +03:30
2025-07-21 11:29:20 +03:30
def __str__(self):
return f'Version: {self.name}-{self.device.serial}'
2025-07-21 12:35:24 +03:30
2025-07-21 11:29:20 +03:30
def save(self, *args, **kwargs):
return super(DeviceVersion, self).save(*args, **kwargs)
class Sessions(BaseModel):
2025-07-21 11:29:20 +03:30
device = models.ForeignKey(
Device,
on_delete=models.CASCADE,
related_name='devices',
null=True
)
name = models.CharField(max_length=250, null=True)
2025-07-21 11:29:20 +03:30
password = models.CharField(max_length=25, null=True)
version = models.IntegerField(default=0)
mac = models.CharField(max_length=50, null=True)
ip = models.CharField(max_length=15, default='0.0.0.0')
sdk = models.TextField(null=True)
serial = models.TextField(null=True)
latitude = models.FloatField(default=0)
longitude = models.FloatField(default=0)
2025-07-21 12:35:24 +03:30
2025-07-21 11:29:20 +03:30
def __str__(self):
return f'Session: {self.name}-{self.version}-{self.id}'
2025-07-21 12:35:24 +03:30
2025-07-21 11:29:20 +03:30
def save(self, *args, **kwargs):
return super(Sessions, self).save(*args, **kwargs)
2025-07-21 12:35:24 +03:30
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.ForeignKey(
2025-07-21 12:35:24 +03:30
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):
client_type = models.CharField(max_length=25, choices=[
('business', 'صنف'),
('person', 'شخص آزاد'), # noqa
('organization', 'سازمان') # noqa
], null=True)
key = models.CharField(max_length=100, null=True)
label = models.CharField(max_length=255, null=True)
field_type = models.CharField(max_length=20, choices=[
('text', 'متن'),
('number', 'عدد'),
('date', 'تاریخ'), # noqa
('choice', 'چند کزینه ای'), # noqa
], null=True)
required = models.BooleanField(default=False)
choices = ArrayField(base_field=models.CharField(max_length=150), null=True, blank=True)
custom_field = models.BooleanField(default=False)
def __str__(self):
return f'attribute: {self.key}-{self.field_type}'
def save(self, *args, **kwargs):
return super(POSClientAttribute, self).save(*args, **kwargs)
class POSClientAttributeValue(BaseModel):
client = models.ForeignKey(
POSClient,
on_delete=models.CASCADE,
related_name='attribute_values',
null=True
)
attribute = models.ForeignKey(
POSClientAttribute,
on_delete=models.CASCADE,
related_name='attribute_values',
null=True
)
value = models.TextField(null=True)
def __str__(self):
return f'Client Attribute: {self.client.name}-{self.attribute.key}'
def save(self, *args, **kwargs):
return super(POSClientAttributeValue, self).save(*args, **kwargs)
class DeviceAssignment(BaseModel):
organization = models.ForeignKey(
Organization,
on_delete=models.CASCADE,
related_name='device_assignments',
null=True
)
client = models.ForeignKey(
POSClient,
on_delete=models.CASCADE,
related_name='assignment',
null=True
)
device = models.ForeignKey(
Device,
on_delete=models.CASCADE,
related_name='assignment',
null=True
)
def __str__(self):
return f'Device: {self.device.serial} - Client: {self.client.name}'
def save(self, *args, **kwargs):
return super(DeviceAssignment, self).save(*args, **kwargs)
class StakeHolders(BaseModel):
assignment = models.ForeignKey(
DeviceAssignment,
on_delete=models.CASCADE,
related_name='stake_holders',
null=True
)
device = models.ForeignKey(
Device,
on_delete=models.CASCADE,
related_name='stake_holders',
null=True
)
organization = models.ForeignKey(
Organization,
on_delete=models.CASCADE,
related_name='pos_stake_holders',
null=True
)
share_percent = models.FloatField(default=0)
def __str__(self):
return f'Device: {self.assignment.device.serial}-organization: {self.organization.name}'
def save(self, *args, **kwargs):
return super(StakeHolders, self).save(*args, **kwargs)