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)