mirror of
				https://github.com/evraz-hack/backend.git
				synced 2025-11-04 09:37:25 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.db import models
 | 
						||
 | 
						||
 | 
						||
class Record(models.Model):
 | 
						||
    received = models.DateTimeField(auto_now_add=True)
 | 
						||
    timestamp = models.DateTimeField(blank=False)
 | 
						||
 | 
						||
    offset = models.IntegerField(unique=True)
 | 
						||
 | 
						||
    # store message for further usage, e. g. reading logs, etc
 | 
						||
    message = models.JSONField(null=True)
 | 
						||
 | 
						||
    class Meta:
 | 
						||
        ordering = ["offset"]
 | 
						||
 | 
						||
 | 
						||
class RecordApproximation(models.Model):
 | 
						||
    class AmountChoices(models.IntegerChoices):
 | 
						||
        ten_minutes = 10
 | 
						||
        thirty_minutes = 30
 | 
						||
        hour = 60
 | 
						||
 | 
						||
    amount = models.IntegerField(choices=AmountChoices.choices)
 | 
						||
    timestamp = models.DateTimeField(blank=False)
 | 
						||
    offset = models.IntegerField()
 | 
						||
 | 
						||
    class Meta:
 | 
						||
        unique_together = ["amount", "offset"]
 | 
						||
 | 
						||
 | 
						||
class ExgausterRecordSignal(models.Model):
 | 
						||
    record = models.ForeignKey(
 | 
						||
        "analytics.Record", related_name="signals", on_delete=models.CASCADE
 | 
						||
    )
 | 
						||
    signal = models.ForeignKey(
 | 
						||
        "analytics.ExgausterSignal", related_name="records", on_delete=models.CASCADE
 | 
						||
    )
 | 
						||
    value = models.FloatField()
 | 
						||
 | 
						||
 | 
						||
class ExgausterRecordApproximationSignal(models.Model):
 | 
						||
    record = models.ForeignKey(
 | 
						||
        "analytics.RecordApproximation",
 | 
						||
        related_name="signals",
 | 
						||
        on_delete=models.CASCADE,
 | 
						||
    )
 | 
						||
    signal = models.ForeignKey(
 | 
						||
        "analytics.ExgausterSignal",
 | 
						||
        related_name="records_approximate",
 | 
						||
        on_delete=models.CASCADE,
 | 
						||
    )
 | 
						||
    value = models.FloatField()
 | 
						||
 | 
						||
 | 
						||
class Exgauster(models.Model):
 | 
						||
    number = models.IntegerField(unique=True)
 | 
						||
    name = models.CharField(max_length=20)
 | 
						||
 | 
						||
 | 
						||
class ExgausterSignal(models.Model):
 | 
						||
    class ExgausterSignalType(models.TextChoices):
 | 
						||
        ANALOG = "analog", "ANALOG"
 | 
						||
        DIGITAL = "digital", "DIGITAL"
 | 
						||
 | 
						||
    exgauster = models.ForeignKey(
 | 
						||
        "analytics.Exgauster", related_name="signals", on_delete=models.CASCADE
 | 
						||
    )
 | 
						||
 | 
						||
    # store place in x:y way
 | 
						||
    place_x = models.IntegerField()
 | 
						||
    place_y = models.IntegerField()
 | 
						||
 | 
						||
    type = models.CharField(
 | 
						||
        choices=ExgausterSignalType.choices,
 | 
						||
        max_length=7,
 | 
						||
    )
 | 
						||
    comment = models.CharField(max_length=200, blank=True)
 | 
						||
    active = models.BooleanField(default=True)
 | 
						||
 | 
						||
    # Подшипник1 - Температура нагрева - Температура - temperature
 | 
						||
    item = models.CharField(max_length=200, blank=True)
 | 
						||
    characteristics = models.CharField(max_length=200, blank=True)
 | 
						||
    characteristics_description = models.CharField(max_length=200, blank=True)
 | 
						||
    item_name = models.CharField(max_length=200, blank=True)
 | 
						||
 | 
						||
    config = models.ForeignKey(
 | 
						||
        "self", null=True, related_name="installations", on_delete=models.SET_NULL
 | 
						||
    )
 | 
						||
 | 
						||
    @property
 | 
						||
    def name(self) -> str:
 | 
						||
        return f"SM_Exgauster\\[{self.place_x}{':' if self.type == 'analog' else '.'}{self.place_y}]"
 | 
						||
 | 
						||
    class Meta:
 | 
						||
        unique_together = ["place_x", "place_y", "type"]
 |