|
1
|
"""Django-backed forum posts for projects. |
|
2
|
|
|
3
|
Supplements Fossil's native forum. Fossil's forum is tightly coupled to its |
|
4
|
HTTP server and doesn't expose a CLI for creating posts, so we store |
|
5
|
Django-side forum posts and display them alongside Fossil-native posts. |
|
6
|
""" |
|
7
|
|
|
8
|
from django.db import models |
|
9
|
|
|
10
|
from core.models import ActiveManager, Tracking |
|
11
|
|
|
12
|
|
|
13
|
class ForumPost(Tracking): |
|
14
|
"""Django-backed forum post for projects. Supplements Fossil's native forum.""" |
|
15
|
|
|
16
|
repository = models.ForeignKey("fossil.FossilRepository", on_delete=models.CASCADE, related_name="forum_posts") |
|
17
|
title = models.CharField(max_length=500, blank=True, default="") # empty for replies |
|
18
|
body = models.TextField() |
|
19
|
parent = models.ForeignKey("self", null=True, blank=True, on_delete=models.CASCADE, related_name="replies") |
|
20
|
# Thread root -- self-referencing for threading |
|
21
|
thread_root = models.ForeignKey("self", null=True, blank=True, on_delete=models.CASCADE, related_name="thread_posts") |
|
22
|
|
|
23
|
objects = ActiveManager() |
|
24
|
all_objects = models.Manager() |
|
25
|
|
|
26
|
class Meta: |
|
27
|
ordering = ["created_at"] |
|
28
|
|
|
29
|
def __str__(self): |
|
30
|
return self.title or f"Reply by {self.created_by}" |
|
31
|
|
|
32
|
@property |
|
33
|
def is_reply(self): |
|
34
|
return self.parent is not None |
|
35
|
|