blob: 6bf605666a955c721ba0cafcb8b83eb09b235fd8 [file] [log] [blame]
Dirk Vogtc9e10ab2016-10-12 13:58:15 +02001# -*- coding: utf-8 -*-
Dirk Vogtf130c752016-08-23 14:45:01 +02002from django.db import models
Dirk Vogt67eb1482016-10-13 12:42:56 +02003from django.db import transaction
Dirk Vogtc9e10ab2016-10-12 13:58:15 +02004
Dirk Vogtf2a33422016-10-11 17:17:26 +02005from django.contrib.auth.models import User
6from taggit.managers import TaggableManager
Dirk Vogtc9e10ab2016-10-12 13:58:15 +02007
Dirk Vogtf2a33422016-10-11 17:17:26 +02008import uuid
9
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020010
Dirk Vogtf2a33422016-10-11 17:17:26 +020011class Device(models.Model):
Dirk Vogt83107df2017-05-02 12:04:19 +020012 def __str__( self ):
13 return self.uuid
Dirk Vogtf2a33422016-10-11 17:17:26 +020014 # for every device there is a django user
Dirk Vogt83107df2017-05-02 12:04:19 +020015 uuid = models.CharField( db_index=True,max_length=64, unique=True,
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020016 default=uuid.uuid4, editable=False)
17 user = models.OneToOneField(
18 User, related_name='Hiccup_Device', on_delete=models.CASCADE,
19 unique=True)
20 imei = models.CharField(max_length=32, null=True, blank=True)
21 board_date = models.DateTimeField(null=True, blank=True)
22 chipset = models.CharField(max_length=200, null=True, blank=True)
23 tags = TaggableManager(blank=True)
Dirk Vogtf2a33422016-10-11 17:17:26 +020024 last_heartbeat = models.DateTimeField(null=True, blank=True)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020025 token = models.CharField(max_length=200, null=True, blank=True)
Dirk Vogt67eb1482016-10-13 12:42:56 +020026 next_per_crashreport_key = models.PositiveIntegerField(default=1)
27 next_per_heartbeat_key = models.PositiveIntegerField(default=1)
28
29 @transaction.atomic
30 def get_crashreport_key(self):
31 ret = self.next_per_crashreport_key
32 self.next_per_crashreport_key = self.next_per_crashreport_key + 1
33 self.save()
34 return ret
35
36 @transaction.atomic
37 def get_heartbeat_key(self):
38 ret = self.next_per_heartbeat_key
Dirk Vogt0d9d5d22016-10-13 16:17:57 +020039 self.next_per_heartbeat_key = self.next_per_heartbeat_key + 1
Dirk Vogt67eb1482016-10-13 12:42:56 +020040 self.save()
41 return ret
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020042
Dirk Vogtf130c752016-08-23 14:45:01 +020043
44def crashreport_file_name(instance, filename):
Dirk Vogtf2a33422016-10-11 17:17:26 +020045 return '/'.join([
46 "crashreport_uploads",
Dirk Vogt36635692016-10-17 12:19:10 +020047 instance.crashreport.device.uuid,
48 str(instance.crashreport.id),
Dirk Vogtf2a33422016-10-11 17:17:26 +020049 str(instance.crashreport.date),
50 filename])
Dirk Vogtf130c752016-08-23 14:45:01 +020051
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020052
Dirk Vogtf130c752016-08-23 14:45:01 +020053class Crashreport(models.Model):
Franz-Xaver Geiger0b3a48e2018-04-16 15:00:14 +020054 BOOT_REASON_UNKOWN = 'UNKNOWN'
55 BOOT_REASON_KEYBOARD_POWER_ON = 'keyboard power on'
56 BOOT_REASON_RTC_ALARM = 'RTC alarm'
57 CRASH_BOOT_REASONS = [
58 BOOT_REASON_UNKOWN,
59 BOOT_REASON_KEYBOARD_POWER_ON,
60 ]
61 SMPL_BOOT_REASONS = [
62 BOOT_REASON_RTC_ALARM,
63 ]
64
Dirk Vogt83107df2017-05-02 12:04:19 +020065 device = models.ForeignKey(Device, db_index=True, related_name='crashreports', on_delete=models.CASCADE)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020066 is_fake_report = models.BooleanField(default=False)
67 app_version = models.IntegerField()
68 uptime = models.CharField(max_length=200)
Dirk Vogt83107df2017-05-02 12:04:19 +020069 build_fingerprint = models.CharField(db_index=True, max_length=200)
Borjan Tchakaloff6f239a62018-02-19 09:05:50 +010070 radio_version = models.CharField(db_index=True, max_length=200, null=True)
Dirk Vogt83107df2017-05-02 12:04:19 +020071 boot_reason = models.CharField(db_index=True, max_length=200)
72 power_on_reason = models.CharField(db_index=True, max_length=200)
73 power_off_reason = models.CharField(db_index=True, max_length=200)
74 date = models.DateTimeField(db_index=True)
Dirk Vogtf2a33422016-10-11 17:17:26 +020075 tags = TaggableManager(blank=True)
Dirk Vogt67eb1482016-10-13 12:42:56 +020076 device_local_id = models.PositiveIntegerField(blank=True)
Dirk Vogt36635692016-10-17 12:19:10 +020077 next_logfile_key = models.PositiveIntegerField(default=1)
Dirk Vogteda80d32016-11-21 11:45:50 +010078 created_at = models.DateTimeField(auto_now_add=True)
Dirk Vogt67eb1482016-10-13 12:42:56 +020079
80 @transaction.atomic
81 def get_logfile_key(self):
82 ret = self.next_logfile_key
83 self.next_logfile_key = self.next_logfile_key + 1
84 self.save()
85 return ret
86
87 def save(self, *args, **kwargs):
88 if not self.device_local_id:
89 self.device_local_id = self.device.get_crashreport_key()
90 super(Crashreport, self).save(*args, **kwargs)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020091
Dirk Vogtf2a33422016-10-11 17:17:26 +020092 def _get_uuid(self):
93 "Returns the person's full name."
94 return self.device.uuid
95 uuid = property(_get_uuid)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +020096
Dirk Vogtb52c8e72017-05-04 16:06:35 +020097#TODO remove logfile_type or make it meaningful
Dirk Vogtf2a33422016-10-11 17:17:26 +020098class LogFile(models.Model):
Dirk Vogt7160b5e2016-10-12 17:04:40 +020099 logfile_type = models.TextField(max_length=36, default="last_kmsg")
Dirk Vogt83107df2017-05-02 12:04:19 +0200100 crashreport = models.ForeignKey(Crashreport,related_name='logfiles', on_delete=models.CASCADE)
Dirk Vogteda80d32016-11-21 11:45:50 +0100101 logfile = models.FileField(upload_to=crashreport_file_name, max_length=500)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200102 crashreport_local_id = models.PositiveIntegerField(blank=True)
Dirk Vogteda80d32016-11-21 11:45:50 +0100103 created_at = models.DateTimeField(auto_now_add=True)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200104
105 def save(self, *args, **kwargs):
Dirk Vogt36635692016-10-17 12:19:10 +0200106 if not self.crashreport_local_id:
107 self.crashreport_local_id = self.crashreport.get_logfile_key()
Dirk Vogt67eb1482016-10-13 12:42:56 +0200108 super(LogFile, self).save(*args, **kwargs)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200109
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200110
111class HeartBeat(models.Model):
Dirk Vogt83107df2017-05-02 12:04:19 +0200112 device = models.ForeignKey(Device,
113 db_index=True,
114 related_name='heartbeats',
115 on_delete=models.CASCADE)
Dirk Vogt1433f7c2016-09-20 15:30:56 +0200116 app_version = models.IntegerField()
Dirk Vogtf130c752016-08-23 14:45:01 +0200117 uptime = models.CharField(max_length=200)
Dirk Vogt83107df2017-05-02 12:04:19 +0200118 build_fingerprint = models.CharField( db_index=True, max_length=200)
Borjan Tchakaloff6f239a62018-02-19 09:05:50 +0100119 radio_version = models.CharField(db_index=True, max_length=200, null=True)
Dirk Vogt83107df2017-05-02 12:04:19 +0200120 date = models.DateTimeField(db_index=True)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200121 device_local_id = models.PositiveIntegerField(blank=True)
Dirk Vogteda80d32016-11-21 11:45:50 +0100122 created_at = models.DateTimeField(auto_now_add=True)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200123
124 def save(self, *args, **kwargs):
125 if not self.device_local_id:
126 self.device_local_id = self.device.get_heartbeat_key()
127 super(HeartBeat, self).save(*args, **kwargs)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200128
129 def _get_uuid(self):
130 "Returns the person's full name."
131 return self.device.uuid
132 uuid = property(_get_uuid)