summaryrefslogtreecommitdiffstats
path: root/releng/models.py
blob: dc297d5be39d5ffb3b3fe2e7f955cd39c06344ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
from datetime import datetime

from django.db import models
from django.db.models import Max

class IsoOption(models.Model):
    name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.name

    def get_test_result(self, success):
        try:
            return self.test_set.filter(success=success).select_related(
                    'iso').latest('iso__id').iso
        except Test.DoesNotExist:
            return None

    def get_last_success(self):
        return self.get_test_result(True)

    def get_last_failure(self):
        return self.get_test_result(False)

    class Meta:
        abstract = True

class RollbackOption(IsoOption):
    def get_rollback_test_result(self, success):
        try:
            return self.rollback_test_set.filter(success=success).select_related(
                    'iso').latest('iso__id').iso
        except Test.DoesNotExist:
            return None

    def get_last_rollback_success(self):
        return self.get_rollback_test_result(True)

    def get_last_rollback_failure(self):
        return self.get_rollback_test_result(False)

    class Meta:
        abstract = True

class Iso(models.Model):
    name = models.CharField(max_length=255)
    created = models.DateTimeField(editable=False)
    active = models.BooleanField(default=True)

    def __unicode__(self):
        return self.name

class Architecture(IsoOption):
    pass

class IsoType(IsoOption):
    pass

class BootType(IsoOption):
    pass

class HardwareType(IsoOption):
    pass

class InstallType(IsoOption):
    pass

class Source(IsoOption):
    pass

class ClockChoice(IsoOption):
    pass

class Filesystem(RollbackOption):
    pass

class Module(RollbackOption):
    pass

class Bootloader(IsoOption):
    pass

class Test(models.Model):
    user_name = models.CharField(max_length=500)
    user_email = models.EmailField()
    ip_address = models.IPAddressField()
    created = models.DateTimeField(editable=False)

    iso = models.ForeignKey(Iso)
    architecture = models.ForeignKey(Architecture)
    iso_type = models.ForeignKey(IsoType)
    boot_type = models.ForeignKey(BootType)
    hardware_type = models.ForeignKey(HardwareType)
    install_type = models.ForeignKey(InstallType)
    source = models.ForeignKey(Source)
    clock_choice = models.ForeignKey(ClockChoice)
    filesystem = models.ForeignKey(Filesystem)
    modules = models.ManyToManyField(Module, null=True, blank=True)
    bootloader = models.ForeignKey(Bootloader)
    rollback_filesystem = models.ForeignKey(Filesystem,
            related_name="rollback_test_set", null=True, blank=True)
    rollback_modules = models.ManyToManyField(Module,
            related_name="rollback_test_set", null=True, blank=True)

    success = models.BooleanField()
    comments = models.TextField(null=True, blank=True)

def set_created_field(sender, **kwargs):
    # We use this same callback for both Isos and Tests
    obj = kwargs['instance']
    if not obj.created:
        obj.created = datetime.utcnow()

from django.db.models.signals import pre_save

pre_save.connect(set_created_field, sender=Iso,
        dispatch_uid="releng.models")
pre_save.connect(set_created_field, sender=Test,
        dispatch_uid="releng.models")

# vim: set ts=4 sw=4 et: