Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ## Models.py ##
- class MathPlacement(models.Model):
- BLUE = "bg-primary-200"
- GREEN = "bg-success-200"
- YELLOW = "bg-warning-200"
- RED = "bg-danger-200"
- PLACEMENT_COLOR_CHOICES = [
- (BLUE, "Blue"),
- (GREEN, "Green"),
- (YELLOW, "Yellow"),
- (RED, "Red"),
- ]
- id = models.IntegerField(db_column="mathPlacementID", primary_key=True)
- placement_data = models.OneToOneField(
- MathPlacementData,
- on_delete=models.PROTECT,
- related_name="%(class)s_datas",
- db_column="placement_person_id",
- to_field="person",
- )
- color = models.CharField(
- max_length=15, choices=PLACEMENT_COLOR_CHOICES, null=True, blank=True
- )
- class Meta:
- verbose_name = "Placement"
- verbose_name_plural = "Placements"
- managed = getattr(settings, "UNDER_TEST", False)
- db_table = "[schema_b].[mathPlacement]"
- ## Views.py ##
- # MathPlacement ListView (Initial view to list out all placements)
- class MathPlacementListView(ListView):
- model = MathPlacement
- template_name = "math_placements/mathplacement_list.html"
- context_object_name = "math_placements"
- def get_queryset(self) -> QuerySet:
- # logic to get placements
- return placements
- def get_context_data(self, **kwargs) -> dict:
- context = super().get_context_data(**kwargs)
- context["placement_colors"] = MathPlacement.PLACEMENT_COLOR_CHOICES
- context["courses"] = MathPlacementCourse.objects.all()
- return context
- # MathPlacement UpdateView (handles the POST from htmx when a user selects a color)
- class MathPlacementUpdateView(UpdateView):
- model = MathPlacement
- fields = [
- "color",
- ]
- template_name = "math_placements/snippets/mathplacement_update_form.html"
- context_object_name = "placement"
- http_method_names = ["post"]
- def get_success_url(self):
- return reverse_lazy(
- "math_placements:math-placement-detail", args=[str(self.object.pk)]
- )
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context["placement_colors"] = MathPlacement.PLACEMENT_COLOR_CHOICES
- return context
- def form_invalid(self, form):
- # TODO: handle errors in the form if they exist
- return super().form_invalid(form)
- def form_valid(self, form):
- return super().form_valid(form)
- # MathPlacement DetailView (called to return the template of the element updated)
- class MathPlacementDetailView(DetailView):
- model = MathPlacement
- template_name = "math_placements/snippets/mathplacement_update_form.html"
- context_object_name = "placement"
- http_method_names = ["get"]
- def get_context_data(self, **kwargs) -> dict:
- context = super().get_context_data(**kwargs)
- context["courses"] = MathPlacementCourse.objects.all()
- context["placement_colors"] = MathPlacement.PLACEMENT_COLOR_CHOICES
- return context
- ## mathplacement_update_form.html ##
- <form id="placementUpdateForm" action="{{ placement.get_update_url }}" method="post" hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'>
- <!-- hidden inputs for the form submission -->
- <input type="hidden" name="id" value="{{ placement.id }}">
- <input type="hidden" name="placement_data" value="{{ placement.placement_data.pk }}">
- <label for="color">Color</label>
- <select name="color" id="color{{ placement.pk }}" class="form-select" hx-post="{% url 'math_placements:math-placement-update' placement.pk %}" hx-target="closest #placementUpdateForm" hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'>
- <option value="" {% if not placement.color %}selected{% endif %}>
- Default
- </option>
- {% for value, display_name in placement_colors %}
- <option value="{{ value }}" {% if value == placement.color %}selected{% endif %}>{{ display_name }}</option>
- {% endfor %}
- </select>
- </form>
- ## mathplacement_list.html ##
- {% block content %}
- {% for placement in math_placements %}
- {% include 'math_placements/snippets/mathplacement_update_form.html' %}
- {% endfor %}
- {% endblock %}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement