Beispiel #1
0
def plotMeritOrder(mcp, mcv, data, name):
    """ mcp=Market Clearing Price,
        mcv=Market Clearing Value,
        data=Liste mit Preis und Menge
        name=Spielername oder Alles"""
    preis = data.values_list('Preis', flat=True)
    menge = data.values_list('Menge', flat=True)
    ypos = 0
    for preis, menge in data:
        if preis < mcp:
            farbe = "green"
        if preis == mcp:
            farbe = "yellow"
        if (preis >= mcp) and (ypos >= mcv):
            farbe = "red"

        plt.bar(ypos,
                preis,
                menge,
                align="edge",
                alpha=0.5,
                edgecolor="grey",
                color=farbe)
        ypos += menge
    plt.xlabel('Energie [MWh]')
    plt.ylabel('Preis [EUR/MWh]')
    plt.title('Merit Order Runde:' + str(gib_Runde()))
    plt.axhline(mcp)
    plt.axvline(mcv)
    plt.annotate('MCP=' + str(mcp) + 'Euro/MWh', xy=(1, mcp + 5))
    plt.annotate('MCV=' + str(mcv) + 'MWh', xy=(mcv + 5, mcp + 5))
    plt.savefig(
        os.path.dirname(__file__) + '/static/boersenspiel/images/tmp/' + name +
        'MeritOrder' + str(gib_Runde()) + '.png')
    plt.close()
Beispiel #2
0
def init_KraftwerksDiv(request):
    """"Holt fuer den User im request die Gebote pro Kraftwerksblock fuer die aktuelle Runde aus der Datenbank
        und ruft mit ihnen gib_KraftwerksDiv auf"""
    preise = gebote.objects.filter(idSpiel=fb.gib_Spiel(request),
                                   Runde=fb.gib_Runde(),
                                   idSpieler=fb.gib_Spieler(request)).order_by(
                                       'idKW', 'idGebot')
    return gib_KraftwerksDiv(request, preise)
Beispiel #3
0
def auctionsresults(request):
    dataGesamt = []
    dataSpieler = []

    for i in range(1, gib_Runde() + 1):
        dataGesamt.append('boersenspiel/images/tmp/GesamtMeritOrder' + str(i) +
                          '.png')
    dataGesamt.reverse()
    for j in range(1, gib_Runde() + 1):
        dataSpieler.append('boersenspiel/images/tmp/PhenMeritOrder' + str(j) +
                           '.png')
    dataSpieler.reverse()

    return render(
        request, 'boersenspiel/results.html', {
            'runde': fboersenspiel.gib_Runde(),
            'gesamt': dataGesamt,
            'spieler': dataSpieler
        })
Beispiel #4
0
def plotPreise():
    rohstoffe = {'Kohle': 1, 'Gas': 2, 'Wasser': 3}
    colors = {1: "#CD853F", 2: "#FFDAB9", 3: "#0000FF"}
    for rohstoff in rohstoffe:
        preise = brennstoffpreise.objects.all().filter(
            idBrennstoff=rohstoffe[rohstoff],
            Runde__lte=fboersenspiel.gib_Runde()).order_by(
                'Runde').values_list('Preis', flat=True)
        runde = brennstoffpreise.objects.all().filter(
            idBrennstoff=rohstoffe[rohstoff],
            Runde__lte=fboersenspiel.gib_Runde()).order_by(
                'Runde').values_list('Runde', flat=True)
        plt.plot(runde, preise, '-o', c=colors[rohstoffe[rohstoff]])
        plt.xlabel('Runde')
        plt.ylabel('Preis [EUR/MWH]')
        plt.title(rohstoff + 'preise')
        plt.axis([0, 12, 0, 35])
        plt.grid(True)
        plt.savefig(
            os.path.dirname(__file__) + '/static/boersenspiel/images/tmp/' +
            rohstoff + 'preise.png')
        plt.close()

    preise = co2preise.objects.all().filter(
        Runde__lte=fboersenspiel.gib_Runde()).order_by('Runde').values_list(
            'Preis', flat=True)
    runde = co2preise.objects.all().filter(
        Runde__lte=fboersenspiel.gib_Runde()).order_by('Runde').values_list(
            'Runde', flat=True)
    plt.plot(runde, preise, '-o', c=colors[rohstoffe[rohstoff]])
    plt.xlabel('Runde')
    plt.ylabel('Preis [EUR/t]')
    plt.title('CO2-Preise')
    plt.axis([0, 12, 0, 33])
    plt.grid(True)
    plt.savefig(
        os.path.dirname(__file__) +
        '/static/boersenspiel/images/tmp/Co2preise.png')
    plt.close()
Beispiel #5
0
def highscores(request):
    data = []
    spielerListe = Spieler.objects.all()
    for spieler in spielerListe:
        name = spieler.user.username
        gewinn = 0.0
        for x in range(1, 4):
            gewinn += spielerkraftwerke.objects.get(idSpieler=spieler.pk,
                                                    idKraftwerk=x).gewinn
        data = data + [(name, gewinn)]
    data.sort(key=lambda tup: tup[1], reverse=True)
    return render(request, 'boersenspiel/hs.html', {
        'liste': data,
        'runde': fboersenspiel.gib_Runde()
    })
Beispiel #6
0
def prefs(request):
    form = einstellungenForm(request.POST)
    if form.is_valid():
        einstellungquery = einstellungen.objects.get()
        einstellungquery.Runde = request.POST['Runde']
        einstellungquery.idSpiel = request.POST['Spiel']
        einstellungquery.auctiontype = request.POST['auctiontype']
        einstellungquery.nextround = request.POST['nextround']
        einstellungquery.rundenzeit = request.POST['rundenzeit']
        einstellungquery.save()
    else:
        form = einstellungenForm()
    return render(request, 'boersenspiel/prefs.html', {
        'form': form,
        'runde': fboersenspiel.gib_Runde()
    })
Beispiel #7
0
def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)
            auth_login(request, user)
            return handler(request)
    else:
        form = UserCreationForm()
    return render(request, 'boersenspiel/signup.html', {
        'form': form,
        'runde': fboersenspiel.gib_Runde()
    })
Beispiel #8
0
def admin(request):
    if request.user.is_staff:
        if (request.GET.get('resetGame')):
            fadmin.reset(request, 0)
        if (request.GET.get('resetAll')):
            fadmin.reset(request, 1)
        if (request.GET.get('lade')):
            fadmin.ladedaten()
        if (request.GET.get('neueRunde')):
            fadmin.neueRunde()
        if (request.GET.get('auktion')):
            fadmin.auktion()
        return render(request, 'boersenspiel/admin.html',
                      {'runde': fboersenspiel.gib_Runde()})
    else:
        return redirect('login')
    raise Http404
Beispiel #9
0
def login(request):
    return render(request, 'boersenspiel/login.html',
                  {'runde': fboersenspiel.gib_Runde()})
Beispiel #10
0
def handler(request):

    if not request.user.is_authenticated():
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            auth_login(request, user)
            return handler(request)
        else:
            return redirect('login')
    else:
        formcoal = bidscoal(request.POST)
        formgas = bidsgas(request.POST)
        formwater = bidswater(request.POST)
        if formcoal.is_valid():
            for bid in range(1, 5):
                gebotequery, created = gebote.objects.get_or_create(
                    idSpieler=fb.gib_Spieler(request),
                    idKW=1,
                    idGebot=bid,
                    Runde=gib_Runde(),
                    Menge=kraftwerke.objects.get(id=1).maxLeistung / 4)
                gebotequery.Preis = request.POST['kw1' + str(bid)]
                gebotequery.save()
        else:
            formcoal = bidscoal()

        if formgas.is_valid():
            for bid in range(1, 5):
                gebotequery, created = gebote.objects.get_or_create(
                    idSpieler=fb.gib_Spieler(request),
                    idKW=2,
                    idGebot=bid,
                    Runde=gib_Runde(),
                    Menge=kraftwerke.objects.get(id=2).maxLeistung / 4)
                gebotequery.Preis = request.POST['kw2' + str(bid)]
                gebotequery.save()
        else:
            formgas = bidsgas()
        if formwater.is_valid():
            for bid in range(1, 5):
                gebotequery, created = gebote.objects.get_or_create(
                    idSpieler=fb.gib_Spieler(request),
                    idKW=3,
                    idGebot=bid,
                    Runde=gib_Runde(),
                    Menge=kraftwerke.objects.get(id=3).maxLeistung / 4)
                gebotequery.Preis = request.POST['kw3' + str(bid)]
                gebotequery.save()
        else:
            formwater = bidswater()

    return render(
        request, 'boersenspiel/handler.html', {
            'html': fh.init_KraftwerksDiv(request),
            'formcoal': formcoal,
            'formwater': formwater,
            'formgas': formgas,
            'runde': fboersenspiel.gib_Runde()
        })
Beispiel #11
0
def externalmarkets(request):
    return render(request, 'boersenspiel/markets.html',
                  {'runde': fboersenspiel.gib_Runde()})
Beispiel #12
0
def auktion():
    """Berechne Last (Maximale Leistung im Spiel*Lastfaktor)"""
    """Berechne Maximale Leistung"""
    numSpieler = Spieler.objects.all().count()
    maxLeistung = numSpieler * (kraftwerke.objects.get(id=1).maxLeistung)
    maxLeistung += numSpieler * (kraftwerke.objects.get(id=2).maxLeistung)
    maxLeistung += numSpieler * (kraftwerke.objects.get(id=3).maxLeistung)
    """Lastfaktor"""
    lastfaktor = lastgang.objects.get(idRunde=gib_Runde()).fMaxLast
    last = maxLeistung * lastfaktor
    """Berechne Marktpreis mcp"""
    handelsmenge = 0
    mcp = 0
    angebotsliste = gebote.objects.all().filter(Runde=gib_Runde()).order_by(
        'Preis', 'Time', 'idGebot').values_list('Preis', 'Menge')
    for preis, menge in angebotsliste:
        if handelsmenge < last:
            if handelsmenge + menge > last:
                menge = last - handelsmenge
            handelsmenge += menge
            mcp = preis
        else:
            break
    obj, created = boersenpreise.objects.update_or_create(defaults={
        'time':
        datetime.now(),
        'menge':
        handelsmenge,
        'preis':
        mcp
    },
                                                          runde=gib_Runde())
    """Plotte Boersenpreisverlauf"""
    runde = boersenpreise.objects.all().order_by('runde').values_list(
        'runde', flat=True)
    preise = boersenpreise.objects.all().order_by('runde').values_list(
        'preis', flat=True)
    plotBoersenpreis(runde, preise)
    """Plotte MeritOrder fuer alle Angebote"""
    angebotsliste = gebote.objects.all().filter(Runde=gib_Runde()).order_by(
        'Preis', 'Time', 'idGebot').values_list('Preis', 'Menge')
    plotMeritOrder(mcp, handelsmenge, angebotsliste, 'Gesamt')
    """Berechne Erloese,Gewinne und Kosten"""
    handelsmenge2 = 0
    angebotsliste = gebote.objects.all().filter(Runde=gib_Runde()).order_by(
        'Preis', 'Time', 'idGebot').values_list('Preis', 'Menge', 'idSpieler',
                                                'idKW')
    for preis, menge, spieler, kw in angebotsliste:
        diff = preis - boersenpreise.objects.get(runde=gib_Runde()).preis
        if diff < 0:
            diff = 0
        """Hole Wirkungsgrad n, Emissionsfaktor EMF und Brennstoffpreis brennpreis"""
        n = kraftwerke.objects.get(id=kw).wirkungsgrad
        emf = brennstoff.objects.get(id=kw).EMF
        brennpreis = brennstoffpreise.objects.get(idBrennstoff=kw,
                                                  Runde=gib_Runde()).Preis
        """CO2 Preis"""
        co2preis = co2preise.objects.get(Runde=gib_Runde()).Preis
        """Erloese und Kosten und Kosten Co2"""
        erloes = 0
        kosten = 0
        kosten_co2 = 0
        """Beginne Berechnung"""
        if handelsmenge2 < handelsmenge:
            if handelsmenge2 + menge > handelsmenge:
                menge = handelsmenge - handelsmenge2
            if einstellungen.objects.get().auctiontype is 1:
                erloes = menge * preis
                kosten = (menge / n) * (brennpreis + (emf * co2preis))
                kosten_co2 = (menge / n) * (emf * co2preis)
            elif einstellungen.objects.get().auctiontype is 2:
                erloes = menge * mcp
                kosten = (menge / n) * (brennpreis + (emf * co2preis))
                kosten_co2 = (menge / n) * (emf * co2preis)
            gewinn = erloes - kosten
            """Speicher Ergebnisse"""
            ergebniss, created = ergebnisse.objects.get_or_create(
                idSpieler=spieler, idRunde=gib_Runde())
            ergebniss.erloes += erloes
            ergebniss.kosten += kosten
            ergebniss.kostenCo2 += kosten_co2
            ergebniss.time = datetime.now()
            ergebniss.save()
            """Speicher Gewinne und Verkaufte Mengen"""
            kwupdate = spielerkraftwerke.objects.get(idSpieler=spieler,
                                                     idKraftwerk=kw)
            kwupdate.gewinn += gewinn
            kwupdate.verkaufteEnergiemenge += menge
            kwupdate.save()

        handelsmenge2 += menge
    for spieler in Spieler.objects.all():
        plotMeritOrder(
            mcp, handelsmenge,
            gebote.objects.filter(idSpieler=spieler.user.pk,
                                  Runde=gib_Runde()).order_by(
                                      'Preis', 'Time',
                                      'idGebot').values_list('Preis', 'Menge'),
            spieler.user.username)