From 166640f21177e58423d803a2560a94d005223a40 Mon Sep 17 00:00:00 2001 From: Walker Crouse Date: Sun, 20 Nov 2016 23:01:54 -0500 Subject: [PATCH 01/13] Start mocking out competition framework Signed-off-by: Walker Crouse --- app/assets/stylesheets/_admin.scss | 7 + app/assets/stylesheets/main.scss | 0 app/controllers/project/Competitions.scala | 42 +++++ app/controllers/project/Projects.scala | 4 +- app/db/impl/schema/CompetitionTable.scala | 49 ++++++ app/models/project/Competition.scala | 72 +++++++++ app/ore/permission/Permission.scala | 1 + app/views/bootstrap/header.scala.html | 145 ++---------------- .../projects/competitions/create.scala.html | 94 ++++++++++++ .../projects/competitions/manage.scala.html | 24 +++ app/views/users/menu.scala.html | 134 ++++++++++++++++ conf/messages | 21 ++- conf/routes | 2 + 13 files changed, 464 insertions(+), 131 deletions(-) mode change 100644 => 100755 app/assets/stylesheets/main.scss create mode 100755 app/controllers/project/Competitions.scala create mode 100644 app/db/impl/schema/CompetitionTable.scala create mode 100755 app/models/project/Competition.scala create mode 100755 app/views/projects/competitions/create.scala.html create mode 100755 app/views/projects/competitions/manage.scala.html create mode 100755 app/views/users/menu.scala.html diff --git a/app/assets/stylesheets/_admin.scss b/app/assets/stylesheets/_admin.scss index 574b7d441..53c2964db 100644 --- a/app/assets/stylesheets/_admin.scss +++ b/app/assets/stylesheets/_admin.scss @@ -42,3 +42,10 @@ .list-group-health { padding: 0; } + +.form-competition { + input[type="number"] { max-width: 40px; } + .setting-content { + text-align: right; + } +} diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss old mode 100644 new mode 100755 diff --git a/app/controllers/project/Competitions.scala b/app/controllers/project/Competitions.scala new file mode 100755 index 000000000..0119d696f --- /dev/null +++ b/app/controllers/project/Competitions.scala @@ -0,0 +1,42 @@ +package controllers.project + +import javax.inject.Inject + +import scala.concurrent.ExecutionContext + +import play.api.cache.AsyncCacheApi +import play.api.i18n.MessagesApi +import play.api.mvc.{Action, ActionBuilder, AnyContent} + +import controllers.OreBaseController +import db.ModelService +import ore.{OreConfig, OreEnv} +import ore.permission.EditCompetitions +import controllers.sugar.{Bakery, Requests} +import security.spauth.{SingleSignOnConsumer, SpongeAuthApi} +import views.{html => views} + +class Competitions @Inject()( + implicit val ec: ExecutionContext, + env: OreEnv, + messagesApi: MessagesApi, + config: OreConfig, + service: ModelService, + bakery: Bakery, + auth: SpongeAuthApi, + sso: SingleSignOnConsumer, + cache: AsyncCacheApi +) extends OreBaseController { + identity(messagesApi) + + def EditCompetitionsAction: ActionBuilder[Requests.AuthRequest, AnyContent] = Authenticated.andThen(PermissionAction(EditCompetitions)) + + def showManager(): Action[AnyContent] = EditCompetitionsAction { implicit request => + Ok(views.projects.competitions.manage()) + } + + def showCreator(): Action[AnyContent] = EditCompetitionsAction { implicit request => + Ok(views.projects.competitions.create()) + } + +} diff --git a/app/controllers/project/Projects.scala b/app/controllers/project/Projects.scala index 8f24729e5..ceb2f93c5 100644 --- a/app/controllers/project/Projects.scala +++ b/app/controllers/project/Projects.scala @@ -469,7 +469,7 @@ class Projects @Inject()(stats: StatTracker, forms: OreForms, factory: ProjectFa * * @param author Project owner * @param slug Project slug - * @return Project manager + * @return Project manage */ def showSettings(author: String, slug: String): Action[AnyContent] = SettingsEditAction(author, slug).asyncF { implicit request => @@ -565,7 +565,7 @@ class Projects @Inject()(stats: StatTracker, forms: OreForms, factory: ProjectFa } /** - * Saves the specified Project from the settings manager. + * Saves the specified Project from the settings manage. * * @param author Project owner * @param slug Project slug diff --git a/app/db/impl/schema/CompetitionTable.scala b/app/db/impl/schema/CompetitionTable.scala new file mode 100644 index 000000000..d1ae4cdc5 --- /dev/null +++ b/app/db/impl/schema/CompetitionTable.scala @@ -0,0 +1,49 @@ +package db.impl.schema + +import java.sql.Timestamp + +import db.impl.OrePostgresDriver.api._ +import db.impl.table.common.{DescriptionColumn, NameColumn} +import db.table.ModelTable +import models.project.Competition + +class CompetitionTable(tag: Tag) + extends ModelTable[Competition](tag, "project_competitions") + with NameColumn[Competition] + with DescriptionColumn[Competition] { + + def startDate = column[Timestamp]("start_date") + def endDate = column[Timestamp]("end_date") + def isVotingEnabled = column[Boolean]("is_voting_enabled") + def isStaffVotingOnly = column[Boolean]("is_staff_voting_only") + def shouldShowVoteCount = column[Boolean]("should_show_vote_count") + def isSpongeOnly = column[Boolean]("is_sponge_only") + def isSourceRequired = column[Boolean]("is_source_required") + def defaultVotes = column[Int]("default_votes") + def staffVotes = column[Int]("staff_votes") + def allowedEntries = column[Int]("allowed_entries") + def maxEntryTotal = column[Int]("max_entry_total") + + override def * = + mkProj( + ( + id.?, + createdAt.?, + name, + description.?, + startDate, + endDate, + isVotingEnabled, + isStaffVotingOnly, + shouldShowVoteCount, + isSpongeOnly, + isSourceRequired, + defaultVotes, + staffVotes, + allowedEntries, + maxEntryTotal.? + ) + )( + mkTuple[Competition]() + ) +} diff --git a/app/models/project/Competition.scala b/app/models/project/Competition.scala new file mode 100755 index 000000000..1e8e16818 --- /dev/null +++ b/app/models/project/Competition.scala @@ -0,0 +1,72 @@ +package models.project + +import java.sql.Timestamp + +import db.impl.model.common.{Describable, Named} +import db.impl.schema.CompetitionTable +import db.{InsertFunc, Model, ModelQuery, ObjId, ObjectTimestamp} + +import slick.lifted.TableQuery + +case class Competition( + id: ObjId[Competition], + createdAt: ObjectTimestamp, + name: String, + description: Option[String], + startDate: Timestamp, + endDate: Timestamp, + isVotingEnabled: Boolean, + isStaffVotingOnly: Boolean, + shouldShowVoteCount: Boolean, + isSpongeOnly: Boolean, + isSourceRequired: Boolean, + defaultVotes: Int, + staffVotes: Int, + allowedEntries: Int, + maxEntryTotal: Option[Int] +) extends Model + with Named + with Describable { + + override type M = Competition + override type T = CompetitionTable +} +object Competition { + + def partial( + name: String, + description: Option[String], + startDate: Timestamp, + endDate: Timestamp, + isVotingEnabled: Boolean = true, + isStaffVotingOnly: Boolean = false, + shouldShowVoteCount: Boolean = true, + isSpongeOnly: Boolean = false, + isSourceRequired: Boolean = false, + defaultVotes: Int = 1, + staffVotes: Int = 1, + allowedEntries: Int = 1, + maxEntryTotal: Option[Int] = None + ): InsertFunc[Competition] = + (id, time) => + Competition( + id, + time, + name, + description, + startDate, + endDate, + isVotingEnabled, + isStaffVotingOnly, + shouldShowVoteCount, + isSpongeOnly, + isSourceRequired, + defaultVotes, + staffVotes, + allowedEntries, + maxEntryTotal + ) + + implicit val query: ModelQuery[Competition] = + ModelQuery.from[Competition](TableQuery[CompetitionTable], _.copy(_, _)) +} diff --git a/app/ore/permission/Permission.scala b/app/ore/permission/Permission.scala index 1054a4cc1..3a998ff9e 100644 --- a/app/ore/permission/Permission.scala +++ b/app/ore/permission/Permission.scala @@ -30,3 +30,4 @@ object ViewActivity extends Permission(Moderation) object ViewStats extends Permission(Moderation) object EditPages extends Permission(Limited) object EditVersions extends Permission(Limited) +object EditCompetitions extends Permission(Moderation) diff --git a/app/views/bootstrap/header.scala.html b/app/views/bootstrap/header.scala.html index 33ce3dafb..f23000024 100755 --- a/app/views/bootstrap/header.scala.html +++ b/app/views/bootstrap/header.scala.html @@ -58,27 +58,6 @@ @if(user) {