Files
RasadDam_Backend/apps/pos_device/models.py

259 lines
7.9 KiB
Python

import datetime
import random
import string
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
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):
return super(ProviderCompany, self).save(*args, **kwargs)
class Device(BaseModel):
device_identity = models.CharField(max_length=25, null=True)
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)
latitude = models.FloatField(default=0)
longitude = models.FloatField(default=0)
is_activated = models.BooleanField(default=False)
organization = models.ForeignKey(
Organization,
on_delete=models.CASCADE,
related_name='devices',
null=True
)
def __str__(self):
return f'Device: {self.serial} - {self.id}'
def generate_device_identity(self): # noqa
""" generate identity for every device """
prefix = "POS"
while True:
number_part = ''.join(random.choices(string.digits, k=6))
code = f"{prefix}{number_part}"
if not Device.objects.filter(device_identity=code).exists():
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(default=datetime.datetime.now())
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):
device = models.ForeignKey(
Device,
on_delete=models.CASCADE,
related_name='devices_version',
null=True
)
organization = models.ForeignKey(
Organization,
on_delete=models.CASCADE,
related_name='device_versions',
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)
def __str__(self):
return f'Version: {self.name}-{self.device.serial}'
def save(self, *args, **kwargs):
return super(DeviceVersion, self).save(*args, **kwargs)
class Sessions(BaseModel):
device = models.ForeignKey(
Device,
on_delete=models.CASCADE,
related_name='devices',
null=True
)
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(max_length=15, default='0.0.0.0')
sdk = models.TextField(null=True)
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):
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
)
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)