From b6a7dad1fad018bf04e42f08bd2b4c11b2fafc5a Mon Sep 17 00:00:00 2001 From: Lambert Wang Date: Wed, 27 Mar 2019 19:41:57 -0700 Subject: [PATCH 1/2] Show feedback user email to author --- Data/DataModel/Feedback.cs | 39 + ...190328022943_AnonymousFeedback.Designer.cs | 1001 +++++++++++++++++ .../20190328022943_AnonymousFeedback.cs | 23 + .../PuzzleServerContextModelSnapshot.cs | 4 +- ServerCore/Pages/Puzzles/Feedback.cshtml | 14 + .../Pages/Puzzles/SubmitFeedback.cshtml | 19 +- .../Pages/Puzzles/SubmitFeedback.cshtml.cs | 38 +- 7 files changed, 1120 insertions(+), 18 deletions(-) create mode 100644 Data/Migrations/20190328022943_AnonymousFeedback.Designer.cs create mode 100644 Data/Migrations/20190328022943_AnonymousFeedback.cs diff --git a/Data/DataModel/Feedback.cs b/Data/DataModel/Feedback.cs index 09fbc95c..3cad0035 100644 --- a/Data/DataModel/Feedback.cs +++ b/Data/DataModel/Feedback.cs @@ -9,15 +9,54 @@ namespace ServerCore.DataModel { public class Feedback { + public Feedback() + { + Fun = AvgRating; + Difficulty = AvgRating; + } + + public const int MinRating = 1; + public const int AvgRating = 1; + public const int MaxRating = 10; + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ID { get; set; } + [Required] public virtual Puzzle Puzzle { get; set; } + + /// + /// The user who submitted the feedback> + /// [Required] public virtual PuzzleUser Submitter {get; set;} + + /// + /// The time the feedback was submitted. + /// public DateTime SubmissionTime { get; set; } + + /// + /// True if the puzzle author should not be able to see details about + /// the user. + /// + public bool IsAnonymous { get; set; } + + /// + /// The feedback text submitted by the user. + /// public string WrittenFeedback { get; set; } + + /// + /// The user submitted difficulty score for the puzzle. + /// + [Range(MinRating, MaxRating)] public int Difficulty { get; set; } + + /// + /// The user submitted fun score for the puzzle. + /// + [Range(MinRating, MaxRating)] public int Fun { get; set; } } } diff --git a/Data/Migrations/20190328022943_AnonymousFeedback.Designer.cs b/Data/Migrations/20190328022943_AnonymousFeedback.Designer.cs new file mode 100644 index 00000000..384774ac --- /dev/null +++ b/Data/Migrations/20190328022943_AnonymousFeedback.Designer.cs @@ -0,0 +1,1001 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ServerCore.DataModel; + +namespace Data.Migrations +{ + [DbContext(typeof(PuzzleServerContext))] + [Migration("20190328022943_AnonymousFeedback")] + partial class AnonymousFeedback + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("SecurityStamp"); + + b.Property("TwoFactorEnabled"); + + b.Property("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128); + + b.Property("ProviderKey") + .HasMaxLength(128); + + b.Property("ProviderDisplayName"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider") + .HasMaxLength(128); + + b.Property("Name") + .HasMaxLength(128); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Annotation", b => + { + b.Property("PuzzleID"); + + b.Property("TeamID"); + + b.Property("Key"); + + b.Property("Contents") + .IsRequired() + .HasMaxLength(255); + + b.Property("Timestamp"); + + b.Property("Version"); + + b.HasKey("PuzzleID", "TeamID", "Key"); + + b.HasIndex("TeamID"); + + b.ToTable("Annotations"); + }); + + modelBuilder.Entity("ServerCore.DataModel.ContentFile", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("EventID"); + + b.Property("FileType"); + + b.Property("PuzzleID") + .IsRequired(); + + b.Property("ShortName") + .IsRequired(); + + b.Property("UrlString") + .IsRequired(); + + b.HasKey("ID"); + + b.HasIndex("PuzzleID"); + + b.HasIndex("EventID", "ShortName") + .IsUnique(); + + b.ToTable("ContentFiles"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Event", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AllowFeedback"); + + b.Property("AnswerSubmissionEnd"); + + b.Property("AnswersAvailableBegin"); + + b.Property("ContactEmail"); + + b.Property("EventBegin"); + + b.Property("HomePartial"); + + b.Property("IsInternEvent"); + + b.Property("LockoutDurationMultiplier"); + + b.Property("LockoutIncorrectGuessLimit"); + + b.Property("LockoutIncorrectGuessPeriod"); + + b.Property("MaxExternalsPerTeam"); + + b.Property("MaxNumberOfTeams"); + + b.Property("MaxSubmissionCount"); + + b.Property("MaxTeamSize"); + + b.Property("Name") + .IsRequired(); + + b.Property("ShowFastestSolves"); + + b.Property("StandingsAvailableBegin"); + + b.Property("StandingsOverride"); + + b.Property("TeamDeleteEnd"); + + b.Property("TeamMembershipChangeEnd"); + + b.Property("TeamMiscDataChangeEnd"); + + b.Property("TeamNameChangeEnd"); + + b.Property("TeamRegistrationBegin"); + + b.Property("TeamRegistrationEnd"); + + b.Property("UrlString"); + + b.HasKey("ID"); + + b.HasIndex("UrlString") + .IsUnique() + .HasFilter("[UrlString] IS NOT NULL"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("ServerCore.DataModel.EventAdmins", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdminID"); + + b.Property("EventID"); + + b.HasKey("ID"); + + b.HasIndex("AdminID"); + + b.HasIndex("EventID"); + + b.ToTable("EventAdmins"); + }); + + modelBuilder.Entity("ServerCore.DataModel.EventAuthors", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AuthorID"); + + b.Property("EventID"); + + b.HasKey("ID"); + + b.HasIndex("AuthorID"); + + b.HasIndex("EventID"); + + b.ToTable("EventAuthors"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Feedback", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Difficulty"); + + b.Property("Fun"); + + b.Property("IsAnonymous"); + + b.Property("PuzzleID"); + + b.Property("SubmissionTime"); + + b.Property("SubmitterID"); + + b.Property("WrittenFeedback"); + + b.HasKey("ID"); + + b.HasIndex("PuzzleID"); + + b.HasIndex("SubmitterID"); + + b.ToTable("Feedback"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Hint", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Content") + .IsRequired(); + + b.Property("Cost"); + + b.Property("Description") + .IsRequired(); + + b.Property("DisplayOrder"); + + b.Property("PuzzleID"); + + b.HasKey("Id"); + + b.HasIndex("PuzzleID"); + + b.ToTable("Hints"); + }); + + modelBuilder.Entity("ServerCore.DataModel.HintStatePerTeam", b => + { + b.Property("TeamID"); + + b.Property("HintID"); + + b.Property("UnlockTime"); + + b.HasKey("TeamID", "HintID"); + + b.HasIndex("HintID"); + + b.ToTable("HintStatePerTeam"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Invitation", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("EmailAddress"); + + b.Property("Expiration"); + + b.Property("InvitationCode"); + + b.Property("InvitationType"); + + b.Property("TeamID"); + + b.HasKey("ID"); + + b.HasIndex("TeamID"); + + b.ToTable("Invitations"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Piece", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Contents") + .IsRequired(); + + b.Property("ProgressLevel"); + + b.Property("PuzzleID"); + + b.HasKey("ID"); + + b.HasIndex("PuzzleID"); + + b.ToTable("Pieces"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Prerequisites", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("PrerequisiteID"); + + b.Property("PuzzleID"); + + b.HasKey("ID"); + + b.HasIndex("PrerequisiteID"); + + b.HasIndex("PuzzleID"); + + b.ToTable("Prerequisites"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Puzzle", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CustomURL"); + + b.Property("Description"); + + b.Property("EventID"); + + b.Property("Group"); + + b.Property("HintCoinsForSolve"); + + b.Property("HintsAreCumulative"); + + b.Property("IsCheatCode"); + + b.Property("IsFinalPuzzle"); + + b.Property("IsGloballyVisiblePrerequisite"); + + b.Property("IsMetaPuzzle"); + + b.Property("IsPuzzle"); + + b.Property("MaxAnnotationKey"); + + b.Property("MinPrerequisiteCount"); + + b.Property("MinutesOfEventLockout"); + + b.Property("MinutesToAutomaticallySolve"); + + b.Property("Name") + .IsRequired(); + + b.Property("OrderInGroup"); + + b.Property("SolveValue"); + + b.Property("SupportEmailAlias"); + + b.Property("Token"); + + b.HasKey("ID"); + + b.HasIndex("EventID"); + + b.ToTable("Puzzles"); + }); + + modelBuilder.Entity("ServerCore.DataModel.PuzzleAuthors", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AuthorID"); + + b.Property("PuzzleID"); + + b.HasKey("ID"); + + b.HasIndex("AuthorID"); + + b.HasIndex("PuzzleID"); + + b.ToTable("PuzzleAuthors"); + }); + + modelBuilder.Entity("ServerCore.DataModel.PuzzleStatePerTeam", b => + { + b.Property("PuzzleID"); + + b.Property("TeamID"); + + b.Property("IsEmailOnlyMode"); + + b.Property("LockoutExpiryTime"); + + b.Property("Notes"); + + b.Property("Printed"); + + b.Property("SolvedTime"); + + b.Property("UnlockedTime"); + + b.Property("WrongSubmissionCountBuffer"); + + b.HasKey("PuzzleID", "TeamID"); + + b.HasIndex("TeamID"); + + b.ToTable("PuzzleStatePerTeam"); + }); + + modelBuilder.Entity("ServerCore.DataModel.PuzzleUser", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Email"); + + b.Property("EmployeeAlias"); + + b.Property("IdentityUserId") + .IsRequired(); + + b.Property("IsGlobalAdmin"); + + b.Property("Name"); + + b.Property("PhoneNumber"); + + b.Property("TShirtSize"); + + b.Property("VisibleToOthers"); + + b.HasKey("ID"); + + b.ToTable("PuzzleUsers"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Response", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("IsSolution"); + + b.Property("Note"); + + b.Property("PuzzleID"); + + b.Property("ResponseText") + .IsRequired(); + + b.Property("SubmittedText") + .IsRequired(); + + b.HasKey("ID"); + + b.HasIndex("PuzzleID"); + + b.ToTable("Responses"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Submission", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("PuzzleID"); + + b.Property("ResponseID"); + + b.Property("SubmissionText") + .IsRequired(); + + b.Property("SubmitterID"); + + b.Property("TeamID"); + + b.Property("TeamID1"); + + b.Property("TimeSubmitted"); + + b.HasKey("ID"); + + b.HasIndex("PuzzleID"); + + b.HasIndex("ResponseID"); + + b.HasIndex("SubmitterID"); + + b.HasIndex("TeamID"); + + b.HasIndex("TeamID1"); + + b.ToTable("Submissions"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Team", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CustomRoom"); + + b.Property("EventID"); + + b.Property("HintCoinCount"); + + b.Property("HintCoinsUsed"); + + b.Property("IsLookingForTeammates"); + + b.Property("Name"); + + b.Property("PrimaryContactEmail"); + + b.Property("PrimaryPhoneNumber"); + + b.Property("RoomID"); + + b.Property("SecondaryPhoneNumber"); + + b.HasKey("ID"); + + b.HasIndex("EventID"); + + b.ToTable("Teams"); + }); + + modelBuilder.Entity("ServerCore.DataModel.TeamApplication", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("PlayerID"); + + b.Property("TeamID"); + + b.HasKey("ID"); + + b.HasIndex("PlayerID"); + + b.HasIndex("TeamID"); + + b.ToTable("TeamApplications"); + }); + + modelBuilder.Entity("ServerCore.DataModel.TeamMembers", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Team.ID") + .IsRequired(); + + b.Property("User.ID") + .IsRequired(); + + b.HasKey("ID"); + + b.HasIndex("Team.ID"); + + b.HasIndex("User.ID"); + + b.ToTable("TeamMembers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.Annotation", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Team", "Team") + .WithMany() + .HasForeignKey("TeamID") + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity("ServerCore.DataModel.ContentFile", b => + { + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithMany() + .HasForeignKey("EventID") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany("Contents") + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.EventAdmins", b => + { + b.HasOne("ServerCore.DataModel.PuzzleUser", "Admin") + .WithMany() + .HasForeignKey("AdminID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithMany() + .HasForeignKey("EventID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.EventAuthors", b => + { + b.HasOne("ServerCore.DataModel.PuzzleUser", "Author") + .WithMany() + .HasForeignKey("AuthorID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithMany() + .HasForeignKey("EventID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.Feedback", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.PuzzleUser", "Submitter") + .WithMany() + .HasForeignKey("SubmitterID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.Hint", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.HintStatePerTeam", b => + { + b.HasOne("ServerCore.DataModel.Hint", "Hint") + .WithMany() + .HasForeignKey("HintID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Team", "Team") + .WithMany() + .HasForeignKey("TeamID") + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity("ServerCore.DataModel.Invitation", b => + { + b.HasOne("ServerCore.DataModel.Team") + .WithMany("Invitations") + .HasForeignKey("TeamID"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Piece", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.Prerequisites", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Prerequisite") + .WithMany() + .HasForeignKey("PrerequisiteID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.Puzzle", b => + { + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithMany() + .HasForeignKey("EventID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.PuzzleAuthors", b => + { + b.HasOne("ServerCore.DataModel.PuzzleUser", "Author") + .WithMany() + .HasForeignKey("AuthorID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.PuzzleStatePerTeam", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Team", "Team") + .WithMany() + .HasForeignKey("TeamID") + .OnDelete(DeleteBehavior.Restrict); + }); + + modelBuilder.Entity("ServerCore.DataModel.Response", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.Submission", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany("Submissions") + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Response", "Response") + .WithMany() + .HasForeignKey("ResponseID"); + + b.HasOne("ServerCore.DataModel.PuzzleUser", "Submitter") + .WithMany() + .HasForeignKey("SubmitterID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Team", "Team") + .WithMany() + .HasForeignKey("TeamID") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("ServerCore.DataModel.Team") + .WithMany("Submissions") + .HasForeignKey("TeamID1"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Team", b => + { + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithMany() + .HasForeignKey("EventID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.TeamApplication", b => + { + b.HasOne("ServerCore.DataModel.PuzzleUser", "Player") + .WithMany() + .HasForeignKey("PlayerID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Team", "Team") + .WithMany() + .HasForeignKey("TeamID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.TeamMembers", b => + { + b.HasOne("ServerCore.DataModel.Team", "Team") + .WithMany() + .HasForeignKey("Team.ID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.PuzzleUser", "Member") + .WithMany() + .HasForeignKey("User.ID") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Data/Migrations/20190328022943_AnonymousFeedback.cs b/Data/Migrations/20190328022943_AnonymousFeedback.cs new file mode 100644 index 00000000..4201babb --- /dev/null +++ b/Data/Migrations/20190328022943_AnonymousFeedback.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Data.Migrations +{ + public partial class AnonymousFeedback : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "IsAnonymous", + table: "Feedback", + nullable: false, + defaultValue: false); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "IsAnonymous", + table: "Feedback"); + } + } +} diff --git a/Data/Migrations/PuzzleServerContextModelSnapshot.cs b/Data/Migrations/PuzzleServerContextModelSnapshot.cs index fa9eae59..29c87381 100644 --- a/Data/Migrations/PuzzleServerContextModelSnapshot.cs +++ b/Data/Migrations/PuzzleServerContextModelSnapshot.cs @@ -15,7 +15,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.1.8-servicing-32085") + .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -350,6 +350,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Fun"); + b.Property("IsAnonymous"); + b.Property("PuzzleID"); b.Property("SubmissionTime"); diff --git a/ServerCore/Pages/Puzzles/Feedback.cshtml b/ServerCore/Pages/Puzzles/Feedback.cshtml index b9417904..09353269 100644 --- a/ServerCore/Pages/Puzzles/Feedback.cshtml +++ b/ServerCore/Pages/Puzzles/Feedback.cshtml @@ -26,6 +26,9 @@ @Html.DisplayNameFor(model => model.Feedbacks[0].Submitter) + + @Html.DisplayNameFor(model => model.Feedbacks[0].Submitter.Email) + @Html.DisplayNameFor(model => model.Feedbacks[0].SubmissionTime) @@ -43,9 +46,20 @@ @foreach (var item in Model.Feedbacks) { + @if (item.IsAnonymous) + { + Hidden + Hidden + } + else + { @Html.DisplayFor(modelItem => item.Submitter.Name) + + @Html.DisplayFor(modelItem => item.Submitter.Email) + + } @Html.DisplayFor(modelItem => item.SubmissionTime) diff --git a/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml b/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml index bbd4e967..6b5a005d 100644 --- a/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml +++ b/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml @@ -26,7 +26,7 @@
- +
+
diff --git a/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml.cs b/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml.cs index d450858c..8cb63f79 100644 --- a/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml.cs +++ b/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml.cs @@ -20,8 +20,6 @@ public SubmitFeedbackModel(PuzzleServerContext serverContext, UserManager /// Gets the submit feedback page for a puzzle @@ -36,12 +34,14 @@ public async Task OnGetAsync(int puzzleId) } // Seed existing feedback page - Feedback = await _context.Feedback.Where((f) => f.Puzzle.ID == puzzleId && f.Submitter == LoggedInUser).FirstOrDefaultAsync(); + Feedback = await _context.Feedback + .Where((f) => (f.Puzzle.ID == puzzleId && + f.Submitter == LoggedInUser)) + .FirstOrDefaultAsync(); + if (Feedback == null) { Feedback = new Feedback(); - Feedback.Fun = 5; - Feedback.Difficulty = 5; } return Page(); @@ -59,16 +59,19 @@ public async Task OnPostAsync(int puzzleId) return Page(); } - if (Feedback.Fun < MinRating) - Feedback.Fun = MinRating; - if (Feedback.Fun > MaxRating) - Feedback.Fun = MaxRating; - if (Feedback.Difficulty < MinRating) - Feedback.Difficulty = MinRating; - if (Feedback.Difficulty > MaxRating) - Feedback.Difficulty = MaxRating; + Feedback.Fun = Math.Clamp(Feedback.Fun, + Feedback.MinRating, + Feedback.MaxRating); + + Feedback.Difficulty = Math.Clamp(Feedback.Difficulty, + Feedback.MinRating, + Feedback.MaxRating); + + Feedback editableFeedback = await _context.Feedback + .Where((f) => (f.Puzzle.ID == puzzleId && + f.Submitter == LoggedInUser)) + .FirstOrDefaultAsync(); - Feedback editableFeedback = await _context.Feedback.Where((f) => f.Puzzle.ID == puzzleId && f.Submitter == LoggedInUser).FirstOrDefaultAsync(); if (editableFeedback == null) { Feedback.SubmissionTime = DateTime.UtcNow; @@ -84,14 +87,19 @@ public async Task OnPostAsync(int puzzleId) { editableFeedback.SubmissionTime = DateTime.UtcNow; editableFeedback.Submitter = LoggedInUser; + editableFeedback.IsAnonymous = Feedback.IsAnonymous; editableFeedback.Difficulty = Feedback.Difficulty; editableFeedback.Fun = Feedback.Fun; editableFeedback.WrittenFeedback = Feedback.WrittenFeedback; - editableFeedback.Puzzle = await _context.Puzzles.Where(m => m.ID == puzzleId).FirstOrDefaultAsync(); + editableFeedback.Puzzle = await _context.Puzzles + .Where(m => m.ID == puzzleId) + .FirstOrDefaultAsync(); + if (editableFeedback.Puzzle == null) { return NotFound(); } + _context.Attach(editableFeedback).State = EntityState.Modified; } From b7f404c75ef13de141f17cd9680957b924c22c3f Mon Sep 17 00:00:00 2001 From: Lambert Wang Date: Wed, 27 Mar 2019 19:50:18 -0700 Subject: [PATCH 2/2] Back out anonymization --- Data/DataModel/Feedback.cs | 8 +- ...190328022943_AnonymousFeedback.Designer.cs | 1001 ----------------- .../20190328022943_AnonymousFeedback.cs | 23 - .../PuzzleServerContextModelSnapshot.cs | 4 +- ServerCore/Pages/Puzzles/Feedback.cshtml | 8 - .../Pages/Puzzles/SubmitFeedback.cshtml | 15 - .../Pages/Puzzles/SubmitFeedback.cshtml.cs | 1 - 7 files changed, 2 insertions(+), 1058 deletions(-) delete mode 100644 Data/Migrations/20190328022943_AnonymousFeedback.Designer.cs delete mode 100644 Data/Migrations/20190328022943_AnonymousFeedback.cs diff --git a/Data/DataModel/Feedback.cs b/Data/DataModel/Feedback.cs index 3cad0035..7500296a 100644 --- a/Data/DataModel/Feedback.cs +++ b/Data/DataModel/Feedback.cs @@ -16,7 +16,7 @@ public Feedback() } public const int MinRating = 1; - public const int AvgRating = 1; + public const int AvgRating = 5; public const int MaxRating = 10; [DatabaseGenerated(DatabaseGeneratedOption.Identity)] @@ -36,12 +36,6 @@ public Feedback() /// public DateTime SubmissionTime { get; set; } - /// - /// True if the puzzle author should not be able to see details about - /// the user. - /// - public bool IsAnonymous { get; set; } - /// /// The feedback text submitted by the user. /// diff --git a/Data/Migrations/20190328022943_AnonymousFeedback.Designer.cs b/Data/Migrations/20190328022943_AnonymousFeedback.Designer.cs deleted file mode 100644 index 384774ac..00000000 --- a/Data/Migrations/20190328022943_AnonymousFeedback.Designer.cs +++ /dev/null @@ -1,1001 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using ServerCore.DataModel; - -namespace Data.Migrations -{ - [DbContext(typeof(PuzzleServerContext))] - [Migration("20190328022943_AnonymousFeedback")] - partial class AnonymousFeedback - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken(); - - b.Property("Name") - .HasMaxLength(256); - - b.Property("NormalizedName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasName("RoleNameIndex") - .HasFilter("[NormalizedName] IS NOT NULL"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("RoleId") - .IsRequired(); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("AccessFailedCount"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken(); - - b.Property("Email") - .HasMaxLength(256); - - b.Property("EmailConfirmed"); - - b.Property("LockoutEnabled"); - - b.Property("LockoutEnd"); - - b.Property("NormalizedEmail") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .HasMaxLength(256); - - b.Property("PasswordHash"); - - b.Property("PhoneNumber"); - - b.Property("PhoneNumberConfirmed"); - - b.Property("SecurityStamp"); - - b.Property("TwoFactorEnabled"); - - b.Property("UserName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasName("UserNameIndex") - .HasFilter("[NormalizedUserName] IS NOT NULL"); - - b.ToTable("AspNetUsers"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("ClaimType"); - - b.Property("ClaimValue"); - - b.Property("UserId") - .IsRequired(); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasMaxLength(128); - - b.Property("ProviderDisplayName"); - - b.Property("UserId") - .IsRequired(); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId"); - - b.Property("RoleId"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId"); - - b.Property("LoginProvider") - .HasMaxLength(128); - - b.Property("Name") - .HasMaxLength(128); - - b.Property("Value"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Annotation", b => - { - b.Property("PuzzleID"); - - b.Property("TeamID"); - - b.Property("Key"); - - b.Property("Contents") - .IsRequired() - .HasMaxLength(255); - - b.Property("Timestamp"); - - b.Property("Version"); - - b.HasKey("PuzzleID", "TeamID", "Key"); - - b.HasIndex("TeamID"); - - b.ToTable("Annotations"); - }); - - modelBuilder.Entity("ServerCore.DataModel.ContentFile", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("EventID"); - - b.Property("FileType"); - - b.Property("PuzzleID") - .IsRequired(); - - b.Property("ShortName") - .IsRequired(); - - b.Property("UrlString") - .IsRequired(); - - b.HasKey("ID"); - - b.HasIndex("PuzzleID"); - - b.HasIndex("EventID", "ShortName") - .IsUnique(); - - b.ToTable("ContentFiles"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Event", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("AllowFeedback"); - - b.Property("AnswerSubmissionEnd"); - - b.Property("AnswersAvailableBegin"); - - b.Property("ContactEmail"); - - b.Property("EventBegin"); - - b.Property("HomePartial"); - - b.Property("IsInternEvent"); - - b.Property("LockoutDurationMultiplier"); - - b.Property("LockoutIncorrectGuessLimit"); - - b.Property("LockoutIncorrectGuessPeriod"); - - b.Property("MaxExternalsPerTeam"); - - b.Property("MaxNumberOfTeams"); - - b.Property("MaxSubmissionCount"); - - b.Property("MaxTeamSize"); - - b.Property("Name") - .IsRequired(); - - b.Property("ShowFastestSolves"); - - b.Property("StandingsAvailableBegin"); - - b.Property("StandingsOverride"); - - b.Property("TeamDeleteEnd"); - - b.Property("TeamMembershipChangeEnd"); - - b.Property("TeamMiscDataChangeEnd"); - - b.Property("TeamNameChangeEnd"); - - b.Property("TeamRegistrationBegin"); - - b.Property("TeamRegistrationEnd"); - - b.Property("UrlString"); - - b.HasKey("ID"); - - b.HasIndex("UrlString") - .IsUnique() - .HasFilter("[UrlString] IS NOT NULL"); - - b.ToTable("Events"); - }); - - modelBuilder.Entity("ServerCore.DataModel.EventAdmins", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("AdminID"); - - b.Property("EventID"); - - b.HasKey("ID"); - - b.HasIndex("AdminID"); - - b.HasIndex("EventID"); - - b.ToTable("EventAdmins"); - }); - - modelBuilder.Entity("ServerCore.DataModel.EventAuthors", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("AuthorID"); - - b.Property("EventID"); - - b.HasKey("ID"); - - b.HasIndex("AuthorID"); - - b.HasIndex("EventID"); - - b.ToTable("EventAuthors"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Feedback", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Difficulty"); - - b.Property("Fun"); - - b.Property("IsAnonymous"); - - b.Property("PuzzleID"); - - b.Property("SubmissionTime"); - - b.Property("SubmitterID"); - - b.Property("WrittenFeedback"); - - b.HasKey("ID"); - - b.HasIndex("PuzzleID"); - - b.HasIndex("SubmitterID"); - - b.ToTable("Feedback"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Hint", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Content") - .IsRequired(); - - b.Property("Cost"); - - b.Property("Description") - .IsRequired(); - - b.Property("DisplayOrder"); - - b.Property("PuzzleID"); - - b.HasKey("Id"); - - b.HasIndex("PuzzleID"); - - b.ToTable("Hints"); - }); - - modelBuilder.Entity("ServerCore.DataModel.HintStatePerTeam", b => - { - b.Property("TeamID"); - - b.Property("HintID"); - - b.Property("UnlockTime"); - - b.HasKey("TeamID", "HintID"); - - b.HasIndex("HintID"); - - b.ToTable("HintStatePerTeam"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Invitation", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("EmailAddress"); - - b.Property("Expiration"); - - b.Property("InvitationCode"); - - b.Property("InvitationType"); - - b.Property("TeamID"); - - b.HasKey("ID"); - - b.HasIndex("TeamID"); - - b.ToTable("Invitations"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Piece", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Contents") - .IsRequired(); - - b.Property("ProgressLevel"); - - b.Property("PuzzleID"); - - b.HasKey("ID"); - - b.HasIndex("PuzzleID"); - - b.ToTable("Pieces"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Prerequisites", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("PrerequisiteID"); - - b.Property("PuzzleID"); - - b.HasKey("ID"); - - b.HasIndex("PrerequisiteID"); - - b.HasIndex("PuzzleID"); - - b.ToTable("Prerequisites"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Puzzle", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CustomURL"); - - b.Property("Description"); - - b.Property("EventID"); - - b.Property("Group"); - - b.Property("HintCoinsForSolve"); - - b.Property("HintsAreCumulative"); - - b.Property("IsCheatCode"); - - b.Property("IsFinalPuzzle"); - - b.Property("IsGloballyVisiblePrerequisite"); - - b.Property("IsMetaPuzzle"); - - b.Property("IsPuzzle"); - - b.Property("MaxAnnotationKey"); - - b.Property("MinPrerequisiteCount"); - - b.Property("MinutesOfEventLockout"); - - b.Property("MinutesToAutomaticallySolve"); - - b.Property("Name") - .IsRequired(); - - b.Property("OrderInGroup"); - - b.Property("SolveValue"); - - b.Property("SupportEmailAlias"); - - b.Property("Token"); - - b.HasKey("ID"); - - b.HasIndex("EventID"); - - b.ToTable("Puzzles"); - }); - - modelBuilder.Entity("ServerCore.DataModel.PuzzleAuthors", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("AuthorID"); - - b.Property("PuzzleID"); - - b.HasKey("ID"); - - b.HasIndex("AuthorID"); - - b.HasIndex("PuzzleID"); - - b.ToTable("PuzzleAuthors"); - }); - - modelBuilder.Entity("ServerCore.DataModel.PuzzleStatePerTeam", b => - { - b.Property("PuzzleID"); - - b.Property("TeamID"); - - b.Property("IsEmailOnlyMode"); - - b.Property("LockoutExpiryTime"); - - b.Property("Notes"); - - b.Property("Printed"); - - b.Property("SolvedTime"); - - b.Property("UnlockedTime"); - - b.Property("WrongSubmissionCountBuffer"); - - b.HasKey("PuzzleID", "TeamID"); - - b.HasIndex("TeamID"); - - b.ToTable("PuzzleStatePerTeam"); - }); - - modelBuilder.Entity("ServerCore.DataModel.PuzzleUser", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Email"); - - b.Property("EmployeeAlias"); - - b.Property("IdentityUserId") - .IsRequired(); - - b.Property("IsGlobalAdmin"); - - b.Property("Name"); - - b.Property("PhoneNumber"); - - b.Property("TShirtSize"); - - b.Property("VisibleToOthers"); - - b.HasKey("ID"); - - b.ToTable("PuzzleUsers"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Response", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("IsSolution"); - - b.Property("Note"); - - b.Property("PuzzleID"); - - b.Property("ResponseText") - .IsRequired(); - - b.Property("SubmittedText") - .IsRequired(); - - b.HasKey("ID"); - - b.HasIndex("PuzzleID"); - - b.ToTable("Responses"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Submission", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("PuzzleID"); - - b.Property("ResponseID"); - - b.Property("SubmissionText") - .IsRequired(); - - b.Property("SubmitterID"); - - b.Property("TeamID"); - - b.Property("TeamID1"); - - b.Property("TimeSubmitted"); - - b.HasKey("ID"); - - b.HasIndex("PuzzleID"); - - b.HasIndex("ResponseID"); - - b.HasIndex("SubmitterID"); - - b.HasIndex("TeamID"); - - b.HasIndex("TeamID1"); - - b.ToTable("Submissions"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Team", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("CustomRoom"); - - b.Property("EventID"); - - b.Property("HintCoinCount"); - - b.Property("HintCoinsUsed"); - - b.Property("IsLookingForTeammates"); - - b.Property("Name"); - - b.Property("PrimaryContactEmail"); - - b.Property("PrimaryPhoneNumber"); - - b.Property("RoomID"); - - b.Property("SecondaryPhoneNumber"); - - b.HasKey("ID"); - - b.HasIndex("EventID"); - - b.ToTable("Teams"); - }); - - modelBuilder.Entity("ServerCore.DataModel.TeamApplication", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("PlayerID"); - - b.Property("TeamID"); - - b.HasKey("ID"); - - b.HasIndex("PlayerID"); - - b.HasIndex("TeamID"); - - b.ToTable("TeamApplications"); - }); - - modelBuilder.Entity("ServerCore.DataModel.TeamMembers", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Team.ID") - .IsRequired(); - - b.Property("User.ID") - .IsRequired(); - - b.HasKey("ID"); - - b.HasIndex("Team.ID"); - - b.HasIndex("User.ID"); - - b.ToTable("TeamMembers"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.Annotation", b => - { - b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") - .WithMany() - .HasForeignKey("PuzzleID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.Team", "Team") - .WithMany() - .HasForeignKey("TeamID") - .OnDelete(DeleteBehavior.Restrict); - }); - - modelBuilder.Entity("ServerCore.DataModel.ContentFile", b => - { - b.HasOne("ServerCore.DataModel.Event", "Event") - .WithMany() - .HasForeignKey("EventID") - .OnDelete(DeleteBehavior.Restrict); - - b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") - .WithMany("Contents") - .HasForeignKey("PuzzleID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.EventAdmins", b => - { - b.HasOne("ServerCore.DataModel.PuzzleUser", "Admin") - .WithMany() - .HasForeignKey("AdminID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.Event", "Event") - .WithMany() - .HasForeignKey("EventID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.EventAuthors", b => - { - b.HasOne("ServerCore.DataModel.PuzzleUser", "Author") - .WithMany() - .HasForeignKey("AuthorID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.Event", "Event") - .WithMany() - .HasForeignKey("EventID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.Feedback", b => - { - b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") - .WithMany() - .HasForeignKey("PuzzleID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.PuzzleUser", "Submitter") - .WithMany() - .HasForeignKey("SubmitterID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.Hint", b => - { - b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") - .WithMany() - .HasForeignKey("PuzzleID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.HintStatePerTeam", b => - { - b.HasOne("ServerCore.DataModel.Hint", "Hint") - .WithMany() - .HasForeignKey("HintID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.Team", "Team") - .WithMany() - .HasForeignKey("TeamID") - .OnDelete(DeleteBehavior.Restrict); - }); - - modelBuilder.Entity("ServerCore.DataModel.Invitation", b => - { - b.HasOne("ServerCore.DataModel.Team") - .WithMany("Invitations") - .HasForeignKey("TeamID"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Piece", b => - { - b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") - .WithMany() - .HasForeignKey("PuzzleID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.Prerequisites", b => - { - b.HasOne("ServerCore.DataModel.Puzzle", "Prerequisite") - .WithMany() - .HasForeignKey("PrerequisiteID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") - .WithMany() - .HasForeignKey("PuzzleID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.Puzzle", b => - { - b.HasOne("ServerCore.DataModel.Event", "Event") - .WithMany() - .HasForeignKey("EventID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.PuzzleAuthors", b => - { - b.HasOne("ServerCore.DataModel.PuzzleUser", "Author") - .WithMany() - .HasForeignKey("AuthorID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") - .WithMany() - .HasForeignKey("PuzzleID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.PuzzleStatePerTeam", b => - { - b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") - .WithMany() - .HasForeignKey("PuzzleID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.Team", "Team") - .WithMany() - .HasForeignKey("TeamID") - .OnDelete(DeleteBehavior.Restrict); - }); - - modelBuilder.Entity("ServerCore.DataModel.Response", b => - { - b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") - .WithMany() - .HasForeignKey("PuzzleID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.Submission", b => - { - b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") - .WithMany("Submissions") - .HasForeignKey("PuzzleID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.Response", "Response") - .WithMany() - .HasForeignKey("ResponseID"); - - b.HasOne("ServerCore.DataModel.PuzzleUser", "Submitter") - .WithMany() - .HasForeignKey("SubmitterID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.Team", "Team") - .WithMany() - .HasForeignKey("TeamID") - .OnDelete(DeleteBehavior.Restrict); - - b.HasOne("ServerCore.DataModel.Team") - .WithMany("Submissions") - .HasForeignKey("TeamID1"); - }); - - modelBuilder.Entity("ServerCore.DataModel.Team", b => - { - b.HasOne("ServerCore.DataModel.Event", "Event") - .WithMany() - .HasForeignKey("EventID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.TeamApplication", b => - { - b.HasOne("ServerCore.DataModel.PuzzleUser", "Player") - .WithMany() - .HasForeignKey("PlayerID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.Team", "Team") - .WithMany() - .HasForeignKey("TeamID") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("ServerCore.DataModel.TeamMembers", b => - { - b.HasOne("ServerCore.DataModel.Team", "Team") - .WithMany() - .HasForeignKey("Team.ID") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("ServerCore.DataModel.PuzzleUser", "Member") - .WithMany() - .HasForeignKey("User.ID") - .OnDelete(DeleteBehavior.Cascade); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Data/Migrations/20190328022943_AnonymousFeedback.cs b/Data/Migrations/20190328022943_AnonymousFeedback.cs deleted file mode 100644 index 4201babb..00000000 --- a/Data/Migrations/20190328022943_AnonymousFeedback.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace Data.Migrations -{ - public partial class AnonymousFeedback : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "IsAnonymous", - table: "Feedback", - nullable: false, - defaultValue: false); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "IsAnonymous", - table: "Feedback"); - } - } -} diff --git a/Data/Migrations/PuzzleServerContextModelSnapshot.cs b/Data/Migrations/PuzzleServerContextModelSnapshot.cs index 29c87381..fa9eae59 100644 --- a/Data/Migrations/PuzzleServerContextModelSnapshot.cs +++ b/Data/Migrations/PuzzleServerContextModelSnapshot.cs @@ -15,7 +15,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") + .HasAnnotation("ProductVersion", "2.1.8-servicing-32085") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -350,8 +350,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Fun"); - b.Property("IsAnonymous"); - b.Property("PuzzleID"); b.Property("SubmissionTime"); diff --git a/ServerCore/Pages/Puzzles/Feedback.cshtml b/ServerCore/Pages/Puzzles/Feedback.cshtml index 09353269..c0dba311 100644 --- a/ServerCore/Pages/Puzzles/Feedback.cshtml +++ b/ServerCore/Pages/Puzzles/Feedback.cshtml @@ -46,20 +46,12 @@ @foreach (var item in Model.Feedbacks) { - @if (item.IsAnonymous) - { - Hidden - Hidden - } - else - { @Html.DisplayFor(modelItem => item.Submitter.Name) @Html.DisplayFor(modelItem => item.Submitter.Email) - } @Html.DisplayFor(modelItem => item.SubmissionTime) diff --git a/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml b/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml index 6b5a005d..fedde5c2 100644 --- a/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml +++ b/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml @@ -54,21 +54,6 @@ } -
diff --git a/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml.cs b/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml.cs index 8cb63f79..3174375f 100644 --- a/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml.cs +++ b/ServerCore/Pages/Puzzles/SubmitFeedback.cshtml.cs @@ -87,7 +87,6 @@ public async Task OnPostAsync(int puzzleId) { editableFeedback.SubmissionTime = DateTime.UtcNow; editableFeedback.Submitter = LoggedInUser; - editableFeedback.IsAnonymous = Feedback.IsAnonymous; editableFeedback.Difficulty = Feedback.Difficulty; editableFeedback.Fun = Feedback.Fun; editableFeedback.WrittenFeedback = Feedback.WrittenFeedback;