Dirk Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 1 | # -*- coding: utf-8 -*- |
Dirk Vogt | f130c75 | 2016-08-23 14:45:01 +0200 | [diff] [blame] | 2 | from django.db import models |
Dirk Vogt | 67eb148 | 2016-10-13 12:42:56 +0200 | [diff] [blame] | 3 | from django.db import transaction |
Dirk Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 4 | |
Dirk Vogt | f2a3342 | 2016-10-11 17:17:26 +0200 | [diff] [blame] | 5 | from django.contrib.auth.models import User |
| 6 | from taggit.managers import TaggableManager |
Dirk Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 7 | |
Dirk Vogt | f2a3342 | 2016-10-11 17:17:26 +0200 | [diff] [blame] | 8 | import uuid |
| 9 | |
Dirk Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 10 | |
Dirk Vogt | f2a3342 | 2016-10-11 17:17:26 +0200 | [diff] [blame] | 11 | class Device(models.Model): |
Dirk Vogt | 83107df | 2017-05-02 12:04:19 +0200 | [diff] [blame] | 12 | def __str__( self ): |
| 13 | return self.uuid |
Dirk Vogt | f2a3342 | 2016-10-11 17:17:26 +0200 | [diff] [blame] | 14 | # for every device there is a django user |
Dirk Vogt | 83107df | 2017-05-02 12:04:19 +0200 | [diff] [blame] | 15 | uuid = models.CharField( db_index=True,max_length=64, unique=True, |
Dirk Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 16 | 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 Vogt | f2a3342 | 2016-10-11 17:17:26 +0200 | [diff] [blame] | 24 | last_heartbeat = models.DateTimeField(null=True, blank=True) |
Dirk Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 25 | token = models.CharField(max_length=200, null=True, blank=True) |
Dirk Vogt | 67eb148 | 2016-10-13 12:42:56 +0200 | [diff] [blame] | 26 | 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 Vogt | 0d9d5d2 | 2016-10-13 16:17:57 +0200 | [diff] [blame] | 39 | self.next_per_heartbeat_key = self.next_per_heartbeat_key + 1 |
Dirk Vogt | 67eb148 | 2016-10-13 12:42:56 +0200 | [diff] [blame] | 40 | self.save() |
| 41 | return ret |
Dirk Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 42 | |
Dirk Vogt | f130c75 | 2016-08-23 14:45:01 +0200 | [diff] [blame] | 43 | |
| 44 | def crashreport_file_name(instance, filename): |
Dirk Vogt | f2a3342 | 2016-10-11 17:17:26 +0200 | [diff] [blame] | 45 | return '/'.join([ |
| 46 | "crashreport_uploads", |
Dirk Vogt | 3663569 | 2016-10-17 12:19:10 +0200 | [diff] [blame] | 47 | instance.crashreport.device.uuid, |
| 48 | str(instance.crashreport.id), |
Dirk Vogt | f2a3342 | 2016-10-11 17:17:26 +0200 | [diff] [blame] | 49 | str(instance.crashreport.date), |
| 50 | filename]) |
Dirk Vogt | f130c75 | 2016-08-23 14:45:01 +0200 | [diff] [blame] | 51 | |
Dirk Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 52 | |
Dirk Vogt | f130c75 | 2016-08-23 14:45:01 +0200 | [diff] [blame] | 53 | class Crashreport(models.Model): |
Franz-Xaver Geiger | 0b3a48e | 2018-04-16 15:00:14 +0200 | [diff] [blame] | 54 | 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 Vogt | 83107df | 2017-05-02 12:04:19 +0200 | [diff] [blame] | 65 | device = models.ForeignKey(Device, db_index=True, related_name='crashreports', on_delete=models.CASCADE) |
Dirk Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 66 | is_fake_report = models.BooleanField(default=False) |
| 67 | app_version = models.IntegerField() |
| 68 | uptime = models.CharField(max_length=200) |
Dirk Vogt | 83107df | 2017-05-02 12:04:19 +0200 | [diff] [blame] | 69 | build_fingerprint = models.CharField(db_index=True, max_length=200) |
Borjan Tchakaloff | 6f239a6 | 2018-02-19 09:05:50 +0100 | [diff] [blame] | 70 | radio_version = models.CharField(db_index=True, max_length=200, null=True) |
Dirk Vogt | 83107df | 2017-05-02 12:04:19 +0200 | [diff] [blame] | 71 | 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 Vogt | f2a3342 | 2016-10-11 17:17:26 +0200 | [diff] [blame] | 75 | tags = TaggableManager(blank=True) |
Dirk Vogt | 67eb148 | 2016-10-13 12:42:56 +0200 | [diff] [blame] | 76 | device_local_id = models.PositiveIntegerField(blank=True) |
Dirk Vogt | 3663569 | 2016-10-17 12:19:10 +0200 | [diff] [blame] | 77 | next_logfile_key = models.PositiveIntegerField(default=1) |
Dirk Vogt | eda80d3 | 2016-11-21 11:45:50 +0100 | [diff] [blame] | 78 | created_at = models.DateTimeField(auto_now_add=True) |
Dirk Vogt | 67eb148 | 2016-10-13 12:42:56 +0200 | [diff] [blame] | 79 | |
| 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 Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 91 | |
Dirk Vogt | f2a3342 | 2016-10-11 17:17:26 +0200 | [diff] [blame] | 92 | def _get_uuid(self): |
| 93 | "Returns the person's full name." |
| 94 | return self.device.uuid |
| 95 | uuid = property(_get_uuid) |
Dirk Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 96 | |
Dirk Vogt | b52c8e7 | 2017-05-04 16:06:35 +0200 | [diff] [blame] | 97 | #TODO remove logfile_type or make it meaningful |
Dirk Vogt | f2a3342 | 2016-10-11 17:17:26 +0200 | [diff] [blame] | 98 | class LogFile(models.Model): |
Dirk Vogt | 7160b5e | 2016-10-12 17:04:40 +0200 | [diff] [blame] | 99 | logfile_type = models.TextField(max_length=36, default="last_kmsg") |
Dirk Vogt | 83107df | 2017-05-02 12:04:19 +0200 | [diff] [blame] | 100 | crashreport = models.ForeignKey(Crashreport,related_name='logfiles', on_delete=models.CASCADE) |
Dirk Vogt | eda80d3 | 2016-11-21 11:45:50 +0100 | [diff] [blame] | 101 | logfile = models.FileField(upload_to=crashreport_file_name, max_length=500) |
Dirk Vogt | 67eb148 | 2016-10-13 12:42:56 +0200 | [diff] [blame] | 102 | crashreport_local_id = models.PositiveIntegerField(blank=True) |
Dirk Vogt | eda80d3 | 2016-11-21 11:45:50 +0100 | [diff] [blame] | 103 | created_at = models.DateTimeField(auto_now_add=True) |
Dirk Vogt | 67eb148 | 2016-10-13 12:42:56 +0200 | [diff] [blame] | 104 | |
| 105 | def save(self, *args, **kwargs): |
Dirk Vogt | 3663569 | 2016-10-17 12:19:10 +0200 | [diff] [blame] | 106 | if not self.crashreport_local_id: |
| 107 | self.crashreport_local_id = self.crashreport.get_logfile_key() |
Dirk Vogt | 67eb148 | 2016-10-13 12:42:56 +0200 | [diff] [blame] | 108 | super(LogFile, self).save(*args, **kwargs) |
Dirk Vogt | f2a3342 | 2016-10-11 17:17:26 +0200 | [diff] [blame] | 109 | |
Dirk Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 110 | |
| 111 | class HeartBeat(models.Model): |
Dirk Vogt | 83107df | 2017-05-02 12:04:19 +0200 | [diff] [blame] | 112 | device = models.ForeignKey(Device, |
| 113 | db_index=True, |
| 114 | related_name='heartbeats', |
| 115 | on_delete=models.CASCADE) |
Dirk Vogt | 1433f7c | 2016-09-20 15:30:56 +0200 | [diff] [blame] | 116 | app_version = models.IntegerField() |
Dirk Vogt | f130c75 | 2016-08-23 14:45:01 +0200 | [diff] [blame] | 117 | uptime = models.CharField(max_length=200) |
Dirk Vogt | 83107df | 2017-05-02 12:04:19 +0200 | [diff] [blame] | 118 | build_fingerprint = models.CharField( db_index=True, max_length=200) |
Borjan Tchakaloff | 6f239a6 | 2018-02-19 09:05:50 +0100 | [diff] [blame] | 119 | radio_version = models.CharField(db_index=True, max_length=200, null=True) |
Dirk Vogt | 83107df | 2017-05-02 12:04:19 +0200 | [diff] [blame] | 120 | date = models.DateTimeField(db_index=True) |
Dirk Vogt | 67eb148 | 2016-10-13 12:42:56 +0200 | [diff] [blame] | 121 | device_local_id = models.PositiveIntegerField(blank=True) |
Dirk Vogt | eda80d3 | 2016-11-21 11:45:50 +0100 | [diff] [blame] | 122 | created_at = models.DateTimeField(auto_now_add=True) |
Dirk Vogt | 67eb148 | 2016-10-13 12:42:56 +0200 | [diff] [blame] | 123 | |
| 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 Vogt | c9e10ab | 2016-10-12 13:58:15 +0200 | [diff] [blame] | 128 | |
| 129 | def _get_uuid(self): |
| 130 | "Returns the person's full name." |
| 131 | return self.device.uuid |
| 132 | uuid = property(_get_uuid) |