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()
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)
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 })
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()
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() })
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() })
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() })
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
def login(request): return render(request, 'boersenspiel/login.html', {'runde': fboersenspiel.gib_Runde()})
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() })
def externalmarkets(request): return render(request, 'boersenspiel/markets.html', {'runde': fboersenspiel.gib_Runde()})
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)