Skip to content

Commit

Permalink
#954 provide durchgang starttime spread over more than none day
Browse files Browse the repository at this point in the history
- show durchgang-title in rendered output
  • Loading branch information
luechtdiode committed Aug 18, 2024
1 parent 3c69a3e commit ec5b36e
Show file tree
Hide file tree
Showing 11 changed files with 108 additions and 47 deletions.
9 changes: 6 additions & 3 deletions src/main/scala/ch/seidel/kutu/http/ReportRoutes.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import ch.seidel.kutu.KuTuServer.handleCID
import ch.seidel.kutu.akka.{CompetitionCoordinatorClientActor, GeraeteRiegeList, GetGeraeteRiegeList, KutuAppEvent, WertungContainer}
import ch.seidel.kutu.domain.{Kandidat, KutuService, encodeFileName, encodeURIComponent}
import ch.seidel.kutu.renderer._
import ch.seidel.kutu.view.WettkampfInfo
import fr.davit.akka.http.metrics.core.scaladsl.server.HttpMetricsDirectives._
import org.slf4j.{Logger, LoggerFactory}

Expand Down Expand Up @@ -48,6 +49,8 @@ trait ReportRoutes extends SprayJsonSupport
} else {

val wettkampf = readWettkampf(competitionId.toString)
val dgEvents = selectDurchgaenge(UUID.fromString(wettkampf.uuid.get))
.map(d => (d, d.effectivePlanStart(wettkampf.datum.toLocalDate), d.effectivePlanFinish(wettkampf.datum.toLocalDate)))
val logodir = new java.io.File(Config.homedir + "/" + encodeFileName(wettkampf.easyprint))
val logofile = PrintUtil.locateLogoFile(logodir)

Expand All @@ -62,9 +65,9 @@ trait ReportRoutes extends SprayJsonSupport
val filteredRiegen = riegen.filter { k => k.kandidaten.exists(filterMatchingCandidatesToQuery(q))}
gr match {
case Some(grv) if (grv.equalsIgnoreCase("verein")) =>
HttpEntity(ContentTypes.`text/html(UTF-8)`, renderer.riegenToVereinListeAsHTML(filteredRiegen, logofile))
HttpEntity(ContentTypes.`text/html(UTF-8)`, renderer.riegenToVereinListeAsHTML(filteredRiegen, logofile, dgEvents))
case _ =>
HttpEntity(ContentTypes.`text/html(UTF-8)`, renderer.riegenToKategorienListeAsHTML(filteredRiegen, logofile))
HttpEntity(ContentTypes.`text/html(UTF-8)`, renderer.riegenToKategorienListeAsHTML(filteredRiegen, logofile, dgEvents))
}
case _ =>
StatusCodes.Conflict
Expand All @@ -74,7 +77,7 @@ trait ReportRoutes extends SprayJsonSupport
case None => complete {
val toResponseMarshallable: Future[ToResponseMarshallable] = eventualKutuAppEvent.map {
case GeraeteRiegeList(riegen, _) =>
HttpEntity(ContentTypes.`application/json`, jsonrenderer.riegenToKategorienListeAsJSON(riegen.filter { k => k.kandidaten.exists(filterMatchingCandidatesToQuery(q))}, logofile))
HttpEntity(ContentTypes.`application/json`, jsonrenderer.riegenToKategorienListeAsJSON(riegen.filter { k => k.kandidaten.exists(filterMatchingCandidatesToQuery(q))}, logofile, dgEvents))
case _ =>
StatusCodes.Conflict
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,52 @@
package ch.seidel.kutu.renderer

import java.io.File
import ch.seidel.kutu.domain.GeraeteRiege
import ch.seidel.kutu.domain.{Durchgang, GeraeteRiege}
import ch.seidel.kutu.renderer.PrintUtil._
import org.slf4j.{Logger}
import org.slf4j.Logger

import java.time.LocalDateTime

object KategorieTeilnehmerToHtmlRenderer {

def getDurchgangFullName(mapping: Map[String, (Durchgang, LocalDateTime, LocalDateTime)], dg: String): String = {
if (!mapping.contains(dg)) {
dg
} else {
val title = mapping(dg)._1.title
if (dg.equals(title)) {
dg
} else {
s"$title - $dg"
}
}
}
/*
def getDurchgangStart(mapping: Map[String, (Durchgang, LocalDateTime, LocalDateTime)], dg: String): LocalDateTime = {
val dgchild = mapping(dg)
val title = dgchild._1.title
if (dg.equals(title)) {
dgchild._2
} else {
mapping(title)._2
}
}
def getDurchgangEnd(mapping: Map[String, (Durchgang, LocalDateTime, LocalDateTime)], dg: String): LocalDateTime = {
val dgchild = mapping(dg)
val title = dgchild._1.title
if (dg.equals(title)) {
dgchild._3
} else {
mapping(title)._3
}
}
*/

}

trait KategorieTeilnehmerToHtmlRenderer {
import KategorieTeilnehmerToHtmlRenderer.getDurchgangFullName
val logger: Logger// = LoggerFactory.getLogger(classOf[KategorieTeilnehmerToHtmlRenderer])
val intro = """<html>
<head>
Expand Down Expand Up @@ -101,15 +142,14 @@ trait KategorieTeilnehmerToHtmlRenderer {
</li></ul></body>
</html>
"""

private def anmeldeListeProKategorie(kategorie: String, kandidaten: Seq[Kandidat], logo: File) = {
private def anmeldeListeProKategorie(kategorie: String, kandidaten: Seq[Kandidat], logo: File, dgMapping: Map[String, (Durchgang, LocalDateTime, LocalDateTime)]) = {
val logoHtml = if (logo.exists()) s"""<img class=logo src="${logo.imageSrcForWebEngine}" title="Logo"/>""" else ""

val d = kandidaten.map{kandidat =>
if (kandidat.team.nonEmpty) {
s"""<tr class="athletRow"><td>${escaped(kandidat.team)}</td><td class="large">${escaped(kandidat.name)} ${escaped(kandidat.vorname)} (${escaped(kandidat.jahrgang)})</td><td>${escaped(kandidat.durchgang)}</td><td>${escaped(kandidat.start)}</td><td class="totalCol">&nbsp;</td></tr>"""
s"""<tr class="athletRow"><td>${escaped(kandidat.team)}</td><td class="large">${escaped(kandidat.name)} ${escaped(kandidat.vorname)} (${escaped(kandidat.jahrgang)})</td><td>${escaped(getDurchgangFullName(dgMapping, kandidat.durchgang))}</td><td>${escaped(kandidat.start)}</td><td class="totalCol">&nbsp;</td></tr>"""
} else {
s"""<tr class="athletRow"><td>${escaped(kandidat.verein)}</td><td class="large">${escaped(kandidat.name)} ${escaped(kandidat.vorname)} (${escaped(kandidat.jahrgang)})</td><td>${escaped(kandidat.durchgang)}</td><td>${escaped(kandidat.start)}</td><td class="totalCol">&nbsp;</td></tr>"""
s"""<tr class="athletRow"><td>${escaped(kandidat.verein)}</td><td class="large">${escaped(kandidat.name)} ${escaped(kandidat.vorname)} (${escaped(kandidat.jahrgang)})</td><td>${escaped(getDurchgangFullName(dgMapping, kandidat.durchgang))}</td><td>${escaped(kandidat.start)}</td><td class="totalCol">&nbsp;</td></tr>"""
}
}
val dt = d.mkString("", "\n", "\n")
Expand All @@ -130,11 +170,11 @@ trait KategorieTeilnehmerToHtmlRenderer {
"""
}

private def anmeldeListeProVerein(verein: String, kandidaten: Seq[Kandidat], logo: File) = {
private def anmeldeListeProVerein(verein: String, kandidaten: Seq[Kandidat], logo: File, dgMapping: Map[String, (Durchgang, LocalDateTime, LocalDateTime)]) = {
val logoHtml = if (logo.exists()) s"""<img class=logo src="${logo.imageSrcForWebEngine}" title="Logo"/>""" else ""

val d = kandidaten.map{kandidat =>
s"""<tr class="athletRow"><td>${escaped(kandidat.programm)}</td><td class="large">${escaped(kandidat.name)} ${escaped(kandidat.vorname)} (${escaped(kandidat.jahrgang)})</td><td>${escaped(kandidat.durchgang)}</td><td>${escaped(kandidat.start)}</td><td class="totalCol">&nbsp;</td></tr>"""
s"""<tr class="athletRow"><td>${escaped(kandidat.programm)}</td><td class="large">${escaped(kandidat.name)} ${escaped(kandidat.vorname)} (${escaped(kandidat.jahrgang)})</td><td>${escaped(getDurchgangFullName(dgMapping, kandidat.durchgang))}</td><td>${escaped(kandidat.start)}</td><td class="totalCol">&nbsp;</td></tr>"""
}
val dt = d.mkString("", "\n", "\n")
s"""<div class=notenblatt>
Expand All @@ -154,7 +194,7 @@ trait KategorieTeilnehmerToHtmlRenderer {
"""
}

private def anmeldeListeProDurchgangVerein(durchgang: String, kandidaten: Seq[Kandidat], logo: File) = {
private def anmeldeListeProDurchgangVerein(durchgang: String, kandidaten: Seq[Kandidat], logo: File, dgMapping: Map[String, (Durchgang, LocalDateTime, LocalDateTime)]) = {
val logoHtml = if (logo.exists()) s"""<img class=logo src="${logo.imageSrcForWebEngine}" title="Logo"/>""" else ""

val d = kandidaten.map{kandidat =>
Expand All @@ -169,7 +209,7 @@ trait KategorieTeilnehmerToHtmlRenderer {
<div class=headline>
$logoHtml
<div class=title><h4>${escaped(kandidaten.head.wettkampfTitel)}</h4></div>
<div class=programm>${escaped(durchgang)}</br></div>
<div class=programm>${escaped(getDurchgangFullName(dgMapping, durchgang))}</br></div>

</div>
<div class="showborder">
Expand All @@ -182,18 +222,19 @@ trait KategorieTeilnehmerToHtmlRenderer {
"""
}

def riegenToKategorienListeAsHTML(riegen: Seq[GeraeteRiege], logo: File): String = {
toHTMLasKategorienListe(Kandidaten(riegen), logo, 0)
def riegenToKategorienListeAsHTML(riegen: Seq[GeraeteRiege], logo: File, dgMapping: Seq[(Durchgang, LocalDateTime, LocalDateTime)]): String = {
toHTMLasKategorienListe(Kandidaten(riegen), logo, dgMapping, 0)
}
def riegenToDurchgangListeAsHTML(riegen: Seq[GeraeteRiege], logo: File): String = {
toHTMLasDurchgangListe(Kandidaten(riegen), logo, 0)
def riegenToDurchgangListeAsHTML(riegen: Seq[GeraeteRiege], logo: File, dgMapping: Seq[(Durchgang, LocalDateTime, LocalDateTime)]): String = {
toHTMLasDurchgangListe(Kandidaten(riegen), logo, dgMapping, 0)
}

def riegenToVereinListeAsHTML(riegen: Seq[GeraeteRiege], logo: File): String = {
toHTMLasVereinsListe(Kandidaten(riegen), logo, 0)
def riegenToVereinListeAsHTML(riegen: Seq[GeraeteRiege], logo: File, dgMapping: Seq[(Durchgang, LocalDateTime, LocalDateTime)]): String = {
toHTMLasVereinsListe(Kandidaten(riegen), logo, dgMapping, 0)
}

def toHTMLasKategorienListe(kandidaten: Seq[Kandidat], logo: File, rowsPerPage: Int = 28): String = {
def toHTMLasKategorienListe(kandidaten: Seq[Kandidat], logo: File, dgMapping: Seq[(Durchgang, LocalDateTime, LocalDateTime)], rowsPerPage: Int = 28): String = {
val mapping = dgMapping.map(dg => dg._1.name -> dg).toMap
val kandidatenPerKategorie = kandidaten.sortBy { k =>
val krit = if (k.team.nonEmpty) f"${k.team}%-40s ${k.name}%-40s ${k.vorname}%-40s" else f"${k.verein}%-40s ${k.name}%-40s ${k.vorname}%-40s"
krit
Expand All @@ -203,14 +244,15 @@ trait KategorieTeilnehmerToHtmlRenderer {
a4seitenmenge <- if(rowsPerPage == 0) kandidatenPerKategorie(kategorie).sliding(kandidatenPerKategorie(kategorie).size, kandidatenPerKategorie(kategorie).size) else kandidatenPerKategorie(kategorie).sliding(rowsPerPage, rowsPerPage)
}
yield {
anmeldeListeProKategorie(kategorie, a4seitenmenge, logo)
anmeldeListeProKategorie(kategorie, a4seitenmenge, logo, mapping)
}

val pages = rawpages.mkString("</li></ul><ul><li>")
intro + pages + outro
}

def toHTMLasDurchgangListe(kandidaten: Seq[Kandidat], logo: File, rowsPerPage: Int = 28): String = {
def toHTMLasDurchgangListe(kandidaten: Seq[Kandidat], logo: File, dgMapping: Seq[(Durchgang, LocalDateTime, LocalDateTime)], rowsPerPage: Int = 28): String = {
val mapping = dgMapping.map(dg => dg._1.name -> dg).toMap
val kandidatenPerDurchgang = kandidaten.sortBy { k =>
val krit = if (k.team.nonEmpty) f"${k.team}%-40s ${k.name}%-40s ${k.vorname}%-40s" else f"${k.verein}%-40s ${k.name}%-40s ${k.vorname}%-40s"
krit
Expand All @@ -220,14 +262,15 @@ trait KategorieTeilnehmerToHtmlRenderer {
a4seitenmenge <- if(rowsPerPage == 0) kandidatenPerDurchgang(durchgang).sliding(kandidatenPerDurchgang(durchgang).size, kandidatenPerDurchgang(durchgang).size) else kandidatenPerDurchgang(durchgang).sliding(rowsPerPage, rowsPerPage)
}
yield {
anmeldeListeProDurchgangVerein(durchgang, a4seitenmenge, logo)
anmeldeListeProDurchgangVerein(durchgang, a4seitenmenge, logo, mapping)
}

val pages = rawpages.mkString("</li></ul><ul><li>")
intro + pages + outro
}

def toHTMLasVereinsListe(kandidaten: Seq[Kandidat], logo: File, rowsPerPage: Int = 28): String = {
def toHTMLasVereinsListe(kandidaten: Seq[Kandidat], logo: File, dgMapping: Seq[(Durchgang, LocalDateTime, LocalDateTime)], rowsPerPage: Int = 28): String = {
val mapping = dgMapping.map(dg => dg._1.name -> dg).toMap
val kandidatenPerKategorie = kandidaten.sortBy { k =>
val krit = f"${escaped(k.programm)}%-40s ${escaped(k.name)}%-40s ${escaped(k.vorname)}%-40s"
//logger.debug(krit)
Expand All @@ -238,7 +281,7 @@ trait KategorieTeilnehmerToHtmlRenderer {
a4seitenmenge <- if(rowsPerPage == 0) kandidatenPerKategorie(verein).sliding(kandidatenPerKategorie(verein).size, kandidatenPerKategorie(verein).size) else kandidatenPerKategorie(verein).sliding(rowsPerPage, rowsPerPage)
}
yield {
anmeldeListeProVerein(verein, a4seitenmenge, logo)
anmeldeListeProVerein(verein, a4seitenmenge, logo, mapping)
}

val pages = rawpages.mkString("</li></ul><ul><li>")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,29 @@
package ch.seidel.kutu.renderer

import java.io.File
import ch.seidel.kutu.domain.GeraeteRiege
import ch.seidel.kutu.domain.{Durchgang, GeraeteRiege, RiegenRotationsregelKategorie}
import ch.seidel.kutu.renderer.PrintUtil._
import org.slf4j.LoggerFactory

import java.time.LocalDateTime

trait KategorieTeilnehmerToJSONRenderer {
val logger = LoggerFactory.getLogger(classOf[KategorieTeilnehmerToJSONRenderer])


val intro = "{\n"
val outro = "}"
import KategorieTeilnehmerToHtmlRenderer.getDurchgangFullName

private def anmeldeListe(kategorie: String, kandidaten: Seq[Kandidat]) = {
private def anmeldeListe(kategorie: String, kandidaten: Seq[Kandidat], dgMapping: Map[String, (Durchgang, LocalDateTime, LocalDateTime)]) = {

val d = kandidaten.map{kandidat =>
s""" {
| "verein" : "${kandidat.verein}",
| "athlet" : "${kandidat.name} ${kandidat.vorname} (${kandidat.jahrgang})",
| "athletid" : ${kandidat.id},
| "durchgang" : "${kandidat.durchgang}",
| "durchgangtitle" : "${getDurchgangFullName(dgMapping, kandidat.durchgang)}",
| "start" : "${kandidat.start}",
| "team" : "${kandidat.team}"
| }""".stripMargin
Expand All @@ -31,12 +36,13 @@ trait KategorieTeilnehmerToJSONRenderer {
}


def riegenToKategorienListeAsJSON(riegen: Seq[GeraeteRiege], logo: File): String = {
toJSONasKategorienListe(Kandidaten(riegen), logo)
def riegenToKategorienListeAsJSON(riegen: Seq[GeraeteRiege], logo: File, dgMapping: Seq[(Durchgang, LocalDateTime, LocalDateTime)]): String = {
toJSONasKategorienListe(Kandidaten(riegen), logo, dgMapping)
}

def toJSONasKategorienListe(kandidaten: Seq[Kandidat], logo: File): String = {
def toJSONasKategorienListe(kandidaten: Seq[Kandidat], logo: File, dgMapping: Seq[(Durchgang, LocalDateTime, LocalDateTime)]): String = {
val logoHtml = if (logo.exists()) logo.imageSrcForWebEngine else ""
val dgmap = dgMapping.map(dg => dg._1.name -> dg).toMap
val kandidatenPerKategorie = kandidaten.sortBy { k =>
val krit = f"${escaped(k.verein)}%-40s ${escaped(k.name)}%-40s ${escaped(k.vorname)}%-40s"
//logger.debug(krit)
Expand All @@ -46,7 +52,7 @@ trait KategorieTeilnehmerToJSONRenderer {
kategorie <- kandidatenPerKategorie.keys.toList.sorted
}
yield {
anmeldeListe(kategorie, kandidatenPerKategorie(kategorie))
anmeldeListe(kategorie, kandidatenPerKategorie(kategorie), dgmap)
}

val pages = rawpages.mkString(s""""logo" : "$logoHtml",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ trait NotenblattToHtmlRenderer {
// for loading logo see https://stackoverflow.com/questions/26447451/javafx-in-webview-img-tag-is-not-loading-local-images
private def notenblattForGeTu(kandidat: Kandidat, logo: File) = {
val d = kandidat.diszipline.zip(Range(1, kandidat.diszipline.size+1)).map{dis =>
s"""<tr class="geraeteRow"><td class="large">${escaped(dis._2)}. ${escaped(dis._1.easyprint)}</td><td>&nbsp;</td><td>&nbsp;</td><td class="totalCol">&nbsp;</td></tr>"""
s"""<tr class="geraeteRow"><td class="large">${dis._2}. ${escaped(dis._1.easyprint)}</td><td>&nbsp;</td><td>&nbsp;</td><td class="totalCol">&nbsp;</td></tr>"""
}
val dt = d.updated(d.size-1, d.last.replace("geraeteRow", "totalRow")).mkString("", "\n", "\n")
val logoHtml = (if (logo.exists) s"""<img class=logo src="${logo.imageSrcForWebEngine}" title="Logo"/>""" else s"")
Expand Down Expand Up @@ -147,7 +147,7 @@ trait NotenblattToHtmlRenderer {

private def notenblattForATT(kandidat: Kandidat, logo: File) = {
val d = kandidat.diszipline.zip(Range(1, kandidat.diszipline.size+1)).map{dis =>
s"""<tr class="geraeteRow"><td class="large dataTd">${escaped(dis._2)}. ${escaped(dis._1.easyprint)}</td><td class="totalCol dataTd">&nbsp;</td></tr>"""
s"""<tr class="geraeteRow"><td class="large dataTd">${dis._2}. ${escaped(dis._1.easyprint)}</td><td class="totalCol dataTd">&nbsp;</td></tr>"""
}
val dt = d.mkString("", "\n", "\n")
s"""<div class=notenblatt>
Expand All @@ -171,7 +171,7 @@ trait NotenblattToHtmlRenderer {

private def notenblattForKuTu(kandidat: Kandidat, logo: File) = {
val d = kandidat.diszipline.zip(Range(1, kandidat.diszipline.size+1)).map{dis =>
s"""<tr class="geraeteRow"><td class="large">${escaped(dis._2)}. ${escaped(dis._1.easyprint)}</td><td>&nbsp;</td><td>&nbsp;</td><td class="totalCol">&nbsp;</td></tr>"""
s"""<tr class="geraeteRow"><td class="large">${dis._2}. ${escaped(dis._1.easyprint)}</td><td>&nbsp;</td><td>&nbsp;</td><td class="totalCol">&nbsp;</td></tr>"""
}
val dt = d.updated(d.size-1, d.last.replace("geraeteRow", "totalRow")).mkString("", "\n", "\n")
val logoHtml = (if (logo.exists) s"""<img class=logo src="${logo.imageSrcForWebEngine}" title="Logo"/>""" else s"")
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/ch/seidel/kutu/renderer/PrintUtil.scala
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ object PrintUtil {
""
}
else {
text.split("\n").toList.map(xml.Utility.escape(_)).mkString("", "<br>", "")
text.split("\n").toList.map(xml.Utility.escape).mkString("", "<br>", "")
}

case class FilenameDefault(filename: String, dir: java.io.File)
Expand Down
Loading

0 comments on commit ec5b36e

Please sign in to comment.