limit students per class

This commit is contained in:
Thibault Duplessis 2020-04-08 19:58:57 -05:00
parent 3bafda3c4b
commit 1fac7c5ecf
4 changed files with 91 additions and 74 deletions

View file

@ -211,27 +211,28 @@ final class Clas(
Ok(_)
} else
WithClassAndStudents(me, id) { (clas, students) =>
ctx.req.flash.get("created").map(_ split ' ').?? {
for {
created <- ctx.req.flash.get("created").map(_ split ' ').?? {
case Array(userId, password) =>
env.clas.api.student
.get(clas, userId)
.map2(lila.clas.Student.WithPassword(_, lila.user.User.ClearPassword(password)))
case _ => fuccess(none)
} flatMap { created =>
env.clas.forms.student.generate map { createForm =>
Ok(
}
nbStudents <- env.clas.api.student.count(clas.id)
createForm <- env.clas.forms.student.generate
} yield Ok(
html.clas.student.form(
clas,
students,
env.clas.forms.student.invite(clas),
createForm,
nbStudents,
created
)
)
}
}
}
}
def studentCreate(id: String) = SecureBody(_.Teacher) { implicit ctx => me =>
NoTor {
@ -241,14 +242,17 @@ final class Clas(
.bindFromRequest()(ctx.body)
.fold(
err =>
env.clas.api.student.count(clas.id) map { nbStudents =>
BadRequest(
html.clas.student.form(
clas,
students,
env.clas.forms.student.invite(clas),
err
err,
nbStudents
)
).fuccess,
)
},
data =>
env.clas.api.student.create(clas, data, me) map {
case (user, password) =>
@ -268,14 +272,17 @@ final class Clas(
.bindFromRequest()(ctx.body)
.fold(
err =>
env.clas.api.student.count(clas.id) map { nbStudents =>
BadRequest(
html.clas.student.form(
clas,
students,
err,
env.clas.forms.student.create
env.clas.forms.student.create,
nbStudents
)
).fuccess,
)
},
data =>
env.user.repo named data.username flatMap {
_ ?? { user =>

View file

@ -113,11 +113,21 @@ object student {
students: List[Student],
invite: Form[_],
create: Form[_],
nbStudents: Int,
created: Option[lila.clas.Student.WithPassword] = none
)(implicit ctx: Context) =
bits.layout(trans.clas.addStudent.txt(), Left(c withStudents students))(
cls := "box-pad student-add",
h1(trans.clas.addStudent()),
h1(
trans.clas.addStudent(),
s" ($nbStudents/${lila.clas.Clas.maxStudents})"
),
nbStudents > (lila.clas.Clas.maxStudents / 2) option p(dataIcon := "", cls := "text")(
s"Note that a class can have up to ${lila.clas.Clas.maxStudents} students.",
"To manage more students, ",
a(href := routes.Clas.studentForm(c.id.value))("create more classes"),
"."
),
created map {
case Student.WithPassword(student, password) =>
flashMessage(cls := "student-add__created")(
@ -134,6 +144,7 @@ object student {
)
},
standardFlash(),
(nbStudents <= lila.clas.Clas.maxStudents) option frag(
div(cls := "student-add__choice")(
div(cls := "info")(
h2(trans.clas.inviteALichessAccount()),
@ -158,14 +169,8 @@ object student {
div(cls := "info")(
h2(trans.clas.createANewLichessAccount()),
p(trans.clas.createDesc1()),
p(
trans.clas.createDesc2()
),
p(
strong(trans.clas.createDesc3()),
br,
trans.clas.createDesc4()
)
p(trans.clas.createDesc2()),
p(strong(trans.clas.createDesc3()), br, trans.clas.createDesc4())
),
postForm(cls := "form3", action := routes.Clas.studentCreate(c.id.value))(
form3.group(
@ -182,6 +187,7 @@ object student {
)
)
)
)
def edit(clas: Clas, students: List[Student], s: Student.WithUser, form: Form[_])(implicit ctx: Context) =
bits.layout(s.user.username, Left(clas withStudents students), s.student.some)(

View file

@ -26,6 +26,8 @@ case class Clas(
object Clas {
val maxStudents = 100
def make(teacher: User, name: String, desc: String) = Clas(
_id = Id(scala.util.Random.alphanumeric take 8 mkString),
name = name,

View file

@ -122,6 +122,8 @@ final class ClasApi(
}
}
def count(clasId: Clas.Id): Fu[Int] = coll.countSel($doc("clasId" -> clasId))
def isManaged(user: User): Fu[Boolean] =
coll.exists($doc("userId" -> user.id, "managed" -> true))