From c9fbdacedecd49e0c42702a6cfaf804e2b24574f Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 10 Dec 2021 11:18:48 -0600 Subject: [PATCH] consolidated player-table to consolidate, had to move the filtering to the context instead of the template (probably the right way to do it anyway) also switched from using display to using class to hide cells (also probably the more right/consistent way to do this) --- lineups/models.py | 2 +- lineups/templates/lineups/lineup.html | 76 ++++++++-------- .../lineups/player-table-header.html | 8 -- .../templates/lineups/player-table-row.html | 70 --------------- lineups/templates/lineups/player-table.html | 86 +++++++++++++++++++ lineups/views.py | 57 ++++++++---- 6 files changed, 165 insertions(+), 134 deletions(-) delete mode 100644 lineups/templates/lineups/player-table-header.html delete mode 100644 lineups/templates/lineups/player-table-row.html create mode 100644 lineups/templates/lineups/player-table.html diff --git a/lineups/models.py b/lineups/models.py index 2dd59ca..679e3d6 100644 --- a/lineups/models.py +++ b/lineups/models.py @@ -20,7 +20,7 @@ class Positioning(models.Model): ('DH','DH') ] position = models.CharField(choices=positions, default=None, max_length=2, null=True, blank=True) - order = models.PositiveSmallIntegerField(default=0, null=True) + order = models.PositiveSmallIntegerField(default=None, null=True) class Meta: unique_together = ('player', 'event',) diff --git a/lineups/templates/lineups/lineup.html b/lineups/templates/lineups/lineup.html index ae91909..a288036 100644 --- a/lineups/templates/lineups/lineup.html +++ b/lineups/templates/lineups/lineup.html @@ -33,33 +33,30 @@ {% csrf_token %} {{ formset.management_form }}
+{# #}
-
Lineup
- - {% include 'lineups/player-table-header.html' %} - - {% for form in formset %} - {% if form.instance.order or form.instance.position == "P" %} - {% include 'lineups/player-table-row.html' with form=form available_display="none" order_display="table-cell" %} - {% endif %} - {% endfor %} - -
- +
+
DH'd
+
+ {% include 'lineups/player-table.html' with table_id="dhd" formset=formset_dhd available_class="d-none" order_class="d-none"%} +
+
+
+
Lineup
+
+ {% include 'lineups/player-table.html' with table_id="lineup" formset=formset_lineup available_class="d-none"%} +
+
+
-
Players
- - {% include 'lineups/player-table-header.html' %} - - {% for form in formset|dictsortreversed:"availability.available"%} - {% if not form.instance.order and not form.instance.position == "P" %} - {% include 'lineups/player-table-row.html' with form=form available_display="table-cell" order_display="none" %} - {% endif %} - {% endfor %} - -
+
+
Bench
+
+ {% include 'lineups/player-table.html' with table_id="bench" formset=formset_bench order_class="d-none"%} +
+
@@ -89,6 +86,16 @@ form_element_order.value = parseInt(player_rows[i].dataset.order) } } + var lineup = new Sortable.create( + document.getElementById('dhd'), { + animation: 150, + ghostClass: "ghost", + {#handle: ".bars-move",#} + group: { + put: true, + pull: true + } + }) var lineup = new Sortable.create( document.getElementById('lineup'), { animation: 150, @@ -99,6 +106,7 @@ pull:true }, onAdd: function (/**Event*/evt) { + // Add to Lineup var itemEl = evt.item; // dragged HTMLElement var player_id = itemEl.dataset.playerId console.log(itemEl) @@ -110,16 +118,10 @@ toggle_in_lineup(player_order_button) player_order.parentElement.dataset.order = evt.newIndex refresh_lineup_order() - player_available.parentElement.style.display="none" - player_order.style.display="table-cell" - evt.to; // target list - evt.from; // previous list - evt.oldIndex; // element's old index within old parent - evt.newIndex; // element's new index within new parent - evt.oldDraggableIndex; // element's old index within old parent, only counting draggable elements - evt.newDraggableIndex; // element's new index within new parent, only counting draggable elements - evt.clone // the clone element - evt.pullMode; // when item is in another sortable: `"clone"` if cloning, `true` if moving + {#player_available.parentElement.style.display="none"#} + player_available.parentElement.classList.add('d-none') + {#player_order.style.display="table-cell"#} + player_order.classList.remove('d-none') }, onUpdate: function (/**Event*/evt) { console.log('update to lineup') @@ -144,10 +146,12 @@ var form_element_order =itemEl.querySelector('[id$="order"]') var player_order = itemEl.querySelector('[id^="player-order"]') var player_available =itemEl.querySelector('[id^="player-available"]') - player_available.parentElement.style.display="table-cell" + {#player_available.parentElement.style.display="table-cell"#} + player_available.parentElement.classList.remove('d-none') form_element_order.value = 0 player_order.innerHTML = 1 - player_order.style.display="none" + {#player_order.style.display="none"#} + player_order.classList.add('d-none') var player_id = itemEl.dataset.playerId refresh_lineup_order() } @@ -167,7 +171,7 @@ player_row.dataset.order = 0 } refresh_lineup_order() - } + } diff --git a/lineups/templates/lineups/player-table-header.html b/lineups/templates/lineups/player-table-header.html deleted file mode 100644 index f5380df..0000000 --- a/lineups/templates/lineups/player-table-header.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Name - Pos - - \ No newline at end of file diff --git a/lineups/templates/lineups/player-table-row.html b/lineups/templates/lineups/player-table-row.html deleted file mode 100644 index 6697528..0000000 --- a/lineups/templates/lineups/player-table-row.html +++ /dev/null @@ -1,70 +0,0 @@ - - {{ form.id.as_hidden }} - {{ form.event.as_hidden }} - {{ form.order.as_hidden }} - {{ form.player.as_hidden }} - - {% if form.availability.available == 2 %} - - Yes - {% elif form.availability.available == 1%} - - Maybe - {% elif form.availability.available == 0%} - - No - {% elif form.availability.available == -1%} - - Unknown - {% endif %} - - - {% if form.order.value %} - - {% elif form.order.value == 0 %} - - {% endif %} - - - {{ form.instance.player.first_name }} {{ form.instance.player.last_name }}  - #{{ form.instance.player.jersey_number }}
- {{ form.statline }} - - - {{ form.position }} - - {# {{ form.instance.position }}#} - \ No newline at end of file diff --git a/lineups/templates/lineups/player-table.html b/lineups/templates/lineups/player-table.html new file mode 100644 index 0000000..0be2593 --- /dev/null +++ b/lineups/templates/lineups/player-table.html @@ -0,0 +1,86 @@ + + + + {# #} + {# #} + {# #} + {# #} + + + + {% for form in formset %} + + {{ form.id.as_hidden }} + {{ form.event.as_hidden }} + {{ form.order.as_hidden }} + {{ form.player.as_hidden }} + {{ form.teamsnap_id.as_hidden }} + + + + + {# #} + + {% endfor %} + +
NamePos
+ {% if form.availability.available == 1 %} + + {% elif form.availability.available == 2%} + + Yes + {% elif form.availability.available == 0%} + + No + {% else %} + + Unknown + {% endif %} + + {% if form.order.value %} + + {% elif form.order.value == 0 %} + + {% endif %} + + {{ form.instance.player.first_name }} {{ form.instance.player.last_name }}  + #{{ form.instance.player.jersey_number }} + {#
{{ form.statline }}#} +
+ {{ form.position }} + {{ form.instance.position }}
\ No newline at end of file diff --git a/lineups/views.py b/lineups/views.py index 9eea7dd..c5696f0 100644 --- a/lineups/views.py +++ b/lineups/views.py @@ -5,6 +5,13 @@ from events.models import Event from players.models import Player from django.forms.models import model_to_dict from django.db.models import Q +from django.db.models import Case, When + +def queryset_from_ids(Model, id_list): + #https://stackoverflow.com/questions/4916851/django-get-a-queryset-from-array-of-ids-in-specific-order + preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(id_list)]) + queryset = Model.objects.filter(pk__in=id_list).order_by(preserved) + return queryset # Create your views here. def edit(request, event_id): @@ -31,6 +38,7 @@ def edit(request, event_id): return render(request, 'success.html', {'call_back':'edit lineup','id':event_id, 'errors':[error for error in formset.errors if error]}, status=200) # return render(request, 'success.html', {'call_back':'schedule'}) previous_event = Event.objects.get(id=event_id-1) + event = Event.objects.get(id=event_id) next_event = Event.objects.get(id=event_id+1) players = Player.objects.all().prefetch_related('availability_set', 'statline_set', 'positioning_set') @@ -41,36 +49,47 @@ def edit(request, event_id): } for player in players } + players = Player.objects.prefetch_related('availability_set', 'positioning_set') # players_d.sort(key=lambda d: (-d['availability'].available, d['last_name'])) - players_with_positioning = [i.player for i in Positioning.objects.filter(event_id=event_id)] - players_without_positioning = [i for i in players if i not in players_with_positioning] - Positioning.objects.bulk_create([Positioning(event_id=event_id, player=player) for player in players_without_positioning]) - qset = Positioning.objects.filter(event_id=event_id) + for player in players: + Positioning.objects.get_or_create(player_id=player.id, event_id=event_id) - formset = PositioningFormSet(queryset=qset.order_by('order')) - pass - formset_starting = PositioningFormSet( - queryset=Positioning.objects.exclude(order__isnull=True).filter(event_id=event_id)) - formset_bench = PositioningFormSet( - queryset=Positioning.objects.exclude(order__isnull=False).filter(event_id=event_id)) + qs_starting_lineup = Positioning.objects.filter(event_id=event_id, order__isnull=False).order_by( + 'order') + qs_bench = Positioning.objects.filter(event_id=event_id, order__isnull=True).prefetch_related( + 'player__availability_set').order_by('player__last_name') + + # This is all a compromise to get the sorting just the way I wanted. THERE'S GOT TO BE A BETTER WAY + ids_starting_lineup = [item.id for item in qs_starting_lineup] + ids_bench_available = [item.id for item in qs_bench + if item.player.availability_set.get(event_id=event_id).available == 2] + ids_bench_maybe = [item.id for item in qs_bench + if item.player.availability_set.get(event_id=event_id).available == 1] + ids_bench_no = [item.id for item in qs_bench + if item.player.availability_set.get(event_id=event_id).available == 0] + ids_bench_unknown = [item.id for item in qs_bench + if item.player.availability_set.get(event_id=event_id).available == -1] + qset = queryset_from_ids(Positioning, + ids_starting_lineup + ids_bench_available + ids_bench_maybe + ids_bench_no + ids_bench_unknown) + + formset = PositioningFormSet(queryset=qset) for f in formset: if f.instance.player_id: f.availability = f.instance.player.availability_set.get(event_id=event_id) - f.statline = f.instance.player.statline_set.get() - + # f.statline = f.instance.player.statline_set.get() + formset_lineup = [f for f in formset if f.instance.order] + formset_dhd = [f for f in formset if not f.instance.order and f.instance.position] + formset_bench = [f for f in formset if f not in formset_lineup and f not in formset_dhd] return render(request, 'lineups/lineup.html', {'title': 'Lineup', - 'events_tab':'active', - 'previous_event':previous_event, 'event': event, + 'previous_event': previous_event, 'next_event': next_event, - 'players_info': players_info, 'formset': formset, - # 'players': players_d, - # 'positionings_players_initial':[player for player in players if player['positioning']], - 'formset_starting':formset_starting, - 'formset_bench':formset_bench + 'formset_lineup':formset_lineup, + 'formset_bench':formset_bench, + 'formset_dhd': formset_dhd }) \ No newline at end of file