Source code for club_sessions.forms

from django import forms
from django.core.exceptions import ValidationError
from django_summernote.widgets import SummernoteInplaceWidget

from accounts.models import UnregisteredUser, User
from club_sessions.views.core import PLAYING_DIRECTOR, SITOUT, VISITOR
from club_sessions.models import Session, SessionType, SessionEntry
from cobalt.settings import BRIDGE_CREDITS
from organisations.models import OrgVenue
from organisations.club_admin_core import (
    get_membership_type,
)
from payments.models import OrgPaymentMethod


[docs] class SessionForm(forms.ModelForm): """Session Form"""
[docs] class Meta: model = Session fields = [ "director", "session_type", "session_date", "description", "venue", "time_of_day", "additional_session_fee", "additional_session_fee_reason", "default_secondary_payment_method", "director_notes", ]
director_notes = forms.CharField( required=False, widget=SummernoteInplaceWidget( attrs={ "summernote": { "height": "250", "placeholder": "<br><br>(Optional) Placeholder for notes about the session", } } ), ) def __init__(self, *args, **kwargs): # Get club parameter so we can build correct choice lists club = kwargs.pop("club", None) # Call Super() super().__init__(*args, **kwargs) # See if there are venues venues = OrgVenue.objects.filter(organisation=club, is_active=True).values_list( "id", "venue" ) if venues.count() > 0: self.fields["venue"].choices = venues else: del self.fields["venue"] # Handle session types session_types = SessionType.objects.filter( organisation=club, status=True ).values_list("id", "name") if session_types.count() > 0: self.fields["session_type"].choices = session_types else: self.fields["session_type"].choices = [ ("", "Error - No session types defined") ] # Handle default_secondary_payment_methods org_payment_types = ( OrgPaymentMethod.objects.filter(organisation=club, active=True) .exclude(payment_method="Bridge Credits") .values_list("id", "payment_method") ) self.fields["default_secondary_payment_method"].choices = org_payment_types if club.default_secondary_payment_method: self.fields[ "default_secondary_payment_method" ].initial = club.default_secondary_payment_method.id
[docs] def clean_session_type(self): """validate session type - don't allow changes if payments made""" data = self.cleaned_data["session_type"] # If no change, don't worry if "session_type" not in self.changed_data: return data # See if any payments have been made, if so reject change if ( SessionEntry.objects.filter(session=self.instance, is_paid=True) .exclude(system_number__in=[PLAYING_DIRECTOR, SITOUT]) .exists() ): raise ValidationError( "Cannot change session type as payments have been made" ) return data
[docs] def clean_description(self): """remove "; from description in case someone deliberately wants it to fail. Least likely code to ever run""" return self.cleaned_data["description"].replace('";', "")
[docs] class UserSessionForm(forms.Form): """Form for the screen to allow editing a single user in a session Has a bit of a mixture of things on it from multiple places """ fee = forms.DecimalField(min_value=0) is_paid = forms.BooleanField(label="Is Processed", required=False) payment_method = forms.ChoiceField() def __init__(self, *args, **kwargs): # Get parameters club = kwargs.pop("club", None) session_entry = kwargs.pop("session_entry", None) # Call Super() super().__init__(*args, **kwargs) # Abuse the form to add some other fields to it # See if user is a member if session_entry.system_number in [PLAYING_DIRECTOR, SITOUT, VISITOR]: self.membership_type = None else: self.membership_type = get_membership_type( club, session_entry.system_number ) self.is_member = self.membership_type is not None # Try to load User - Note: Player may end up as a User or an Unregistered User self.player = ( User.objects.filter(system_number=session_entry.system_number) .exclude(system_number__in=[PLAYING_DIRECTOR, SITOUT, VISITOR]) .first() ) # Try to load un_reg if not a member if self.player: self.is_user = True self.is_valid_number = True self.player_type = "Registered User" else: self.player = UnregisteredUser.objects.filter( system_number=session_entry.system_number ).first() self.is_user = False # See if this is even a valid system_number, if neither are true. Usually we add the un_reg automatically if self.player: self.is_un_reg = True self.is_valid_number = True self.player_type = "Unregistered User" # self.fields["player_no"].initial = self.player.id # else: # # TODO: Add later # invalid_number = True # Add values self.fields["fee"].initial = session_entry.fee self.fields["is_paid"].initial = session_entry.is_paid # Get payment method choices all_payment_methods = OrgPaymentMethod.objects.filter( organisation=club, active=True ).values_list("id", "payment_method") # Only allow Bridge Credits and IOUs for real users payment_methods = [] for all_payment_method in all_payment_methods: if self.is_user or all_payment_method[1] not in [BRIDGE_CREDITS, "IOU"]: payment_methods.append(all_payment_method) self.fields["payment_method"].choices = payment_methods if session_entry.payment_method: self.fields["payment_method"].initial = session_entry.payment_method.id
[docs] class FileImportForm(forms.Form): """Session file upload form""" file = forms.FileField()