Files
interchan/board/forms.py

77 lines
2.2 KiB
Python
Raw Normal View History

from django.conf import settings
from django.db import transaction
from django.db.models import Q
from django.forms import ModelForm, ModelChoiceField
from board.models import Post, Report, ReportReason, ReportRecord
from hcaptcha.fields import hCaptchaField
class PostForm(ModelForm):
"""
A form used for new threads for posts.
This requires the board and the IP address to be specified.
"""
hcaptcha = hCaptchaField() if settings.USE_HCAPTCHA else None
class Meta:
model = Post
fields = ["subject", "name", "text", "image"]
def __init__(self, *args, board, ip, **kwargs):
super(PostForm, self).__init__(*args, **kwargs)
self.instance.board = board
self.instance.ip = ip
class ReplyForm(PostForm):
"""
A form used for replies to posts.
This requires the OP post, the reply post, the board, and the IP address be
specified.
"""
hcaptcha = hCaptchaField() if settings.USE_HCAPTCHA else None
class Meta:
model = Post
fields = ["name", "text", "bump", "image"]
def __init__(self, *args, op, reply, **kwargs):
super(ReplyForm, self).__init__(*args, **kwargs)
self.instance.op = op
self.instance.reply = reply
class ReportForm(ModelForm):
"""
A form used to create reports on posts.
This requires the board and the IP address to be specified.
"""
# uses report_form.html
class Meta:
model = Report
fields = ["reason"]
def __init__(self, *args, op, board, ip, **kwargs):
super(ReportForm, self).__init__(*args, **kwargs)
self.instance.ip = ip
self.op = op
queryset = ReportReason.objects.filter(Q(board=None) | Q(board=board))
self.fields["reason"] = ModelChoiceField(queryset=queryset)
def clean(self):
# Get or create the record before creating the model
with transaction.atomic():
try:
record = ReportRecord.objects.get(post=self.op)
except ReportRecord.DoesNotExist:
record = ReportRecord.objects.create(post=self.op)
self.instance.record = record
return super(ReportForm, self).clean()