from django.conf import settings from django.db import transaction from django.forms import ModelForm from board.models import Post, Report, 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 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()