diff --git a/.DS_Store b/.DS_Store index 149065c..418a641 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/src/.DS_Store b/src/.DS_Store index 585eeaa..717d292 100644 Binary files a/src/.DS_Store and b/src/.DS_Store differ diff --git a/src/main/.DS_Store b/src/main/.DS_Store index a5b09d3..bf362a1 100644 Binary files a/src/main/.DS_Store and b/src/main/.DS_Store differ diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store index 5d85c26..ef2c94d 100644 Binary files a/src/main/java/.DS_Store and b/src/main/java/.DS_Store differ diff --git a/src/main/java/org/.DS_Store b/src/main/java/org/.DS_Store index 7b8c702..39d3d60 100644 Binary files a/src/main/java/org/.DS_Store and b/src/main/java/org/.DS_Store differ diff --git a/src/main/java/org/texttechnologylab/.DS_Store b/src/main/java/org/texttechnologylab/.DS_Store index deb3b5d..7c0cdf1 100644 Binary files a/src/main/java/org/texttechnologylab/.DS_Store and b/src/main/java/org/texttechnologylab/.DS_Store differ diff --git a/src/main/java/org/texttechnologylab/project/.DS_Store b/src/main/java/org/texttechnologylab/project/.DS_Store index a021884..61ef70c 100644 Binary files a/src/main/java/org/texttechnologylab/project/.DS_Store and b/src/main/java/org/texttechnologylab/project/.DS_Store differ diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/.DS_Store b/src/main/java/org/texttechnologylab/project/gruppe_05_1/.DS_Store index e768681..88e8e88 100644 Binary files a/src/main/java/org/texttechnologylab/project/gruppe_05_1/.DS_Store and b/src/main/java/org/texttechnologylab/project/gruppe_05_1/.DS_Store differ diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/.DS_Store b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/.DS_Store index 0185c25..a45e7cb 100644 Binary files a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/.DS_Store and b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/.DS_Store differ diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoDBHandler.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoDBHandler.java index 9a3343c..9626f14 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoDBHandler.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoDBHandler.java @@ -621,7 +621,7 @@ public class MongoDBHandler { List speeches = speechesCollection.find().into(new ArrayList<>()); List result = new ArrayList<>(); for (Document speech : speeches) { - result.add(new Speech_MongoDB_Impl(speech)); + result.add(new Speech_MongoDB_Impl(speech, true)); } return result; @@ -631,7 +631,7 @@ public class MongoDBHandler { List speeches = speechesCollection.find(filter).into(new ArrayList<>()); List result = new ArrayList<>(); for (Document speech : speeches) { - result.add(new Speech_MongoDB_Impl(speech)); + result.add(new Speech_MongoDB_Impl(speech, true)); } return result; diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java index 9774e1e..6cdb273 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java @@ -18,6 +18,7 @@ import org.texttechnologylab.project.gruppe_05_1.domain.speaker.Membership; import org.texttechnologylab.project.gruppe_05_1.domain.speech.SpeechMetaData; import org.texttechnologylab.project.gruppe_05_1.util.GeneralUtils; import org.texttechnologylab.project.gruppe_05_1.util.Logger; +import org.texttechnologylab.project.gruppe_05_1.util.PPRUtils; import org.texttechnologylab.project.gruppe_05_1.xml.speeches.Interfaces.Speech; import java.io.IOException; @@ -421,7 +422,43 @@ public class MongoPprUtils { List docs = getSpeechCollection().find(filter).into(new ArrayList<>()); for (Document doc : docs) { - speeches.add(new Speech_MongoDB_Impl(doc)); + speeches.add(new Speech_MongoDB_Impl(doc, true)); + } + + return speeches; + } + + /** + * Liefert alle Reden zurück + * Die Auswahl kann durch einen (textuellen) Filter eingeschränkt werden + * @param filter + * @return + */ + public static List getSpeeches(String filter) { + List speeches = new ArrayList<>(); + + MongoCursor cursor; + + if (filter== null || filter.isBlank()) { + cursor = getSpeechCollection().find().iterator(); + } else { + String pattern = ".*" + filter + ".*"; + Document searchDocument = new Document("$or", List.of( + new Document("speakerName", new Document("$regex", pattern).append("$options", "i")), + new Document("fraction", new Document("$regex", pattern).append("$options", "i")), + new Document("speechKey", new Document("$regex", pattern).append("$options", "i")) + )); + cursor = getSpeechCollection().find(searchDocument).cursor(); + } + + try { + while (cursor.hasNext()) { + speeches.add(new Speech_MongoDB_Impl(cursor.next(), false)); + } + } catch (Throwable t) { + Logger.error(String.valueOf(t)); + } finally { + cursor.close(); } return speeches; @@ -448,18 +485,7 @@ public class MongoPprUtils { // aus "sessions" Collection - String dateTimeString = getSessionDateTime(sessionId); - if (dateTimeString != null) { - md.setDateTimeString(dateTimeString); - LocalDateTime tmp = GeneralUtils.parseDateTime(dateTimeString, "dd.MM.yyyy HH:mm"); - if (tmp == null) { - tmp = GeneralUtils.parseDateTime(dateTimeString, "dd.MM.yyyy H:mm"); - if (tmp == null) { - Logger.error(dateTimeString + " could not be parsed"); - } - } - md.setDateTime(tmp); - } + augmentSpeechMetaDataFromSession(sessionId, md); // aus "agendaItems" Collection int agendaItemId = speech.getAgendaItemId(); @@ -472,16 +498,84 @@ public class MongoPprUtils { // Sortiere nach Datum, absteigend speechMetaDataList.sort((md1, md2) -> { - try { - return md2.getDateTime().compareTo(md1.getDateTime()); - } catch (NullPointerException e) { - return 0; - } + if ((md2.getDateTime() == null) && (md1.getDateTime()) == null) return 0; + if (md2.getDateTime() == null) return -1; + if (md1.getDateTime() == null) return 1; + return md2.getDateTime().compareTo(md1.getDateTime()); }); return speechMetaDataList; } + /** + * Liefert Metadaten (aber keine Inhalte!) für alle Reden zurück. + * Die Auswahl kann durch einen (textuellen) Filter eingeschränkt werden + * Als Metadaten zählen das Datum, Agenda-ID etc. + * @param filter + * @return + */ + public static List getSpeechesMetadata(String filter) { + + List speechMetaDataList = new ArrayList<>(); + List speeches = MongoPprUtils.getSpeeches(filter); + for (Speech speech : speeches) { + SpeechMetaData md = new SpeechMetaData(); + + md.setSpeechKey(speech.getSpeechKey()); + md.setSpeechId(speech.getSpeechId()); + md.setSpeakerId(speech.getSpeakerId()); + md.setSpeakerName(speech.getSpeakerName()); + md.setFraktion(speech.getFraction()); + if (md.getFraktion() == null) {md.setFraktion(PPRUtils.PARTEILOS_KUERZEL);} + int sessionId = speech.getSessionId(); + md.setSessionId(sessionId); + + // aus "sessions" Collection + augmentSpeechMetaDataFromSession(sessionId, md); + + // aus "agendaItems" Collection + int agendaItemId = speech.getAgendaItemId(); + String agendaTitel = getAgendaTitle(sessionId, agendaItemId); + md.setAgendaTitle(agendaTitel); + + speechMetaDataList.add(md); + } + + // Sortiere nach Datum, absteigend + speechMetaDataList.sort((md1, md2) -> { + if ((md2.getDateTime() == null) && (md1.getDateTime()) == null) return 0; + if (md2.getDateTime() == null) return -1; + if (md1.getDateTime() == null) return 1; + return md2.getDateTime().compareTo(md1.getDateTime()); + }); + + return speechMetaDataList; + } + + /** + * Füge Rede-Metadaten (welche in der Session-Collection stehen) der Rede hinzu. + * Achtung: Redezeit ist in der Datenbank in unterschiedlichen Formaten vorhanden. + * @param sessionId + * @param md + */ + public static void augmentSpeechMetaDataFromSession(int sessionId, SpeechMetaData md) { + String dateTimeString = getSessionDateTime(sessionId); + if (dateTimeString != null) { + md.setDateTimeString(dateTimeString); + + for (String format : Arrays.asList("dd.MM.yyyy HH:mm", + "dd.MM.yyyy H:mm", + "dd.MM.yyyy HH.mm", + "dd.MM.yyyy H.mm")) { + LocalDateTime tmp = GeneralUtils.parseDateTime(dateTimeString,format); + if (tmp != null) { + md.setDateTime(tmp); + return; + } + } + Logger.error(dateTimeString + " could not be parsed"); + } + } /** * Liefert das Datum und die Uhrzeit einer Sitzung zurück @@ -522,11 +616,14 @@ public class MongoPprUtils { * @return */ public static HtmlSpeech getSpeechByKey(String key) { - System.out.println(key); + System.out.println(key); // TODO: remove when no longer needed Document filter = new Document("speechKey", key); Document speechDoc = getSpeechCollection().find(filter).first(); - System.out.println(getSpeechCollection().find().filter(Filters.eq("speechKey", key)).first()); - System.out.println("SpeechDoc "+ speechDoc); + System.out.println(getSpeechCollection().find().filter(Filters.eq("speechKey", key)).first()); // TODO: remove when no longer needed + System.out.println("SpeechDoc "+ speechDoc); // TODO: remove when no longer needed + if (speechDoc == null) { + Logger.error("Rede " + key + " nicht gefunden"); + } return new HtmlSpeech(speechDoc); } diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/domainimp/speeches/Speech_MongoDB_Impl.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/domainimp/speeches/Speech_MongoDB_Impl.java index 729142c..2f43ec7 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/domainimp/speeches/Speech_MongoDB_Impl.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/domainimp/speeches/Speech_MongoDB_Impl.java @@ -13,7 +13,7 @@ import org.texttechnologylab.project.gruppe_05_1.xml.speeches.Interfaces.Speech; import java.util.List; public class Speech_MongoDB_Impl extends Speech_File_Impl implements Speech { - public Speech_MongoDB_Impl(Document mongoDocument) { + public Speech_MongoDB_Impl(Document mongoDocument, boolean includeContent) { super( mongoDocument.getInteger("sessionId"), mongoDocument.getInteger("agendaItemId"), @@ -24,23 +24,23 @@ public class Speech_MongoDB_Impl extends Speech_File_Impl implements Speech { mongoDocument.getString("speechKey") ); - - for (Document content : (List) mongoDocument.get("speechContents")) { - switch (content.getString("type")) { - case "line": - this.addContent(new Line_MongoDB_Impl(content)); - break; - case "comment": - this.addContent(new Comment_MongoDB_Impl(content)); - break; - case "speaker": - this.addContent(new Speaker_MongoDB_Impl(content)); - break; - default: - throw new IllegalArgumentException("Unknown content type: " + content.getString("type")); + if (includeContent) { + for (Document content : (List) mongoDocument.get("speechContents")) { + switch (content.getString("type")) { + case "line": + this.addContent(new Line_MongoDB_Impl(content)); + break; + case "comment": + this.addContent(new Comment_MongoDB_Impl(content)); + break; + case "speaker": + this.addContent(new Speaker_MongoDB_Impl(content)); + break; + default: + throw new IllegalArgumentException("Unknown content type: " + content.getString("type")); + } } } - } public String getFullText() { diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/html/HtmlSpeech.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/html/HtmlSpeech.java index 07a4fd5..c002048 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/html/HtmlSpeech.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/html/HtmlSpeech.java @@ -2,9 +2,11 @@ package org.texttechnologylab.project.gruppe_05_1.domain.html; import org.bson.Document; import org.texttechnologylab.project.gruppe_05_1.database.MongoDBHandler; +import org.texttechnologylab.project.gruppe_05_1.database.MongoPprUtils; import org.texttechnologylab.project.gruppe_05_1.domain.nlp.NlpInfo; import org.texttechnologylab.project.gruppe_05_1.domain.nlp.Token; import org.texttechnologylab.project.gruppe_05_1.domain.nlp.Topic; +import org.texttechnologylab.project.gruppe_05_1.domain.speech.SpeechMetaData; import java.util.ArrayList; import java.util.List; @@ -15,6 +17,8 @@ public class HtmlSpeech { String speechKey; String speakerName; String fraction; + String dateTimeString; // aus "sessions" Collection + String agendaTitle; // aus "agendaItems" Collection List content = new ArrayList<>(); NlpInfo nlp = null; @@ -35,6 +39,18 @@ public class HtmlSpeech { } } + // ergänzen um Datum, Uhrzeit und Agendapunkt der Rede + SpeechMetaData md = new SpeechMetaData(); + int sessionId = doc.getInteger("sessionId"); + md.setSessionId(sessionId); + MongoPprUtils.augmentSpeechMetaDataFromSession(sessionId, md); + dateTimeString = md.getDateTimeString(); + + int agendaItemId = doc.getInteger("agendaItemId"); + String title = MongoPprUtils.getAgendaTitle(sessionId, agendaItemId); + agendaTitle = title; + + // Ergänzung um NLP-Informationen Document nlpDoc = (Document) doc.get("analysisResults"); nlp = readNlpInfo(nlpDoc); } @@ -86,6 +102,13 @@ public class HtmlSpeech { public void setFraction(String fraction) { this.fraction = fraction; } + public String getDateTimeString() {return dateTimeString;} + + public void setDateTimeString(String dateTimeString) {this.dateTimeString = dateTimeString;} + + public String getAgendaTitle() {return agendaTitle;} + + public void setAgendaTitle(String agendaTitle) {this.agendaTitle = agendaTitle;} public List getContent() { return content; @@ -112,13 +135,14 @@ public class HtmlSpeech { if (this == o) return true; if (!(o instanceof HtmlSpeech that)) return false; return Objects.equals(speechKey, that.speechKey) && Objects.equals(speakerName, that.speakerName) - && Objects.equals(fraction, that.fraction) && Objects.equals(content, that.content) + && Objects.equals(fraction, that.fraction) && Objects.equals(dateTimeString, that.dateTimeString) + && Objects.equals(agendaTitle, that.agendaTitle) && Objects.equals(content, that.content) && Objects.equals(nlp, that.nlp); } @Override public int hashCode() { - return Objects.hash(speechKey, speakerName, fraction, content, nlp); + return Objects.hash(speechKey, speakerName, fraction, dateTimeString, agendaTitle, content, nlp); } @Override @@ -127,6 +151,8 @@ public class HtmlSpeech { .add("speechKey='" + speechKey + "'") .add("speakerName='" + speakerName + "'") .add("fraction='" + fraction + "'") + .add("dateTimeString='" + dateTimeString + "'") + .add("agendaTitle='" + agendaTitle + "'") .add("content=" + content) .add("nlp=" + nlp) .toString(); diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/speech/SpeechMetaData.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/speech/SpeechMetaData.java index bb9d55d..1468786 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/speech/SpeechMetaData.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/domain/speech/SpeechMetaData.java @@ -12,6 +12,8 @@ public class SpeechMetaData { String speechKey; // z.B. "ID2011400300" int speechId; // TODO: nötig? int speakerId; + String speakerName; + String fraktion; int sessionId; // TODO: nötig? // aus "sessions" Collection @@ -45,6 +47,14 @@ public class SpeechMetaData { this.speakerId = speakerId; } + public String getSpeakerName() {return speakerName;} + + public void setSpeakerName(String speakerName) {this.speakerName = speakerName;} + + public String getFraktion() {return fraktion;} + + public void setFraktion(String fraktion) {this.fraktion = fraktion;} + public int getSessionId() { return sessionId; } @@ -81,12 +91,15 @@ public class SpeechMetaData { public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof SpeechMetaData that)) return false; - return speechId == that.speechId && speakerId == that.speakerId && sessionId == that.sessionId && Objects.equals(speechKey, that.speechKey) && Objects.equals(dateTime, that.dateTime) && Objects.equals(dateTimeString, that.dateTimeString) && Objects.equals(agendaTitle, that.agendaTitle); + return speechId == that.speechId && speakerId == that.speakerId && sessionId == that.sessionId + && Objects.equals(speechKey, that.speechKey) && Objects.equals(speakerName, that.speakerName) + && Objects.equals(fraktion, that.fraktion) && Objects.equals(dateTime, that.dateTime) + && Objects.equals(dateTimeString, that.dateTimeString) && Objects.equals(agendaTitle, that.agendaTitle); } @Override public int hashCode() { - return Objects.hash(speechKey, speechId, speakerId, sessionId, dateTime, dateTimeString, agendaTitle); + return Objects.hash(speechKey, speechId, speakerId, speakerName, fraktion, sessionId, dateTime, dateTimeString, agendaTitle); } @Override @@ -95,6 +108,8 @@ public class SpeechMetaData { .add("speechKey='" + speechKey + "'") .add("speechId=" + speechId) .add("speakerId=" + speakerId) + .add("speakerName='" + speakerName + "'") + .add("fraktion='" + fraktion + "'") .add("sessionId=" + sessionId) .add("dateTime=" + dateTime) .add("dateTimeString='" + dateTimeString + "'") diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/ParlamentarierController.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/ParlamentarierController.java index c522aa2..15eb37c 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/ParlamentarierController.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/ParlamentarierController.java @@ -109,30 +109,4 @@ public class ParlamentarierController { ctx.render("parlamentarierDetails.ftl", attributes); } - - /** - * Lösche alle Abgeordnete. - * @param ctx JavaLin-Context - */ - - @OpenApi( - summary = "Lösche alle Parlamentarier", - description = "Lösche alle Parlamentarier aus der Datenbank", - operationId = "deleteAllParlamentarier", - path = "/deleteParlamentarier", - methods = HttpMethod.DELETE, - tags = {"Parlamentarier"}, - responses = { - @OpenApiResponse(status = "204", content = {@OpenApiContent(from = Parlamentarier[].class)}) - }) - public static void deleteAllParlamentarier(Context ctx) { - - MongoPprUtils.truncateSpeakerCollection(); - List parlamentarier = MongoPprUtils.getAllParlamentarier(""); - - Map attributes = new HashMap<>(); - attributes.put("parlamentarier", parlamentarier); - attributes.put("filter", "filter"); - ctx.render("parlamentarier.ftl", attributes); - } } diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java index bf1fc31..a33dd16 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java @@ -58,11 +58,12 @@ public class RESTHandler { // Parlamentarier app.get("/", FrontEndController::getHomepage); app.get("/members", FrontEndController::getAllParlamentarier); - app.get("/portfolio/{id}", FrontEndController::getParlamentarierDetails); - app.delete("/deleteParlamentarier", ParlamentarierController::deleteAllParlamentarier); + app.get("/portfolio/{id}", ParlamentarierController::getParlamentarierDetails); // Reden app.get("/reden/{id}", FrontEndController::listSpeeches); // zeige Reden eines Parlamentariers an - app.get("/reden/{id}/{redeId}", FrontEndController::showSpeech); // zeige eine bestimmte Rede des Parlamentariers an + app.get("/reden/{id}/{redeId}", SpeechController::showSpeech); // zeige eine bestimmte Rede des Parlamentariers an + + app.get("/reden", SpeechController::listAllSpeeches); // zeige alle Reden an (Filtern möglich) } } diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandlerOld.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandlerOld.java index 84be658..df4424c 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandlerOld.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandlerOld.java @@ -59,7 +59,6 @@ public class RESTHandlerOld { // Parlamentarier app.get("/", ParlamentarierController::getAllParlamentarier); app.get("/portfolio/{id}", ParlamentarierController::getParlamentarierDetails); - app.delete("/deleteParlamentarier", ParlamentarierController::deleteAllParlamentarier); // Reden app.get("/reden/{id}", SpeechController::listSpeeches); // zeige Reden eines Parlamentariers an diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java index f6bb0ad..9a6e689 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java @@ -1,5 +1,6 @@ package org.texttechnologylab.project.gruppe_05_1.rest; +import de.tudarmstadt.ukp.dkpro.core.api.syntax.type.constituent.S; import io.javalin.http.Context; import io.javalin.openapi.*; import org.texttechnologylab.project.gruppe_05_1.database.MongoPprUtils; @@ -8,14 +9,14 @@ import org.texttechnologylab.project.gruppe_05_1.domain.html.ParlamentarierDetai import org.texttechnologylab.project.gruppe_05_1.domain.nlp.Token; import org.texttechnologylab.project.gruppe_05_1.domain.nlp.Topic; import org.texttechnologylab.project.gruppe_05_1.domain.speech.SpeechMetaData; +import org.texttechnologylab.project.gruppe_05_1.util.Logger; import org.texttechnologylab.project.gruppe_05_1.xml.speeches.Interfaces.Speech; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; +import static org.texttechnologylab.project.gruppe_05_1.util.PPRUtils.listFractionsFromMembers; + public class SpeechController { /** * Liste alle Reden eines Parlamentariers an @@ -65,6 +66,7 @@ public class SpeechController { @OpenApiResponse(status = "200", content = {@OpenApiContent(from = Speech.class)}) }) public static void showSpeech(Context ctx) { + String parlamentarierId = ctx.pathParam("id"); String redeId = ctx.pathParam("redeId"); Map attributes = new HashMap<>(); @@ -72,6 +74,10 @@ public class SpeechController { HtmlSpeech speech = MongoPprUtils.getSpeechByKey(redeId); attributes.put("s", speech); + // Foto des Abgeordnetes + String picture = MongoPprUtils.getParlamentarierPictureByID(parlamentarierId); + attributes.put("picture", picture); + // NLP: Topic if ((speech.getNlp() != null) && (speech.getNlp().getTopics() != null)) { Map topics = Topic.condenseTopicInformation(speech.getNlp().getTopics()); // Daten "verdichten"... @@ -107,4 +113,39 @@ public class SpeechController { ctx.render("speech.ftl", attributes); } + @OpenApi( + summary = "Liste alle Reden (Filtern ist möglich)", + description = "Liste alle Reden. Man kann nach Freitext (MdB Name, Partei/Fraktion) oder nach Thema (Topic) filtern", + operationId = "listAllSpeeches", + path = "/reden", + methods = HttpMethod.GET, + tags = {"Rede"}, + queryParams = { + @OpenApiParam(name = "filter", description = "Full-Text-Filter. Kann Vorname, Nachname oder Partei filtern", required = false), + // TODO: Topic Filter + }, + responses = { + @OpenApiResponse(status = "200", content = {@OpenApiContent(from = Speech[].class)}) + }) + public static void listAllSpeeches(Context ctx) { + String filter = ctx.queryParam("filter"); + Logger.info("Filter: '" + filter + "'"); + + List speechMetaDataList = MongoPprUtils.getSpeechesMetadata(filter); + + Map attributes = new HashMap<>(); + attributes.put("speechesMetaDataList", speechMetaDataList); + + // Filtern nach Text + attributes.put("filter", filter == null || filter.isBlank() ? null : filter); + + // Filtern nach Partei/Fraktion + attributes.put("parties", listFractionsFromMembers(MongoPprUtils.getAllParlamentarier(""))); + + // Filtern nach Topics - TODO + List topics = Arrays.asList("International", "Government", "Labor", "Economy", "Public"); + attributes.put("topics", topics); + + ctx.render("showAllSpeechesList.ftl", attributes); + } } diff --git a/src/main/resources/static/index.css b/src/main/resources/static/index.css index e5f30f8..0c16f07 100644 --- a/src/main/resources/static/index.css +++ b/src/main/resources/static/index.css @@ -126,6 +126,7 @@ th, td { padding: 12px; text-align: left; border-bottom: 1px solid #ddd; + border: 1px solid #ddd; } th { diff --git a/src/main/resources/templates/filterForm.ftl b/src/main/resources/templates/filterForm.ftl index 4da3171..916f487 100644 --- a/src/main/resources/templates/filterForm.ftl +++ b/src/main/resources/templates/filterForm.ftl @@ -1,14 +1,29 @@
-
+ + - + + <#if parties??> + + + + <#if topics??> + + +
diff --git a/src/main/resources/templates/header.ftl b/src/main/resources/templates/header.ftl index 2070c0c..d179b46 100644 --- a/src/main/resources/templates/header.ftl +++ b/src/main/resources/templates/header.ftl @@ -3,9 +3,10 @@ \ No newline at end of file diff --git a/src/main/resources/templates/parlamentarier.ftl b/src/main/resources/templates/parlamentarier.ftl index 86277ed..f42ea6c 100644 --- a/src/main/resources/templates/parlamentarier.ftl +++ b/src/main/resources/templates/parlamentarier.ftl @@ -5,20 +5,13 @@ Abgeordnete Übersicht - - <#include "header.ftl">

Abgeordnete (alphabetisch sortiert)

+ <#assign formAction = "/members"> <#include "filterForm.ftl">
diff --git a/src/main/resources/templates/showAllSpeechesList.ftl b/src/main/resources/templates/showAllSpeechesList.ftl new file mode 100644 index 0000000..07eb148 --- /dev/null +++ b/src/main/resources/templates/showAllSpeechesList.ftl @@ -0,0 +1,47 @@ + + + + + + + Alle Reden + +<#include "header.ftl"> + +

Reden

+
+ +
+ <#assign formAction = "/reden"> + <#include "filterForm.ftl"> +

+ +
+ + + + + + + + + + + + <#list speechesMetaDataList as redeMd> + + + + + + + + + +
DatumNameFraktionSitzung / Agenda
${redeMd.dateTimeString}${redeMd.speakerName}${redeMd.fraktion}${redeMd.sessionId} / ${redeMd.agendaTitle}
+
+ +
+ +<#include "footer.ftl"> + \ No newline at end of file diff --git a/src/main/resources/templates/speech.ftl b/src/main/resources/templates/speech.ftl index aa7b4e0..e687e33 100644 --- a/src/main/resources/templates/speech.ftl +++ b/src/main/resources/templates/speech.ftl @@ -1,7 +1,7 @@ - + Rede von ${s.speakerName} <#if s.fraction??> (${s.fraction}) </#if> @@ -16,11 +16,26 @@ <#include "header.ftl"> -

Rede von ${s.speakerName} <#if s.fraction??> (${s.fraction})

+

+ Rede von ${s.speakerName} + <#if s.fraction??> (${s.fraction}) + <#if s.dateTimeString??> vom ${s.dateTimeString} +


-

Rede ${s.speechKey}

+

+ Rede ${s.speechKey} + <#if s.agendaTitle??> / Agendapunkt: ${s.agendaTitle} +

+ +
+ <#if picture??> + Foto von ${s.speakerName} + <#else> +

(kein Foto verfügbar)

+ +

<#list s.content as c> <#include "speechContent.ftl"> diff --git a/src/main/resources/templates/topicsBubbleChart.ftl b/src/main/resources/templates/topicsBubbleChart.ftl index 883016d..5e39aa2 100644 --- a/src/main/resources/templates/topicsBubbleChart.ftl +++ b/src/main/resources/templates/topicsBubbleChart.ftl @@ -1,52 +1,65 @@ + - + + topics_bc_simulation.on("tick", () => { + bubbles.attr("cx", d => d.x).attr("cy", d => d.y); + topics_labels.attr("x", d => d.x).attr("y", d => d.y); + }); +