Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Linus
apb
Commits
8bd766df
Commit
8bd766df
authored
Oct 09, 2018
by
Linus
🤔
Browse files
Add tut swapping feature
parent
2b19972e
Pipeline
#77535
passed with stages
in 25 seconds
Changes
13
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
.gitignore
View file @
8bd766df
files/
listings.toml
files/
*
del.go
View file @
8bd766df
...
...
@@ -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 :)
\n
Deleted "
+
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
)
}
functions.go
View file @
8bd766df
...
...
@@ -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
)
...
...
main.go
View file @
8bd766df
...
...
@@ -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
()
...
...
search.go
View file @
8bd766df
...
...
@@ -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
}
templates/delete.html
View file @
8bd766df
{{ 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 }}
templates/message.html
0 → 100644
View file @
8bd766df
{{ define "content" }}
<p>
{{ .Message }}
</p>
{{ end }}
templates/search.html
View file @
8bd766df
...
...
@@ -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 }}
templates/subject_dropdown.html
0 → 100644
View file @
8bd766df
{{ 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 }}
templates/template.html
View file @
8bd766df
...
...
@@ -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 Repositor
y
</a>
</div>
</div>
<div
class=
"main"
>
...
...
templates/tutswap.html
View file @
8bd766df
{{ 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 }}
templates/tutswap_found.html
View file @
8bd766df
...
...
@@ -5,7 +5,7 @@
<h3>
Füge deine eigene Anzeige hinzu
</h3>
<form
method=
"post"
action=
"/add
listing
"
>
<form
method=
"post"
action=
"/add
swap
"
>
<div
class=
"foundcard"
>
<p
class=
"email_text"
>
Email
</p>
<p
class=
"email"
><input
type=
"email"
name=
"email"
></p>
...
...
tutswap.go
View file @
8bd766df
...
...
@@ -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"
:
"
Su
ch
e
"
,
"Title"
:
"
Tutorientaus
ch"
,
}
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
)
}
listings
Mutex
.
Lock
()
defer
listings
Mutex
.
Unlock
()
swap
Mutex
.
Lock
()
defer
swap
Mutex
.
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
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment