118 lines
4.2 KiB
Python
118 lines
4.2 KiB
Python
from django.db import models
|
|
|
|
# Create your models here.
|
|
|
|
|
|
class TimestampedMixin:
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
modified = models.DateTimeField(auto_now=True)
|
|
|
|
|
|
class Timestamped(models.Model):
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
modified = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
|
|
class WebURL(Timestamped):
|
|
url = models.URLField(max_length=4096, blank=False,
|
|
null=False, unique=True)
|
|
|
|
@classmethod
|
|
def get_or_create(cls, url) -> 'WebURL':
|
|
o = cls.objects.filter(url=url).first()
|
|
if o is None:
|
|
o = cls(url=url)
|
|
o.save()
|
|
return o
|
|
|
|
|
|
class ReportLineGenerator(Timestamped):
|
|
name = models.CharField(max_length=255, blank=False,
|
|
null=False, unique=True)
|
|
|
|
@classmethod
|
|
def get_or_create(cls, name) -> 'ReportLineGenerator':
|
|
o = cls.objects.filter(name=name).first()
|
|
if o is None:
|
|
o = cls(name=name)
|
|
o.save()
|
|
return o
|
|
|
|
|
|
class ReportLineIssuePattern(Timestamped):
|
|
name = models.CharField(max_length=255, blank=False,
|
|
null=False, unique=True)
|
|
|
|
@classmethod
|
|
def get_or_create(cls, name) -> 'ReportLineIssuePattern':
|
|
o = cls.objects.filter(name=name).first()
|
|
if o is None:
|
|
o = cls(name=name)
|
|
o.save()
|
|
return o
|
|
|
|
|
|
class ReportLineSubjectOfConcern(Timestamped):
|
|
name = models.CharField(max_length=255, blank=False,
|
|
null=False, unique=True)
|
|
|
|
@classmethod
|
|
def get_or_create(cls, name) -> 'ReportLineSubjectOfConcern':
|
|
o = cls.objects.filter(name=name).first()
|
|
if o is None:
|
|
o = cls(name=name)
|
|
o.save()
|
|
return o
|
|
|
|
|
|
class RequestedReport(Timestamped):
|
|
depth = models.SmallIntegerField()
|
|
|
|
@property
|
|
def children(self):
|
|
return self.reports.filter(parent=None)
|
|
|
|
|
|
class PageReport(Timestamped):
|
|
request = models.ForeignKey(
|
|
to=RequestedReport, on_delete=models.CASCADE, blank=False, null=False, related_name='reports')
|
|
parent = models.ForeignKey(
|
|
to='PageReport', on_delete=models.CASCADE, blank=True, null=True, related_name='children')
|
|
url = models.ForeignKey(
|
|
to=WebURL, on_delete=models.CASCADE, blank=False, null=False, related_name='reports')
|
|
found_urls = models.TextField(default='', blank=True, null=False)
|
|
element_count = models.IntegerField()
|
|
remaining_depth = models.SmallIntegerField()
|
|
|
|
@ property
|
|
def depth(self):
|
|
return self.request.depth - self.remaining_depth
|
|
|
|
|
|
class PageReportLine(Timestamped):
|
|
report = models.ForeignKey(
|
|
to=PageReport, on_delete=models.CASCADE, blank=False, null=False, related_name='lines')
|
|
generator = models.ForeignKey(
|
|
to=ReportLineGenerator, on_delete=models.CASCADE, blank=False, null=False, related_name='lines')
|
|
pattern = models.ForeignKey(
|
|
to=ReportLineIssuePattern, on_delete=models.CASCADE, blank=False, null=False, related_name='lines')
|
|
message = models.TextField(default='', blank=True, null=False)
|
|
snippet = models.TextField(default='', blank=True, null=False)
|
|
location_css = models.TextField(default=None, blank=True, null=True)
|
|
location_xpath = models.TextField(default=None, blank=True, null=True)
|
|
location_aria = models.TextField(default=None, blank=True, null=True)
|
|
line_start = models.IntegerField(default=None, blank=True, null=True)
|
|
line_end = models.IntegerField(default=None, blank=True, null=True)
|
|
column_start = models.IntegerField(default=None, blank=True, null=True)
|
|
column_end = models.IntegerField(default=None, blank=True, null=True)
|
|
highlight_start = models.IntegerField(default=None, blank=True, null=True)
|
|
highlight_end = models.IntegerField(default=None, blank=True, null=True)
|
|
passed = models.BooleanField(default=False, blank=True, null=False)
|
|
severity = models.CharField(max_length=255, blank=False, null=False)
|
|
severity_int = models.IntegerField(default=0, blank=False, null=False)
|
|
subject_of_concern = models.ForeignKey(
|
|
to=ReportLineSubjectOfConcern, on_delete=models.CASCADE, blank=False, null=False, related_name='lines')
|