Commit 8bd766df authored by Linus's avatar Linus 🤔
Browse files

Add tut swapping feature

parent 2b19972e
Pipeline #77535 passed with stages
in 25 seconds
files/listings.toml
files/*
......@@ -10,7 +10,7 @@ func del(w http.ResponseWriter, r *http.Request) error {
args := map[string]interface{}{
"Title": "Daten löschen",
}
return render("templates/delete.html", args, w, r)
return render("templates/delete.html", args, w, r, "templates/subject_dropdown.html")
}
func doDel(w http.ResponseWriter, r *http.Request) error {
......@@ -26,26 +26,72 @@ func doDel(w http.ResponseWriter, r *http.Request) error {
return renderError("Email leer", w, r)
}
listingsMutex.Lock()
defer listingsMutex.Unlock()
numDeleted := 0
for key, value := range listings {
i := 0
for _, listing := range value {
if strings.ToLower(listing.Email) != strings.ToLower(email) {
value[i] = listing
i++
subj := r.FormValue("subject")
if !hasSubject(subj) {
return renderError("Dieses Fach existiert nicht. Bitte nutze die Autocomplete-Funktion, "+
"oder falls du Javascript ablehnst die Liste von akzeptierten Fächern.\n", w, r)
}
typ := r.FormValue("type")
var file string
var toSave interface{}
var numDeleted int
if typ == "partner" {
file = listingsFile
listingsMutex.Lock()
defer listingsMutex.Unlock()
numDeleted = 0
for key, value := range listings {
if strings.Split(key, "::")[0] != subj {
continue
}
i := 0
for _, listing := range value {
if strings.ToLower(listing.Email) != strings.ToLower(email) {
value[i] = listing
i++
}
}
l := len(value)
listings[key] = value[:i]
numDeleted += l - i
}
l := len(value)
listings[key] = value[:i]
numDeleted += l - i
toSave = listings
} else if typ == "tutorium" {
file = swapListingsFile
swapMutex.Lock()
defer swapMutex.Unlock()
numDeleted = 0
for key, value := range swaps {
if key != subj {
continue
}
i := 0
for _, swapListing := range value {
if strings.ToLower(swapListing.Email) != strings.ToLower(email) {
value[i] = swapListing
i++
}
}
l := len(value)
swaps[key] = value[:i]
numDeleted += l - i
}
toSave = swaps
} else {
return renderError("type muss entweder partner oder tutorium sein.", w, r)
}
err = saveStruct(listings, listingsFile)
err = saveStruct(toSave, file)
if err != nil {
return err
}
_, err = w.Write([]byte("Ok :)\nDeleted " + strconv.Itoa(numDeleted) + "\n"))
return err
if numDeleted == 0 {
return renderError("Es scheint so, als wäre so ein Eintrag nicht vorhanden.\n"+
"Ist er doch vorhanden, kontaktiere mich über das Repo.", w, r)
}
return renderMessage("Ok, habe " + strconv.Itoa(numDeleted) + " Einträge gelöscht.", "Na dann", w, r)
}
......@@ -15,6 +15,7 @@ var regFunctions = map[string]func(http.ResponseWriter, *http.Request) error{
"/dosearch": doSearch,
"/doswapsearch": tutSwapSearch,
"/addlisting": addListing,
"/addswap": addSwap,
"/info": info,
}
......@@ -33,8 +34,8 @@ func RegisterAll() {
}
}
func render(f string, args interface{}, w http.ResponseWriter, r *http.Request) error {
tmpl, err := template.ParseFiles("templates/template.html", f)
func render(f string, args interface{}, w http.ResponseWriter, r *http.Request, other ...string) error {
tmpl, err := template.ParseFiles(append(other, []string{"templates/template.html", f}...)...)
if err != nil {
return err
}
......@@ -47,6 +48,14 @@ func renderError(err string, w http.ResponseWriter, r *http.Request) error {
"Error": err,
}, w, r)
}
func renderMessage(msg string, title string, w http.ResponseWriter, r *http.Request) error {
return render("templates/message.html", map[string]string{
"Title": title,
"Message": msg,
}, w, r)
}
func welcome(w http.ResponseWriter, r *http.Request) error {
if r.URL.Path != "/" {
http.NotFound(w, r)
......
......@@ -38,7 +38,11 @@ func main() {
panic(err)
}
swapListingsFile = *dataPath + "tut_swap.toml"
swapListingsFile = *dataPath + "tut_swaps.toml"
err = loadSwapListings()
if err != nil {
panic(err)
}
RegisterAll()
......
......@@ -13,7 +13,7 @@ func search(w http.ResponseWriter, r *http.Request) error {
"Subjects": subjects,
"Title": "Suche",
}
return render("templates/search.html", args, w, r)
return render("templates/search.html", args, w, r, "templates/subject_dropdown.html")
}
func doSearch(w http.ResponseWriter, r *http.Request) error {
......@@ -103,4 +103,3 @@ func addListing(w http.ResponseWriter, r *http.Request) error {
http.Redirect(w, r, r.Referer(), http.StatusFound)
return nil
}
{{ define "content" }}
<b>Abgabepartner gefunden? Lösche hier deinen Eintrag.</b>
Bitte lösche nicht die Einträge von anderen.
Wir machen Backups, aber das wäre trotzdem einfach blöd.
<br><br>
<b>Abgabepartner gefunden oder Tutorium getauscht?</b> Lösche hier deinen Eintrag.
<br><br>
<form method="post" action="/dodelete">
<label for="email"><b>E-Mail</b></label>
<input type="email" name="email">
<br><br>
<select name="type">
<option value="partner">Abgabepartner gefunden</option>
<option value="tutorium">Tutorium getauscht</option>
</select>
<br><br>
{{ template "dropdown" }}
<br><br>
<input type="submit" value="Löschen">
</form>
{{ template "scripts" }}
{{ end }}
{{ define "content" }}
<p>{{ .Message }}</p>
{{ end }}
......@@ -4,16 +4,7 @@ im Bachelor (vielleicht auch Master?) Informatik suchen, oder
dich selbst finden lassen.
<form method="get" action="/dosearch">
<br><br>
<label for="subject"><b>Dein Fach:</b></label>
<input name="subject" id="subject">
<br>
<label for="subject">Bitte wähle ein Fach aus dem Autocomplete-Menü aus</label>
<noscript>
<br>
Du hast JS ausgeschaltet, also hier die Liste akzeptierter Fächer:
<br>
{{ range .Subjects }}{{ . }},{{ end }}
</noscript>
{{ template "dropdown" }}
<br><br>
<label for="tutorium"><b>Dein Tutorium:</b></label>
<input name="tutorium" type="number">
......@@ -28,17 +19,5 @@ Ist dein Fach nicht dabei? <a href="https://git.rwth-aachen.de/h/apb/">Erstelle
<br>
Gibt es ein Fach gar zwei mal?? Nehme erst mal das erste, und erstelle bitte auch ein Issue.
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script>
$(function() {
var tags = [
{{ range .Subjects }}"{{.}}",{{ end }}
];
$("#subject").autocomplete({
source: tags
});
});
</script>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
{{ template "scripts" }}
{{ end }}
{{ define "dropdown" }}
<label for="subject"><b>Dein Fach:</b></label>
<input name="subject" id="subject">
<br>
<label for="subject">Bitte wähle ein Fach aus dem Autocomplete-Menü aus</label>
<noscript>
<br>
Du hast JS ausgeschaltet, also hier die Liste akzeptierter Fächer:
<br>
{{ range .Subjects }}{{ . }},{{ end }}
</noscript>
{{ end }}
{{ define "scripts" }}
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script>
$(function() {
var tags = [
{{ range .Subjects }}"{{.}}",{{ end }}
];
$("#subject").autocomplete({
source: tags
});
});
</script>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
{{ end }}
......@@ -34,7 +34,7 @@
<a href="/data">Datenschutzerklärung</a>
</div>
<div class="sidebar-element">
<a href="/info">Info und Repositor</a>
<a href="/info">Info und Repository</a>
</div>
</div>
<div class="main">
......
{{ define "content" }}
<form method="get" action="/doswapsearch">
<br><br>
<label for="subject"><b>Dein Fach:</b></label>
<input name="subject" id="subject">
<br>
<label for="subject">Bitte wähle ein Fach aus dem Autocomplete-Menü aus</label>
<noscript>
<br>
Du hast JS ausgeschaltet, also hier die Liste akzeptierter Fächer:
<br>
{{ range .Subjects }}{{ . }},{{ end }}
</noscript>
{{ template "dropdown" }}
<br><br>
<input type="submit" value="Suchen!">
</form>
......@@ -21,17 +11,5 @@ Ist dein Fach nicht dabei? <a href="https://git.rwth-aachen.de/h/apb/">Erstelle
<br>
Gibt es ein Fach gar zwei mal?? Nehme erst mal das erste, und erstelle bitte auch ein Issue.
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script>
$(function() {
var tags = [
{{ range .Subjects }}"{{.}}",{{ end }}
];
$("#subject").autocomplete({
source: tags
});
});
</script>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
{{ template "scripts" }}
{{ end }}
......@@ -5,7 +5,7 @@
<h3>Füge deine eigene Anzeige hinzu</h3>
<form method="post" action="/addlisting">
<form method="post" action="/addswap">
<div class="foundcard">
<p class="email_text">Email</p>
<p class="email"><input type="email" name="email"></p>
......
......@@ -3,14 +3,15 @@ package main
import (
"html/template"
"net/http"
"time"
)
func tutSwap(w http.ResponseWriter, r *http.Request) error {
args := map[string]interface{}{
"Subjects": subjects,
"Title": "Suche",
"Title": "Tutorientausch",
}
return render("templates/tutswap.html", args, w, r)
return render("templates/tutswap.html", args, w, r, "templates/subject_dropdown.html")
}
func tutSwapSearch(w http.ResponseWriter, r *http.Request) error {
......@@ -24,8 +25,8 @@ func tutSwapSearch(w http.ResponseWriter, r *http.Request) error {
"oder falls du Javascript ablehnst die Liste von akzeptierten Fächern.\n", w, r)
}
listingsMutex.Lock()
defer listingsMutex.Unlock()
swapMutex.Lock()
defer swapMutex.Unlock()
results := swaps[subj]
var resultTemplate string
......@@ -47,3 +48,42 @@ func tutSwapSearch(w http.ResponseWriter, r *http.Request) error {
"Title": "Resultate",
})
}
func addSwap(w http.ResponseWriter, r *http.Request) error {
if r.Method != "POST" {
return renderError("Falsche Methode ("+r.Method+", nicht POST)", w, r)
}
err := r.ParseForm()
if err != nil {
return err
}
email := r.FormValue("email")
from := r.FormValue("from")
to := r.FormValue("to")
message := r.FormValue("message")
agreeStr := r.FormValue("agree")
subject := r.FormValue("subject")
if from == "" || to == "" {
return renderError("Von oder zu Tutorium leer", w, r)
}
if email == "" {
return renderError("Email leer", w, r)
}
if agreeStr != "on" {
return renderError("Du musst den Bedingungen zustimmen", w, r)
}
if !hasSubject(subject) {
return renderError("Das angegebene Fach existiert nicht", w, r)
}
swap := TutSwap{email, from, to, message, time.Now().Format("02.01.2006 um 15:04")}
swapMutex.Lock()
defer swapMutex.Unlock()
swaps[subject] = append(swaps[subject], swap)
err = saveStruct(swaps, swapListingsFile)
if err != nil {
return err
}
http.Redirect(w, r, r.Referer(), http.StatusFound)
return nil
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment