Home > Django > djangofantalega: Asta di riparazione

djangofantalega: Asta di riparazione

15 Novembre 2016

11 – Asta di riparazione

Il 31 Gennaio scade il vero mercato di riparazione. Da lì in avanti
si organizza l’asta di riparazione.
Una squadra deve avere la possibilità di vendere un giocatore ed incrementare
il suo budget.

Nella template di ogni singola squadra è presente un pulsante ‘sell players for repair session’
Colleghiamo il pulsante alla view team_details:

...
@login_required
def team_details(request, league_id, team_id):
    ...
    if request.GET.get('sale'):
        return redirect('sale', league.id, team.id)
    return render(request, 'fantalega/team.html', context)

inseriamo la url:

...
    # player sale url
    url(r'^leagues/(?P<league_id>[0-9]+)/teams/'
        r'(?P<team_id>[0-9]+)/player_sale$', views.sale, name='sale'),
]

Aggiungere nel file fantalega\views.py la nuove vista:

...
@login_required
def sale(request, league_id, team_id):
    league = get_object_or_404(League, pk=int(league_id))
    team = get_object_or_404(Team, pk=int(team_id))
    team_players = [(p.code, "%s [%s]" % (p.name, p.role))
                    for p in team.player_set.all()]
    form = TeamSellPlayersForm(request.POST,
                               initial={'team_players': team_players,
                                        'team': team, 'league': league})
    if request.GET.get('back_to_team_details'):
        return redirect('team_details', league.id, team.id)
    if request.method == "POST":
        if form.is_valid():
            players_to_sell = [Player.get_by_code(int(code),
                                                  season=league.season)
                               for code in form.cleaned_data['team_players']]

            gain = 0
            for player in players_to_sell:
                team.player_set.remove(player)
                gain += player.cost
                team.budget += player.cost
                team.save()
            messages.success(request, "Players sold correctly! You gain: %s" %
                             gain)
            return redirect('team_details', league.id, team.id)
    return render(request, 'fantalega/sell.html',
                  {'form': form, 'team_players': team_players, 'team': team,
                   'league': league})

il form che permetterà la vendita di un giocatore sarà:

...
class TeamSellPlayersForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.dict_values = kwargs.pop('initial')
        super(TeamSellPlayersForm, self).__init__(*args, **kwargs)
        self.fields['team_players'] = forms.MultipleChoiceField(
            choices=self.dict_values['team_players'],
            widget=forms.CheckboxSelectMultiple())

e andrà importato nel file fantalega/views.py:

from .forms import TeamSellPlayersForm
...

Ora la template:

templates/sell.html

{% extends 'fantalega/base.html' %}
{% load bootstrap3 %}

{% block content %}
    <b>Upload lineup for <font color="green">{{ team.name }}</font></b>
    <br><br>
    <form action="#" method="get">
    <input type="submit" class="btn"
           value="back to {{ team.name }} team" name="back_to_team_details">
    </form>

    <form method="POST" class="form">
      {% csrf_token %}
      {% bootstrap_field form.team_players %}
        {% buttons %}
            <button type="submit" class="btn btn-primary">
                {% bootstrap_icon "save" %}Sell players</button>
        {% endbuttons %}
    </form>
{% endblock %}

Per riacquistare un giocatore è possibile utilizzare il form utilizzato
per la prima Asta.

Salvare ora gli avanzamenti su github:

git add --all
git commit -m "Repair Auction added"
git push -u origin master

articoli precedenti
0 – indice
1 – Virtualenv e Git
2 – Models: Season
3 – Admin: Login e Logout
4 – Models: League
5 – Models: Team
6 – Models: Match
7 – Models: Player
8 – Asta
9 – Models: Lineup
10 – Models: Trade

articoli successivi
12 – Classifica

Categorie:Django Tag:
I commenti sono chiusi.