Skip to content

Commit

Permalink
added configurator
Browse files Browse the repository at this point in the history
  • Loading branch information
jschiel committed May 5, 2024
1 parent df3dc1e commit e6ec9ec
Show file tree
Hide file tree
Showing 8 changed files with 266 additions and 4 deletions.
14 changes: 12 additions & 2 deletions backend/database/Queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -587,12 +587,10 @@ def remove_message(self, message_id):
reminder: Reminder = self.session.query(
Reminder).filter_by(id=message_id).first()


self.session.delete(reminder)

self.session.commit()


def get_username_alias(self, member_id):
member: Member = self.session.query(
Member).filter_by(id=member_id).first()
Expand Down Expand Up @@ -664,6 +662,18 @@ def delete_token(self, token):
def load_tokens(self):
return self.session.query(Session).all()

def get_config_state(self):
admin: Member = self.session.query(Member).filter_by(
name=util.admin_username).first()

return admin.balance

def set_config_state(self, state):
admin: Member = self.session.query(Member).filter_by(
name=util.admin_username).first()
admin.balance = state
self.session.commit()

def restore_database(self, imported_data):
checkouts: list[Checkout] = self.session.query(Checkout).all()
drinks: list[Drink] = self.session.query(Drink).all()
Expand Down
64 changes: 64 additions & 0 deletions backend/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,70 @@ def post(self):
return util.build_response("ok")


config_model = api.model('Config state', {
'state': fields.Integer
})


@api.route('/config/status')
class check_config_state(Resource):
@api.doc()
def get(self):
"""
get the config state of the drinklist
"""
return util.build_response(db.get_config_state())

@api.doc(body=config_model)
def post(self):
"""
change the config state of the drinklist
"""
if db.get_config_state() != 0 and not is_admin():
return util.build_response("unauthorized", code=401)
state = request.json['state']
db.set_config_state(state)
return util.build_response("ok")


config_model = api.model('Drinklist init', {
'adminName': fields.String,
'adminPassword': fields.String,
'modName': fields.String,
'modPassword': fields.String,
'users': fields.List(fields.String)
})


@api.route('/config/init')
class check_config_state(Resource):
@api.doc(body=config_model)
def post(self):
"""
config the drinklist
"""
if db.get_config_state() != 0 and not is_admin():
return util.build_response("unauthorized", code=401)
adminName = request.json['adminName']
adminPassword = request.json['adminPassword']
modName = request.json['modName']
modPassword = request.json['modPassword']
usernames = request.json['users']

db.set_config_state(1)
db.change_user_name(1, adminName)
db.change_user_password(1, adminPassword)

db.change_user_name(2, modName)
db.change_user_password(2, modPassword)

for user in usernames:
db.add_user(name=user, money=0,
password=util.standard_user_password, alias=user)

return util.build_response("ok")


@api.route('/webhooks/releases')
class webhook_releases(Resource):
@api.doc()
Expand Down
37 changes: 37 additions & 0 deletions frontend/src/Components/Admin/Configurator/MainConfigurator.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import React from 'react'
import { Button, Stack, Typography } from '@mui/material'
import Spacer from '../../Common/Spacer'
import { doPostRequest } from '../../Common/StaticFunctions'
import { useNavigate } from 'react-router-dom'

type Props = {}

const MainConfigurator = (props: Props) => {
const navigate = useNavigate();
const no = () => {
doPostRequest("config/status", { state: 1 }).then((response) => {
if (response.code === 200) {
navigate("/")
}
})
}

const yes = () => {
navigate("/config/init")
}

return (
<Stack flexDirection={"column"} flexWrap={"wrap"} justifyContent={"center"} alignItems={"center"} gap={1}>
<Typography variant='h2'>Wilkommen zur Drinklist</Typography>
<Typography variant='h5'>Du scheinst die Drinklist zum ersten mal zu benutzen</Typography>
<Typography variant='h5'>Möchtest du den Konfigurator starten?</Typography>
<Spacer vertical={10} />
<Stack flexDirection={"row"} flexWrap={"wrap"} justifyContent={"center"} alignItems={"center"} gap={1}>
<Button onClick={no} variant='contained'>Nein, weiter zur Drinklist</Button>
<Button onClick={yes} variant='contained'>Ja, zum Konfigurator</Button>
</Stack>
</Stack>
)
}

export default MainConfigurator
112 changes: 112 additions & 0 deletions frontend/src/Components/Admin/Configurator/MainConfiguratorInit.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import { Button, CircularProgress, Dialog, DialogContent, DialogTitle, Stack, TextField, Typography } from '@mui/material'
import React, { useState } from 'react'
import Spacer from '../../Common/Spacer'
import { useNavigate } from 'react-router-dom'
import style from './configurator.module.scss'
import { doPostRequest } from '../../Common/StaticFunctions'
import { useDispatch } from 'react-redux'
import { openToast } from '../../../Actions/CommonAction'

type Props = {}

const MainConfiguratorInit = (props: Props) => {
const navigate = useNavigate();
const dispatch = useDispatch();

const configDrinklist = () => {
if (adminName === "" || adminPassword === "" || modName === "" || modPassword === "") {
dispatch(openToast({ message: "Bitte alle Felder ausfüllen", type: 'error' }))
return
}

setprocessingInfoOpen(true)

doPostRequest("config/init", {
adminName: adminName,
adminPassword: adminPassword,
modName: modName,
modPassword: modPassword,
users: names.split("\n")
}).then(response => {
if (response.code === 200) {
navigate("/")
}
})
}

const [adminName, setadminName] = useState("")
const [adminPassword, setadminPassword] = useState("")
const [modName, setmodName] = useState("")
const [modPassword, setmodPassword] = useState("")
const [names, setnames] = useState("")
const [processingInfoOpen, setprocessingInfoOpen] = useState(false)

return (
<>
<Stack flexDirection={"column"} flexWrap={"wrap"} justifyContent={"center"} alignItems={"center"} gap={1} className={style.fullWidth}>
<Stack flexDirection={"column"} flexWrap={"wrap"} justifyContent={"center"} alignItems={"center"} gap={1} className={style.outterBox}>
<Typography variant='h2'>Drinklist-Konfigurator</Typography>
<Spacer vertical={20} />
<Stack flexDirection={"row"} flexWrap={"wrap"} justifyContent={"space-between"} alignItems={"center"} gap={2} className={style.inputBox}>
<Typography variant='h5'>Admin Benutzername:</Typography>
<TextField value={adminName}
onChange={(value) => {
setadminName(value.target.value)
}} />
</Stack>
<Stack flexDirection={"row"} flexWrap={"wrap"} justifyContent={"space-between"} alignItems={"center"} gap={2} className={style.inputBox}>
<Typography variant='h5'>Admin Passwort:</Typography>
<TextField type="password" value={adminPassword}
onChange={(value) => {
setadminPassword(value.target.value)
}} />
</Stack>
<Stack flexDirection={"row"} flexWrap={"wrap"} justifyContent={"space-between"} alignItems={"center"} gap={2} className={style.inputBox}>
<Typography variant='h5'>Moderator Benutzername:</Typography>
<TextField value={modName}
onChange={(value) => {
setmodName(value.target.value)
}} />
</Stack>
<Stack flexDirection={"row"} flexWrap={"wrap"} justifyContent={"space-between"} alignItems={"center"} gap={2} className={style.inputBox}>
<Typography variant='h5'>Moderator Passwort:</Typography>
<TextField type="password" value={modPassword}
onChange={(value) => {
setmodPassword(value.target.value)
}} />
</Stack>
<Stack flexDirection={"row"} flexWrap={"wrap"} justifyContent={"space-between"} alignItems={"center"} gap={2} className={style.inputBox}>
<Stack>
<Typography variant='h5'>Benutzer anlegen:</Typography>
<Typography variant='caption'>Ein Nutzer pro Zeile</Typography>
</Stack>
<TextField
multiline
value={names}
onChange={(value) => {
setnames(value.target.value)
}}
/>
</Stack>

<Spacer vertical={20} />

<Stack flexDirection={"row"} flexWrap={"wrap"} justifyContent={"center"} alignItems={"flex-start"} gap={1}>
<Button onClick={configDrinklist} variant='contained'>Einrichten</Button>
</Stack>
</Stack>
</Stack>
<Dialog open={processingInfoOpen} sx={{ zIndex: 20000000 }} >
<DialogTitle>Configuriere Drinklist</DialogTitle>
<DialogContent>
<Stack gap={2} alignItems={"center"}>
<Typography>Das erstellen der Benutzer kann einige Zeit dauern</Typography>
<CircularProgress />
</Stack>
</DialogContent>
</Dialog>
</>
)
}

export default MainConfiguratorInit
11 changes: 11 additions & 0 deletions frontend/src/Components/Admin/Configurator/Popup.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import React from 'react'

type Props = {}

const Popup = (props: Props) => {
return (
<div>Popup</div>
)
}

export default Popup
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
@import "../../Common/variables.module.scss";

.inputBox {
width: 100%;
}

.outterBox {
width: fit-content;
}

.fullWidth {
width: 100%;
padding: $padding;
}
14 changes: 12 additions & 2 deletions frontend/src/Components/Common/LoginChecker/LoginChecker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ const LoginChecker = (props: Props) => {
requestString = "login/admin/check"
} else if (location.pathname.startsWith("/message")) {
return
}else if (location.pathname.startsWith("/config")) {
return
} else if (!location.pathname.startsWith("/login")) {
requestString = "login/check"
} else {
Expand All @@ -26,8 +28,16 @@ const LoginChecker = (props: Props) => {
console.log(Cookies.get(window.globalTS.AUTH_COOKIE_PREFIX + "memberID"))
doGetRequest(requestString).then((value) => {
if (value.code !== 200) {
navigate("/login?originalPath=" + location.pathname)
dispatch(setLoginState(false))
doGetRequest("config/status").then((response) => {
if (response.code === 200&&response.content===0) {
navigate("/config/start" + location.pathname)
dispatch(setLoginState(false))
} else {
navigate("/login?originalPath=" + location.pathname)
dispatch(setLoginState(false))
}
})

} else {
dispatch(setLoginState(true))

Expand Down
4 changes: 4 additions & 0 deletions frontend/src/Components/Routing/Routing.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import Login from '../Common/Login/Login';
import Details from '../User/Details/Details';
import UserOverview from '../User/Overview/Overview';
import Message from '../Common/Message/Message';
import MainConfigurator from '../Admin/Configurator/MainConfigurator';
import MainConfiguratorInit from '../Admin/Configurator/MainConfiguratorInit';

type Props = {}

Expand All @@ -21,6 +23,8 @@ const Routing = (props: Props) => {
<Route path="/login" element={<Login />} />
<Route path="/user/:userid" element={<Details />} />
<Route path="/message/:message" element={<Message />} />
<Route path="/config/start" element={<MainConfigurator />} />
<Route path="/config/init" element={<MainConfiguratorInit />} />
<Route path="/admin" element={<AdminOverview />} />
<Route path="/admin/members" element={<Members />} />
<Route path="/admin/transactions" element={<Transactions />} />
Expand Down

0 comments on commit e6ec9ec

Please sign in to comment.