forms.py
1 from typing import Any, Dict 2 3 from django import forms 4 from django.contrib.auth.mixins import LoginRequiredMixin 5 from django.contrib.auth.models import User 6 from django.views.generic.edit import FormView 7 8 from telemetry.models import Coach, Driver 9 10 from .models import Profile 11 12 13 class ProfileForm(forms.ModelForm): 14 class Meta: 15 model = Profile 16 fields = [ 17 "mqtt_drivername", 18 # "publicly_visible", 19 # "newsletter_allowed", 20 ] 21 help_texts = { 22 "mqtt_drivername": "The MQTT drivername in CrewChief", 23 } 24 25 def clean(self): 26 cleaned_data = super().clean() 27 mqtt_drivername = cleaned_data.get("mqtt_drivername").strip() 28 29 driver = Driver.objects.filter(name__iexact=mqtt_drivername).first() 30 if not driver: 31 self.add_error("mqtt_drivername", "Driver name does not exist. Drive some laps first.") 32 else: 33 # find a user with this name, case insensitive 34 profile = Profile.objects.filter(mqtt_drivername__iexact=mqtt_drivername).first() 35 # user = User.objects.filter(first_name=driver_name).first() 36 if profile and profile != self.instance: 37 self.add_error("mqtt_drivername", "This name is already taken.") 38 if mqtt_drivername.lower() == "jim": 39 self.add_error("mqtt_drivername", "No Jim allowed.") 40 41 42 class CoachForm(forms.Form): 43 driver_name = forms.CharField( 44 help_text="The MQTT drivername in CrewChief", 45 widget=forms.TextInput(attrs={"placeholder": "-- CrewChief MQTT drivername --"}), 46 ) 47 # PrependedText('field_name', '@', placeholder="username") 48 49 coach_enabled = forms.BooleanField(required=False) 50 coach_mode = forms.ChoiceField( 51 choices=Coach.MODE_CHOICES, 52 label="coaching mode", 53 ) 54 55 # message = forms.CharField(widget=forms.Textarea) 56 57 # def send_email(self): 58 # # send email using the self.cleaned_data dictionary 59 # pass 60 61 def __init__(self, *args, **kwargs): 62 """Grants access to the request object so that only members of the current user 63 are given as options""" 64 65 self.request = kwargs.pop("request") 66 super(CoachForm, self).__init__(*args, **kwargs) 67 # self.fields['members'].queryset = Member.objects.filter( 68 # user=self.request.user) 69 70 71 class CoachView(LoginRequiredMixin, FormView): 72 template_name = "coach.html" 73 form_class = CoachForm 74 success_url = "/coach/" 75 76 # def setup(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: 77 # super().setup(request, *args, **kwargs) 78 79 def get_form_kwargs(self): 80 """Passes the request object to the form class. 81 This is necessary to only display members that belong to a given user""" 82 83 kwargs = super(CoachView, self).get_form_kwargs() 84 # https://medium.com/analytics-vidhya/django-how-to-pass-the-user-object-into-form-classes-ee322f02948c 85 kwargs["request"] = self.request 86 return kwargs 87 88 # def get_messages(self, coach: Coach): 89 # if not coach.fast_lap: 90 # return [] 91 92 # history = History() 93 # pitcrew_coach = PitcrewCoach(history, coach) 94 # pitcrew_coach.track_walk = coach.track_walk 95 # filter = { 96 # "Driver": coach.driver.name, 97 # "GameName": coach.fast_lap.game.name, 98 # "TrackCode": coach.fast_lap.track.name, 99 # "CarModel": coach.fast_lap.car.name, 100 # "SessionId": 666, 101 # } 102 # history.set_filter(filter) 103 # history.init() 104 # pitcrew_coach.init_messages() 105 # messages = [] 106 # telemetry = {} 107 # for distance in range(0, history.track_length): 108 # responses = pitcrew_coach.collect_responses(distance, telemetry) 109 # messages.extend(responses) 110 111 # return messages 112 113 def get_context_data(self, **kwargs): 114 """Use this to add extra context.""" 115 context = super(CoachView, self).get_context_data(**kwargs) 116 # context['coach'] = self.request.session['message'] 117 context["coach"] = "Coach" 118 if self.coach: 119 context["coach"] = self.coach 120 # context["messages"] = self.get_messages(self.coach) 121 return context 122 123 def get_initial(self) -> Dict[str, Any]: 124 user_name = self.request.user.first_name 125 126 self.coach = None 127 coach_enabled = False 128 coach_mode = Coach.MODE_DEFAULT 129 driver_name = None 130 131 driver = Driver.objects.filter(name=user_name).first() 132 if driver: 133 driver_name = driver.name 134 self.coach = Coach.objects.get_or_create(driver=driver)[0] 135 coach_enabled = self.coach.enabled 136 coach_mode = self.coach.mode 137 138 data = { 139 "driver_name": driver_name, 140 "coach_enabled": coach_enabled, 141 "coach_mode": coach_mode, 142 } 143 return data 144 145 def form_valid(self, form): 146 # This method is called when valid form data has been POSTed. 147 # It should return an HttpResponse. 148 # form.send_email() 149 # form.logged_in_user = self.request.user 150 151 # does another user exist with this name? 152 driver_name = form.cleaned_data["driver_name"].strip() 153 user = User.objects.filter(first_name=driver_name).first() 154 155 if not user or user == self.request.user: 156 # driver = Driver.objects.filter(name=form.cleaned_data["driver_name"]).first() 157 self.request.user.first_name = form.cleaned_data["driver_name"] 158 driver = Driver.objects.filter(name=driver_name).first() 159 if driver: 160 coach = Coach.objects.get_or_create(driver=driver)[0] 161 coach.enabled = form.cleaned_data["coach_enabled"] 162 coach.mode = form.cleaned_data["coach_mode"] 163 coach.save() 164 165 self.request.user.save() 166 return super().form_valid(form) 167 168 # def get(self, request, *args, **kwargs): 169 # # fastlap = get_object_or_404(FastLap, pk=fastlap_id) 170 # # context = {"fastlap": fastlap, "segments": fastlap.fast_lap_segments.all()} # type: ignore 171 172 # # get the logged in user 173 # # driver = Driver.objects.get(user=request.user) 174 # context = { 175 # "coach": request.user.first_name, 176 # } # type: ignore 177 # # return render(request, template_name="coach.html", context=context) 178 # kwargs["context"] = context 179 # return super().get(request, *args, **kwargs)