schafkopf-db/app/models.py
Balthasar Schachtner 8b001d2878 fix typo
2019-10-11 09:28:06 +02:00

160 lines
5.6 KiB
Python

from flask_appbuilder import Model
from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
from sqlalchemy.orm import relationship
"""
You can use the extra Flask-AppBuilder fields and Mixin's
AuditMixin will add automatic timestamp of created and modified by who
"""
def addExtras(result, nExtras, extrasTarif):
"""takes result array and adds/subtracts the extras and return modified results"""
newResult = []
for res in result:
if res > 0:
newResult.append(res+nExtras*extrasTarif)
else:
newResult.append(res-nExtras*extrasTarif)
return newResult
class Spieler(Model):
id = Column(Integer, primary_key=True)
name = Column(String())
def __repr__(self):
return self.name
class Spiel(Model):
id = Column(Integer, primary_key=True)
spieler1_id = Column(Integer, ForeignKey('spieler.id'))
spieler1 = relationship('Spieler', foreign_keys=[spieler1_id])
spieler2_id = Column(Integer, ForeignKey('spieler.id'))
spieler2 = relationship('Spieler', foreign_keys=[spieler2_id])
spieler3_id = Column(Integer, ForeignKey('spieler.id'))
spieler3 = relationship('Spieler', foreign_keys=[spieler3_id])
spieler4_id = Column(Integer, ForeignKey('spieler.id'))
spieler4 = relationship('Spieler', foreign_keys=[spieler4_id])
spieltyp = Column(String())
leger1 = Column(Boolean)
leger2 = Column(Boolean)
leger3 = Column(Boolean)
leger4 = Column(Boolean)
spieler = Column(Integer(), nullable=True)
mitspieler = Column(Integer(), nullable=True)
kontra = Column(Integer(), default=0)
tout = Column(Boolean, default=False)
sie = Column(Boolean, default=False)
schneider = Column(Integer(), default=0)
laufende = Column(Integer(), default=0)
# Hat der Spieler gewonnen?
gewonnen = Column(Boolean, nullable=True)
# Wenn Ramsch gespielt wird
durchmarsch_gewinner = Column(Integer(), nullable=True)
verlierer = Column(Integer(), nullable=True)
jungfrau1 = Column(Boolean())
jungfrau2 = Column(Boolean())
jungfrau3 = Column(Boolean())
jungfrau4 = Column(Boolean())
# Bonus info
farbe = Column(String())
kommentar = Column(String())
def spielwert(self):
grundtarif = 20
extras = 10
solo = 50
result = [0,0,0,0]
if self.spieltyp == "Sauspiel":
spieler = set([self.spieler-1,self.mitspieler-1])
nichtspieler = list(set([0,1,2,3])-spieler)
sauspiel_total = grundtarif + self.schneider*extras+ self.laufende*extras
if self.gewonnen:
result[self.spieler-1] = sauspiel_total
result[self.mitspieler-1] = sauspiel_total
result[nichtspieler[0]] = -sauspiel_total
result[nichtspieler[1]] = -sauspiel_total
else:
result[self.spieler-1] = -sauspiel_total
result[self.mitspieler-1] = -sauspiel_total
result[nichtspieler[0]] = sauspiel_total
result[nichtspieler[1]] = sauspiel_total
addExtras(result, self.schneider, extras)
addExtras(result, self.laufende, extras)
elif self.spieltyp == "Wenz" or self.spieltyp == "Solo":
spieler = set([self.spieler-1])
nichtspieler = list(set([0,1,2,3])-spieler)
solo_total = solo + self.schneider*extras+ self.laufende*extras
if self.gewonnen:
result[self.spieler-1] = 3*solo_total
result[nichtspieler[0]] = -solo_total
result[nichtspieler[1]] = -solo_total
result[nichtspieler[2]] = -solo_total
else:
result[self.spieler-1] = -3*solo_total
result[nichtspieler[0]] = solo_total
result[nichtspieler[1]] = solo_total
result[nichtspieler[2]] = solo_total
elif self.spieltyp == "Ramsch":
if self.durchmarsch_gewinner:
gewinner = set([self.durchmarsch_gewinner-1])
nichtGewinner= list(set([0,1,2,3])-gewinner)
result[self.durchmarsch_gewinner-1] = 3*solo
result[nichtGewinner[0]] = -solo
result[nichtGewinner[1]] = -solo
result[nichtGewinner[2]] = -solo
else:
verlierer = set([self.verlierer-1])
nichtVerlierer = list(set([0,1,2,3])-verlierer)
sum_verloren = 0
result[nichtVerlierer[0]] = grundtarif + grundtarif* getattr(self, "jungfrau{}".format(nichtVerlierer[0]+1))
result[nichtVerlierer[1]] = grundtarif + grundtarif* getattr(self, "jungfrau{}".format(nichtVerlierer[1]+1))
result[nichtVerlierer[2]] = grundtarif + grundtarif* getattr(self, "jungfrau{}".format(nichtVerlierer[2]+1))
result[self.verlierer-1] = - result[nichtVerlierer[0]] - result[nichtVerlierer[1]] -result[nichtVerlierer[2]]
if self.leger1 or self.leger2 or self.leger3 or self.leger4:
result = [2*i for i in result]
result = [2**self.kontra*i for i in result]
if self.tout:
result = [2*i for i in result]
if self.sie:
result = [4*i for i in result]
return {
self.spieler1: result[0],
self.spieler2: result[1],
self.spieler3: result[2],
self.spieler4: result[3],
}
def check(self):
if sum(self.spielwert().values())==0:
return u"\U0001F44D"
else:
return u"\U0001F44E"