Files
@ 1f83c2fb6966
Branch filter:
Location: website/conservancy/usethesource/models.py - annotation
1f83c2fb6966
2.3 KiB
text/x-python
Fix sustainer form default
cadd69061f18 cadd69061f18 cc3224bb60dd cc3224bb60dd 1b1e2b994fc7 2a23a0a55ea0 cc3224bb60dd cc3224bb60dd 3cccc3bdd90e 3cccc3bdd90e 3cccc3bdd90e 3cccc3bdd90e 3cccc3bdd90e cc3224bb60dd cadd69061f18 cadd69061f18 cc3224bb60dd cc3224bb60dd cc3224bb60dd cc3224bb60dd cadd69061f18 cadd69061f18 cc3224bb60dd cc3224bb60dd 296f29c84bb2 7a682ed6d0ff 3cccc3bdd90e 7a682ed6d0ff 7a682ed6d0ff 7a682ed6d0ff cc3224bb60dd cc3224bb60dd cc3224bb60dd cc3224bb60dd 1b1e2b994fc7 1b1e2b994fc7 1b1e2b994fc7 cc3224bb60dd cc3224bb60dd cadd69061f18 cadd69061f18 cc3224bb60dd cc3224bb60dd 9ff46824209a 2a23a0a55ea0 cc3224bb60dd cadd69061f18 cc3224bb60dd cc3224bb60dd cadd69061f18 cadd69061f18 cadd69061f18 cadd69061f18 cadd69061f18 cadd69061f18 cadd69061f18 cadd69061f18 cadd69061f18 3cccc3bdd90e cadd69061f18 cadd69061f18 cadd69061f18 cadd69061f18 cadd69061f18 cadd69061f18 3cccc3bdd90e cc3224bb60dd cc3224bb60dd cc3224bb60dd | import uuid
from django.contrib.auth.models import User
from django.db import models
from django.urls import reverse
from django.utils import timezone
def gen_message_id():
"""Generate a time-based identifier for use in "In-Reply-To" header."""
return f'<{uuid.uuid1()}@sfconservancy.org>'
class Candidate(models.Model):
"""A source/binary release we'd like to verify CCS status of."""
name = models.CharField('Candidate name', max_length=50)
slug = models.SlugField(max_length=50, unique=True)
vendor = models.CharField('Vendor name', max_length=50)
device = models.CharField('Device name', max_length=50)
release_date = models.DateField(null=True, blank=True)
description = models.TextField(blank=True)
source_url = models.URLField()
binary_url = models.URLField(blank=True)
show_download_disclaimer = models.BooleanField(default=True)
ordering = models.SmallIntegerField(default=0)
email_message_id = models.CharField(max_length=255, default=gen_message_id)
class Meta:
ordering = ['ordering', 'name']
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('usethesource:candidate', kwargs={'slug': self.slug})
class Comment(models.Model):
"""A comment about experiences or learnings building the candidate."""
candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.PROTECT)
attribute_to = models.CharField(max_length=50, blank=True)
time = models.DateTimeField(default=timezone.now)
message = models.TextField()
email_message_id = models.CharField(max_length=255, default=gen_message_id)
def __str__(self):
return f'{self.id}: {self.candidate.name}, {self.user}, {self.time}'
def _find_previous_comment(self):
try:
return self.__class__.objects.filter(candidate=self.candidate, id__lt=self.id).latest('id')
except self.__class__.DoesNotExist:
return None
def in_reply_to(self):
"""Determine the message_id of the previous comment or the candidate.
Used for email threading.
"""
if prev_comment := self._find_previous_comment():
return prev_comment.email_message_id
else:
return self.candidate.email_message_id
class Meta:
ordering = ['id']
|