diff --git a/.github/workflows/pr_ci.yml b/.github/workflows/pr_ci.yml
index 8ce5dd2d6..af673bf5f 100644
--- a/.github/workflows/pr_ci.yml
+++ b/.github/workflows/pr_ci.yml
@@ -3,6 +3,7 @@ on:
pull_request:
branches:
- master
+ - feature/candev
push:
paths-ignore:
- '**/*.md'
diff --git a/StatCan.OrchardCore.sln b/StatCan.OrchardCore.sln
index 4081461c1..28f534da3 100644
--- a/StatCan.OrchardCore.sln
+++ b/StatCan.OrchardCore.sln
@@ -94,7 +94,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Apps", "Apps", "{E8DD6EC8-A
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StatCan.OrchardCore.Scheduling", "src\Apps\StatCan.OrchardCore.Scheduling\StatCan.OrchardCore.Scheduling.csproj", "{56F32388-650F-433C-919F-8C265F99411D}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StatCan.OrchardCore.Configuration", "src\Modules\StatCan.OrchardCore.Configuration\StatCan.OrchardCore.Configuration.csproj", "{DEA6A849-3230-43DE-A9A0-3C22DA8E316E}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StatCan.OrchardCore.Configuration", "src\Modules\StatCan.OrchardCore.Configuration\StatCan.OrchardCore.Configuration.csproj", "{DEA6A849-3230-43DE-A9A0-3C22DA8E316E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StatCan.OrchardCore.Candev", "src\Apps\StatCan.OrchardCore.Candev\StatCan.OrchardCore.Candev.csproj", "{2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -466,6 +468,18 @@ Global
{DEA6A849-3230-43DE-A9A0-3C22DA8E316E}.Release|x64.Build.0 = Release|Any CPU
{DEA6A849-3230-43DE-A9A0-3C22DA8E316E}.Release|x86.ActiveCfg = Release|Any CPU
{DEA6A849-3230-43DE-A9A0-3C22DA8E316E}.Release|x86.Build.0 = Release|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Debug|x64.Build.0 = Debug|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Debug|x86.Build.0 = Debug|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Release|x64.ActiveCfg = Release|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Release|x64.Build.0 = Release|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Release|x86.ActiveCfg = Release|Any CPU
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -506,6 +520,7 @@ Global
{E8DD6EC8-AA09-440F-937A-1901293389E1} = {8EA5EBF0-41C6-11EA-890A-ED68CBADDC1F}
{56F32388-650F-433C-919F-8C265F99411D} = {E8DD6EC8-AA09-440F-937A-1901293389E1}
{DEA6A849-3230-43DE-A9A0-3C22DA8E316E} = {5E638520-41E8-11EA-885A-BDD3BB7B4F92}
+ {2CFB2F3C-61E5-45AE-906A-3DF746EBE1C6} = {E8DD6EC8-AA09-440F-937A-1901293389E1}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8FF197F3-C3E2-4D83-80AC-D59BE36DD4AF}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/AdminMenu.cs b/src/Apps/StatCan.OrchardCore.Candev/AdminMenu.cs
new file mode 100644
index 000000000..9d4c92315
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/AdminMenu.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Localization;
+using OrchardCore.ContentManagement;
+using OrchardCore.ContentManagement.Metadata;
+using OrchardCore.Navigation;
+using YesSql;
+
+namespace StatCan.OrchardCore.Candev
+{
+ public class AdminMenu : INavigationProvider
+ {
+ private readonly IContentManager _contentManager;
+ private readonly IContentDefinitionManager _contentDefinitionManager;
+ private readonly ISession _session;
+
+ public AdminMenu(IStringLocalizer localizer, ISession session, IContentManager contentManager, IContentDefinitionManager contentDefinitionManager)
+ {
+ _contentDefinitionManager = contentDefinitionManager;
+ _contentManager = contentManager;
+ _session = session;
+ T = localizer;
+ }
+
+ public IStringLocalizer T { get; set; }
+
+ public Task BuildNavigationAsync(string name, NavigationBuilder builder)
+ {
+ // We want to add our menus to the "admin" menu only.
+ if (!string.Equals(name, "admin", StringComparison.OrdinalIgnoreCase))
+ {
+ return Task.CompletedTask;
+ }
+
+ builder
+ .Add(T["Admin Panel"], "-100", rootView =>
+ {
+ rootView.Action("Index", "Admin", new { area = "StatCan.OrchardCore.Candev" });
+ });
+
+ return Task.CompletedTask;
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Commands/CandevCommands.cs b/src/Apps/StatCan.OrchardCore.Candev/Commands/CandevCommands.cs
new file mode 100644
index 000000000..14055a198
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Commands/CandevCommands.cs
@@ -0,0 +1,112 @@
+using Microsoft.Extensions.Localization;
+using OrchardCore.Environment.Commands;
+using StatCan.OrchardCore.Candev.Services;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace StatCan.OrchardCore.Candev.Commands
+{
+ public class CandevCommands : DefaultCommandHandler
+ {
+ private readonly ICandevService _candevService;
+
+ public CandevCommands(
+ ICandevService candevService,
+ IStringLocalizer localizer) : base(localizer)
+ {
+ _candevService = candevService;
+ }
+
+ [OrchardSwitch]
+ public string TeamName { get; set; }
+
+ [OrchardSwitch]
+ public string TeamTopics { get; set; }
+
+ [OrchardSwitch]
+ public string ChallengeTitle { get; set; }
+
+ [OrchardSwitch]
+ public string TopicName { get; set; }
+
+ [OrchardSwitch]
+ public string TopicChallenge { get; set; }
+
+ [OrchardSwitch]
+ public string TeamId { get; set; }
+
+ [OrchardSwitch]
+ public string UserName { get; set; }
+
+ [CommandName("createTeam")]
+ [CommandHelp("createTeam /TeamName: /TeamTopics:{topicId,topicId,...}\r\n\t" + "Creates a new Team")]
+ [OrchardSwitches("TeamName,TeamTopics")]
+ public async Task CreateTeamAsync()
+ {
+ var teamTopics = (TeamTopics ?? "").Split(',', StringSplitOptions.RemoveEmptyEntries).ToArray();
+
+ var teamId = await _candevService.CreateTeam(TeamName, teamTopics);
+
+ if (teamId != null)
+ {
+ Context.Output.WriteLine(S["Team created successfully"]);
+ return teamId;
+ }
+
+ Context.Output.WriteLine(S["Error during CreateTeam Command"]);
+ return null;
+ }
+
+ [CommandName("createChallenge")]
+ [CommandHelp("createChallenge /ChallengeTitle:\r\n\t" + "Creates a new Challenge")]
+ [OrchardSwitches("ChallengeTitle")]
+ public async Task CreateChallengeAsync()
+ {
+ var challengeId = await _candevService.CreateChallenge(ChallengeTitle);
+
+ if (challengeId != null)
+ {
+ Context.Output.WriteLine(S["Challenge created successfully"]);
+ return challengeId;
+ }
+
+ Context.Output.WriteLine(S["Error during CreateChallenge Command"]);
+ return null;
+ }
+
+ [CommandName("createTopic")]
+ [CommandHelp("createTopic /TopicName: /TopicChallenge:\r\n\t" + "Creates a new Topic")]
+ [OrchardSwitches("TopicName,TopicChallenge")]
+ public async Task CreateTopicAsync()
+ {
+ var topicId = await _candevService.CreateTopic(TopicName, TopicChallenge);
+
+ if (topicId != null)
+ {
+ Context.Output.WriteLine(S["Topic created successfully"]);
+ return topicId;
+ }
+
+ Context.Output.WriteLine(S["Error during CreateTopic Command"]);
+ return null;
+ }
+
+ [CommandName("joinTeam")]
+ [CommandHelp("joinTeam /TeamId: /UserName:\r\n\t" + "Makes a hacker join a Team")]
+ [OrchardSwitches("TeamId,UserName")]
+ public async Task JoinTeamAsync()
+ {
+ var team = await _candevService.JoinTeam(TeamId, UserName);
+
+ if (team != null)
+ {
+ Context.Output.WriteLine(S["Topic created successfully"]);
+ }
+
+ Context.Output.WriteLine(S["Error during JoinTeam Command"]);
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Controllers/AdminController.cs b/src/Apps/StatCan.OrchardCore.Candev/Controllers/AdminController.cs
new file mode 100644
index 000000000..37c348a82
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Controllers/AdminController.cs
@@ -0,0 +1,138 @@
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using OrchardCore.ContentManagement;
+using OrchardCore.DisplayManagement;
+using OrchardCore.DisplayManagement.ModelBinding;
+using YesSql;
+using Microsoft.AspNetCore.Mvc.Localization;
+using OrchardCore.Settings;
+using OrchardCore.Entities;
+using StatCan.OrchardCore.Candev.Services;
+using OrchardCore.DisplayManagement.Notify;
+
+namespace StatCan.OrchardCore.Candev.Controllers
+{
+ public class AdminController : Controller, IUpdateModel
+ {
+ private readonly ISiteService _siteService;
+ private readonly ISession _session;
+ private readonly ICandevService _candevService;
+ private readonly INotifier _notifier;
+
+ public dynamic New { get; set; }
+
+ public AdminController(ISiteService siteService, ISession session, IShapeFactory shapeFactory,
+ ICandevService hackathonService,
+ IHtmlLocalizer localizer,
+ INotifier notifier)
+ {
+ _siteService = siteService;
+ _session = session;
+ New = shapeFactory;
+ _candevService = hackathonService;
+ H = localizer;
+ _notifier = notifier;
+ }
+
+ public IHtmlLocalizer H {get;}
+
+ public async Task Index()
+ {
+ if (!HttpContext.User.IsInRole("Administrator"))
+ {
+ return Unauthorized();
+ }
+
+ var viewModel = await New.ViewModel();
+ return View(viewModel);
+ }
+
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task AssignCases(string returnUrl)
+ {
+ if (!HttpContext.User.IsInRole("Administrator"))
+ {
+ return Unauthorized();
+ }
+
+ var site = await _siteService.GetSiteSettingsAsync();
+ var hackathonCustomSettings = site.As("HackathonCustomSettings");
+ if (hackathonCustomSettings.Content["TeamCustomSettings"]["TeamEditable"].Value == true)
+ {
+ return Unauthorized();
+ }
+
+ await _candevService.AssignCases();
+
+ await _session.SaveChangesAsync();
+ _notifier.Success(H["Cases have been assigned."]);
+ return RedirectToAction("Index");
+ }
+
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task MatchTeams(string returnUrl)
+ {
+ if (!HttpContext.User.IsInRole("Administrator"))
+ {
+ return Unauthorized();
+ }
+
+ var site = await _siteService.GetSiteSettingsAsync();
+ var hackathonCustomSettings = site.As("HackathonCustomSettings");
+ if (hackathonCustomSettings.Content["TeamCustomSettings"]["TeamEditable"].Value == true)
+ {
+ return Unauthorized();
+ }
+
+ await _candevService.MatchTeams();
+
+ await _session.SaveChangesAsync();
+ _notifier.Success(H["Teams have been matched."]);
+ return RedirectToAction("Index");
+ }
+
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task SelectNHackers(int n)
+ {
+ if (!HttpContext.User.IsInRole("Administrator"))
+ {
+ return Unauthorized();
+ }
+
+ await _candevService.SelectNHackers(n);
+ _notifier.Success(H["Participants have been selected."]);
+ return RedirectToAction("Index");
+ }
+
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task CheckIn()
+ {
+ if (!HttpContext.User.IsInRole("Administrator"))
+ {
+ return Unauthorized();
+ }
+
+ await _candevService.CheckIn();
+ _notifier.Success(H["Checked-In participants have been selected."]);
+ return RedirectToAction("Index");
+ }
+
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task EliminateTeams()
+ {
+ if (!HttpContext.User.IsInRole("Administrator"))
+ {
+ return Unauthorized();
+ }
+
+ await _candevService.EliminateTeams();
+ _notifier.Success(H["Teams have been eliminated (In the running set to false)"]);
+ return RedirectToAction("Index");
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Controllers/CandevController.cs b/src/Apps/StatCan.OrchardCore.Candev/Controllers/CandevController.cs
new file mode 100644
index 000000000..aedb84bd2
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Controllers/CandevController.cs
@@ -0,0 +1,189 @@
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using OrchardCore.DisplayManagement.ModelBinding;
+using Microsoft.AspNetCore.Authorization;
+using StatCan.OrchardCore.Candev.Services;
+using OrchardCore.DisplayManagement.Notify;
+using Microsoft.AspNetCore.Mvc.Localization;
+using OrchardCore.Settings;
+using OrchardCore.ContentManagement;
+using OrchardCore.Entities;
+using OrchardCore.Modules;
+
+namespace StatCan.OrchardCore.Candev.Controllers
+{
+ [RequireFeatures(FeatureIds.Candev)]
+ [Authorize]
+ public class CandevController : Controller, IUpdateModel
+ {
+ private readonly ICandevService _candevService;
+ private readonly IAuthorizationService _authorizationService;
+ private readonly INotifier _notifier;
+ private readonly YesSql.ISession _session;
+ private readonly ISiteService _siteService;
+
+ public CandevController(ICandevService hackathonService,
+ IHtmlLocalizer htmlLocalizer,
+ IAuthorizationService authorizationService,
+ INotifier notifier,
+ YesSql.ISession session,
+ ISiteService siteService
+ ){
+ _candevService = hackathonService;
+ H = htmlLocalizer;
+ _authorizationService = authorizationService;
+ _notifier = notifier;
+ _session = session;
+ _siteService = siteService;
+ }
+
+ public IHtmlLocalizer H {get;}
+
+
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task CreateTeam(string returnUrl)
+ {
+ if (!HttpContext.User.IsInRole("Hacker"))
+ {
+ return NotFound();
+ }
+
+ var site = await _siteService.GetSiteSettingsAsync();
+ var hackathonCustomSettings = site.As("HackathonCustomSettings");
+
+ if (hackathonCustomSettings.Content["TeamCustomSettings"]["TeamEditable"].Value == false)
+ {
+ _notifier.Error(H["You cannot create, join or leave teams at this time"]);
+ return Unauthorized();
+ }
+
+ await _candevService.CreateTeam(ModelState);
+ if (ModelState.IsValid)
+ {
+ _notifier.Success(H["Successfully created team"]);
+ }
+
+ await _session.SaveChangesAsync();
+ return LocalRedirect(returnUrl);
+ }
+
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task JoinTeam(string teamContentItemId, string returnUrl)
+ {
+ if (!HttpContext.User.IsInRole("Hacker"))
+ {
+ return NotFound();
+ }
+
+ if (string.IsNullOrEmpty(teamContentItemId))
+ {
+ _notifier.Error(H["Enter a team ID"]);
+ return LocalRedirect(returnUrl);
+ }
+
+ var site = await _siteService.GetSiteSettingsAsync();
+ var hackathonCustomSettings = site.As("HackathonCustomSettings");
+
+ if (hackathonCustomSettings.Content["TeamCustomSettings"]["TeamEditable"].Value == false)
+ {
+ _notifier.Error(H["You cannot create, join or leave teams at this time"]);
+ return Unauthorized();
+ }
+
+ await _candevService.JoinTeam(teamContentItemId, ModelState);
+ if (ModelState.IsValid)
+ {
+ _notifier.Success(H["Successfully joined team"]);
+ } else {
+ _notifier.Error(H["Team could not be found"]);
+ }
+
+ await _session.SaveChangesAsync();
+ return LocalRedirect(returnUrl);
+ }
+
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task LeaveTeam(string returnUrl)
+ {
+ if (!HttpContext.User.IsInRole("Hacker"))
+ {
+ return NotFound();
+ }
+
+ var site = await _siteService.GetSiteSettingsAsync();
+ var hackathonCustomSettings = site.As("HackathonCustomSettings");
+
+ if (hackathonCustomSettings.Content["TeamCustomSettings"]["TeamEditable"].Value == false)
+ {
+ _notifier.Error(H["You cannot create, join or leave teams at this time"]);
+ return Unauthorized();
+ }
+
+ await _candevService.LeaveTeam(ModelState);
+ if (ModelState.IsValid)
+ {
+ _notifier.Success(H["Successfully left team"]);
+ }
+
+ await _session.SaveChangesAsync();
+ return LocalRedirect(returnUrl);
+ }
+
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task RemoveTeamMember(string hackerContentItemId, string returnUrl)
+ {
+ if (!HttpContext.User.IsInRole("Hacker"))
+ {
+ return NotFound();
+ }
+
+ var site = await _siteService.GetSiteSettingsAsync();
+ var hackathonCustomSettings = site.As("HackathonCustomSettings");
+ if (hackathonCustomSettings.Content["TeamCustomSettings"]["TeamEditable"].Value == false)
+ {
+ _notifier.Error(H["You cannot create, join or leave teams at this time"]);
+ return Unauthorized();
+ }
+
+ await _candevService.RemoveTeamMember(hackerContentItemId, ModelState);
+ if (ModelState.IsValid)
+ {
+ _notifier.Success(H["Member successfully removed from the team"]);
+ }
+
+ await _session.SaveChangesAsync();
+ return LocalRedirect(returnUrl);
+ }
+
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public async Task SaveTeam(string teamName, string teamDescription, string challenge, string returnUrl)
+ {
+ if (!HttpContext.User.IsInRole("Hacker"))
+ {
+ return NotFound();
+ }
+
+ var site = await _siteService.GetSiteSettingsAsync();
+ var hackathonCustomSettings = site.As("HackathonCustomSettings");
+ if (hackathonCustomSettings.Content["TeamCustomSettings"]["TeamEditable"].Value == false)
+ {
+ _notifier.Error(H["You cannot create, join or leave teams at this time"]);
+ return Unauthorized();
+ }
+
+ await _candevService.SaveTeam(teamName, teamDescription, challenge, ModelState);
+ if (ModelState.IsValid)
+ {
+ _notifier.Success(H["Team info successfully updated"]);
+ }
+
+ await _session.SaveChangesAsync();
+ return LocalRedirect(returnUrl);
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Drivers/CandevDriver.cs b/src/Apps/StatCan.OrchardCore.Candev/Drivers/CandevDriver.cs
new file mode 100644
index 000000000..f68db1fe7
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Drivers/CandevDriver.cs
@@ -0,0 +1,23 @@
+using OrchardCore.ContentManagement;
+using OrchardCore.ContentManagement.Display.ContentDisplay;
+using OrchardCore.ContentManagement.Display.ViewModels;
+using OrchardCore.DisplayManagement.ModelBinding;
+using OrchardCore.DisplayManagement.Views;
+
+namespace StatCan.OrchardCore.Candev
+{
+ public class CandevDriver : ContentDisplayDriver
+ {
+ public override IDisplayResult Display(ContentItem model, IUpdateModel updater)
+ {
+ if (model.ContentType == "Team")
+ {
+ // This injects a button on the SummaryAdmin view for the Team ContentType
+ return Combine(
+ Shape("Content_SummaryAdmin__Team__Buttons", new ContentItemViewModel(model)).Location("SummaryAdmin", "Actions:9")
+ );
+ }
+ return null;
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Extensions.cs b/src/Apps/StatCan.OrchardCore.Candev/Extensions.cs
new file mode 100644
index 000000000..997234abf
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Extensions.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Linq;
+using OrchardCore.ContentManagement;
+using OrchardCore.Users.Models;
+
+namespace StatCan.OrchardCore.Candev
+{
+ public static class Extensions
+ {
+ public static bool In(this T t, params T[] values)
+ {
+ return values.Contains(t);
+ }
+ public static bool HasTeam(this User user)
+ {
+ return !string.IsNullOrEmpty(user.GetTeamId());
+ }
+ public static string GetTeamId(this User user)
+ {
+ if (user.Properties.TryGetValue("Hacker", out var property))
+ {
+ var hacker = property.ToObject();
+ if (hacker.Content.Hacker.Team.ContentItemIds.Count != 0)
+ return hacker.Content.Hacker.Team.ContentItemIds[0];
+ }
+
+ return null;
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/FeatureIds.cs b/src/Apps/StatCan.OrchardCore.Candev/FeatureIds.cs
new file mode 100644
index 000000000..424a62412
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/FeatureIds.cs
@@ -0,0 +1,10 @@
+namespace StatCan.OrchardCore.Candev
+{
+ public static class FeatureIds
+ {
+ private const string FeatureIdPrefix = Candev + ".";
+ public const string Candev = "StatCan.OrchardCore.Candev";
+ //public const string Team = FeatureIdPrefix + nameof(Team);
+ //public const string Judging = FeatureIdPrefix + nameof(Judging);
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Indexes/CandevItemsIndex.cs b/src/Apps/StatCan.OrchardCore.Candev/Indexes/CandevItemsIndex.cs
new file mode 100644
index 000000000..069935d3e
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Indexes/CandevItemsIndex.cs
@@ -0,0 +1,165 @@
+using System;
+using System.Linq;
+using Microsoft.Extensions.DependencyInjection;
+using Newtonsoft.Json.Linq;
+using OrchardCore.ContentFields.Fields;
+using OrchardCore.ContentManagement;
+using OrchardCore.ContentManagement.Metadata;
+using OrchardCore.Data;
+using YesSql.Indexes;
+
+namespace StatCan.OrchardCore.Candev.Indexes
+{
+ public class CandevItemsIndex : MapIndex
+ {
+ public string ContentItemId { get; set; }
+ public string ContentItemVersionId { get; set; }
+ public string LocalizationSet { get; set; }
+ public string Culture { get; set; }
+ public bool Published { get; set; }
+ public bool Latest { get; set; }
+ public string ContentType { get; set; }
+ public DateTime? ModifiedUtc { get; set; }
+ public DateTime? PublishedUtc { get; set; }
+ public DateTime? CreatedUtc { get; set; }
+ public string Owner { get; set; }
+ public string Author { get; set; }
+ public string DisplayText { get; set; }
+ public string Email { get; set; }
+ public string TeamContentItemId { get; set; }
+ public string CaseLocalizationSet { get; set; }
+ }
+
+ public class CandevItemsIndexProvider : IndexProvider, IScopedIndexProvider
+ {
+ private readonly IServiceProvider _serviceProvider;
+ private IContentDefinitionManager _contentDefinitionManager;
+
+ public CandevItemsIndexProvider(IServiceProvider serviceProvider)
+ {
+ _serviceProvider = serviceProvider;
+ }
+
+ public override void Describe(DescribeContext context)
+ {
+ context.For()
+ .Map(contentItem =>
+ {
+ if (!contentItem.Published && !contentItem.Latest)
+ {
+ return null;
+ }
+ var indexValue = new CandevItemsIndex
+ {
+ ContentType = contentItem.ContentType,
+ ContentItemId = contentItem.ContentItemId,
+ Owner = contentItem.Owner,
+ Latest = contentItem.Latest,
+ Published = contentItem.Published,
+ ContentItemVersionId = contentItem.ContentItemVersionId,
+ ModifiedUtc = contentItem.ModifiedUtc,
+ PublishedUtc = contentItem.PublishedUtc,
+ CreatedUtc = contentItem.CreatedUtc,
+ Author = contentItem.Author,
+ DisplayText = contentItem.DisplayText
+ };
+
+ // Assign LocalizationPart fields to index
+ var locPart = contentItem.Content.LocalizationPart;
+ if (locPart != null)
+ {
+ indexValue.LocalizationSet = locPart.LocalizationSet?.Value;
+ indexValue.Culture = locPart.Culture?.Value;
+ }
+
+ if (contentItem.ContentType == "Case")
+ {
+ indexValue.CaseLocalizationSet = (string)contentItem.Content.LocalizationPart.LocalizationSet?.Value;
+ return indexValue;
+ }
+
+ // Lazy initialization because of ISession cyclic dependency
+ _contentDefinitionManager ??= _serviceProvider.GetRequiredService();
+
+ var caseElementsFields = _contentDefinitionManager
+ .GetTypeDefinition(contentItem.ContentType)
+ .Parts.SelectMany(x => x.PartDefinition.Fields.Where(f =>
+ (f.FieldDefinition.Name == nameof(LocalizationSetContentPickerField) && f.Name == "Case")))
+ .ToArray();
+ // assign the CaseLocalizationSet to the index
+ foreach (var fieldDefinition in caseElementsFields)
+ {
+ var jPart = (JObject)contentItem.Content[fieldDefinition.PartDefinition.Name];
+
+ if (jPart == null)
+ {
+ continue;
+ }
+ var jField = (JObject)jPart[fieldDefinition.Name];
+ if (jField == null)
+ {
+ continue;
+ }
+ var field = jField.ToObject();
+ indexValue.CaseLocalizationSet = field.LocalizationSets?.FirstOrDefault();
+ }
+ // Special case for Judges, the CaseLocalizationSet comes from the AssignedCase field.
+ if (contentItem.ContentType == "Volunteer" && contentItem.Content.VolunteerJudge?.IsJudge?.Value == true)
+ {
+ indexValue.CaseLocalizationSet = contentItem.Content.VolunteerJudge?.AssignedCase?.LocalizationSets?.First;
+ //indexValue.IsJudge = true;
+ }
+
+ // Attempt to grab the Team and Email fields from the type definition
+ var participantFields = _contentDefinitionManager
+ .GetTypeDefinition(contentItem.ContentType)
+ .Parts.SelectMany(x => x.PartDefinition.Fields.Where(f =>
+ (f.FieldDefinition.Name == nameof(TextField) && f.Name == "Email") ||
+ (f.FieldDefinition.Name == nameof(ContentPickerField) && f.Name == "Team")))
+ .ToArray();
+
+ foreach (var fieldDefinition in participantFields)
+ {
+ var jPart = (JObject)contentItem.Content[fieldDefinition.PartDefinition.Name];
+ if (jPart == null)
+ {
+ continue;
+ }
+ var jField = (JObject)jPart[fieldDefinition.Name];
+ if (jField == null)
+ {
+ continue;
+ }
+ if (fieldDefinition.Name == "Team")
+ {
+ var team = jField.ToObject();
+ if (team != null)
+ {
+ indexValue.TeamContentItemId = team.ContentItemIds?.FirstOrDefault();
+ }
+ }
+ if (fieldDefinition.Name == "Email")
+ {
+ var email = jField.ToObject();
+ if (email != null)
+ {
+ indexValue.Email = email.Text;
+ }
+ }
+ }
+
+ // Special case for Team, assign the TeamContentItemId.
+ if (contentItem.ContentType == "Team")
+ {
+ indexValue.TeamContentItemId = contentItem.ContentItemId;
+ }
+ else if (contentItem.ContentType == "Score")
+ {
+ indexValue.TeamContentItemId = contentItem.Content.Score.Team.ContentItemIds.First;
+ }
+
+ return indexValue;
+ });
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Indexes/CandevUsersIndex.cs b/src/Apps/StatCan.OrchardCore.Candev/Indexes/CandevUsersIndex.cs
new file mode 100644
index 000000000..fa4b6bcfa
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Indexes/CandevUsersIndex.cs
@@ -0,0 +1,69 @@
+using OrchardCore.ContentManagement;
+using OrchardCore.Users.Models;
+using System;
+using YesSql.Indexes;
+
+namespace StatCan.OrchardCore.Candev.Indexes
+{
+ public class CandevUsersIndex : MapIndex
+ {
+ public string UserId { get; set; }
+ public string UserName { get; set; }
+ public string Email { get; set; }
+ public string ContactEmail { get; set; }
+ public string FirstName { get; set; }
+ public string LastName { get; set; }
+ public string Language { get; set; }
+ public string TeamContentItemId { get; set; }
+ public string Roles { get; set; }
+ public bool WillAttend { get; set; }
+ public bool CheckIn { get; set; }
+ }
+
+ public class CandevUsersIndexProvider : IndexProvider
+ {
+ private readonly IServiceProvider _serviceProvider;
+
+ public CandevUsersIndexProvider(IServiceProvider serviceProvider)
+ {
+ _serviceProvider = serviceProvider;
+ }
+
+ public override void Describe(DescribeContext context)
+ {
+ context.For()
+ .Map(user =>
+ {
+ var hackathonUsersIndex = new CandevUsersIndex
+ {
+ UserId = user.UserId,
+ UserName = user.NormalizedUserName,
+ Email = user.NormalizedEmail,
+ Roles = string.Join(",", user.RoleNames)
+ };
+
+ if (user.Properties.TryGetValue("ParticipantProfile", out var property))
+ {
+ var hacker = property.ToObject();
+ hackathonUsersIndex.FirstName = hacker.Content.ParticipantProfile.FirstName.Text;
+ hackathonUsersIndex.LastName = hacker.Content.ParticipantProfile.LastName.Text;
+ hackathonUsersIndex.ContactEmail = hacker.Content.ParticipantProfile.Email.Text;
+ hackathonUsersIndex.Language = hacker.Content.ParticipantProfile.Language.Text;
+ }
+
+ if (user.Properties.TryGetValue("Hacker", out property))
+ {
+ var hacker = property.ToObject();
+ if(hacker.Content.Hacker.Team.ContentItemIds.Count != 0)
+ hackathonUsersIndex.TeamContentItemId = hacker.Content.Hacker.Team.ContentItemIds[0];
+ else
+ hackathonUsersIndex.TeamContentItemId = string.Empty;
+ hackathonUsersIndex.WillAttend = hacker.Content.Hacker.Attendance.Value;
+ hackathonUsersIndex.CheckIn = hacker.Content.Hacker.CheckIn.Value;
+ }
+
+ return hackathonUsersIndex;
+ });
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Indexes/HackathonAvgScoresIndex.cs b/src/Apps/StatCan.OrchardCore.Candev/Indexes/HackathonAvgScoresIndex.cs
new file mode 100644
index 000000000..9c110e6bd
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Indexes/HackathonAvgScoresIndex.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Linq;
+using OrchardCore.ContentManagement;
+using OrchardCore.Data;
+using YesSql.Indexes;
+
+namespace StatCan.OrchardCore.Candev.Indexes
+{
+ public class HackathonAvgScoresIndex : ReduceIndex
+ {
+ public string ScoreIndexId { get; set; }
+ public double Score { get; set; }
+ public double Count { get; set; }
+ }
+ public class HackathonAvgScoresIndexProvider : IndexProvider
+ {
+ public override void Describe(DescribeContext context)
+ {
+ context.For()
+ .Map(contentItem =>
+ {
+ if (contentItem.ContentType == "Score")
+ {
+ if (contentItem.Content.Score.Round.Value != 1)
+ {
+ return new HackathonAvgScoresIndex()
+ {
+ ScoreIndexId = contentItem.Content.Score.Team.ContentItemIds.First.ToString().Remove(25, 1) + contentItem.Content.JudgeType.Type.Values.First.ToString().Remove(1),
+ Score = contentItem.Content.Score.Score.Value,
+ Count = 1
+ };
+ }
+ }
+
+ return new HackathonAvgScoresIndex()
+ {
+ ScoreIndexId = "",
+ };
+ })
+ .Group(index => index.ScoreIndexId)
+ .Reduce(group => new HackathonAvgScoresIndex()
+ {
+ ScoreIndexId = group.Key,
+ Score = group.Sum(x => x.Score),
+ Count = group.Sum(x => x.Count),
+ })
+ .Delete((index, map) =>
+ {
+ index.Score -= map.Sum(x => x.Score);
+ index.Count -= map.Sum(x => x.Count);
+ return index.Score > 0 ? index : null;
+ });
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Indexes/Migrations.cs b/src/Apps/StatCan.OrchardCore.Candev/Indexes/Migrations.cs
new file mode 100644
index 000000000..3c2b65ec3
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Indexes/Migrations.cs
@@ -0,0 +1,111 @@
+using Microsoft.Extensions.DependencyInjection;
+using OrchardCore.ContentManagement.Records;
+using OrchardCore.Data.Migration;
+using OrchardCore.Environment.Shell.Scope;
+using OrchardCore.Users.Models;
+using System;
+using YesSql;
+
+namespace StatCan.OrchardCore.Candev.Indexes
+{
+ public class IndexMigrations : DataMigration
+ {
+ public int Create()
+ {
+ CreateCandevItemsIndex();
+ CreateCandevUsersIndex();
+ CreateHackathonAvgScoresIndex();
+
+ return 2;
+ }
+
+ private void CreateCandevItemsIndex()
+ {
+ SchemaBuilder.CreateMapIndexTable(typeof(CandevItemsIndex), table => table
+ .Column("ContentItemId", c => c.WithLength(26))
+ .Column("ContentItemVersionId", c => c.WithLength(26))
+ .Column("LocalizationSet", c => c.WithLength(26))
+ .Column("Culture", c => c.WithLength(8))
+ .Column("Latest")
+ .Column("Published")
+ .Column("ContentType", column => column.WithLength(ContentItemIndex.MaxContentTypeSize))
+ .Column("ModifiedUtc", column => column.Nullable())
+ .Column("PublishedUtc", column => column.Nullable())
+ .Column("CreatedUtc", column => column.Nullable())
+ .Column("Owner", column => column.Nullable().WithLength(ContentItemIndex.MaxOwnerSize))
+ .Column("Author", column => column.Nullable().WithLength(ContentItemIndex.MaxAuthorSize))
+ .Column("DisplayText", column => column.Nullable().WithLength(ContentItemIndex.MaxDisplayTextSize))
+ .Column("Email", c => c.Nullable().WithLength(255))
+ .Column("TeamContentItemId", c => c.Nullable().WithLength(26))
+ .Column("CaseLocalizationSet", c => c.Nullable().WithLength(26)),
+ null
+ );
+
+ SchemaBuilder.AlterTable(nameof(CandevItemsIndex), table => table
+ .CreateIndex("IDX_CandevItemsIndex_ContentItemId", "ContentItemId", "Latest", "Published", "CreatedUtc")
+ );
+
+ SchemaBuilder.AlterTable(nameof(CandevItemsIndex), table => table
+ .CreateIndex("IDXCandevItemsIndex_ContentItemVersionId", "ContentItemVersionId")
+ );
+
+ SchemaBuilder.AlterTable(nameof(CandevItemsIndex), table => table
+ .CreateIndex("IDX_CandevItemsIndex_DisplayText", "DisplayText")
+ );
+
+ SchemaBuilder.AlterTable(nameof(CandevItemsIndex), table => table
+ .CreateIndex("IDX_CandevItemsIndex_TeamContentItemId", "TeamContentItemId")
+ );
+
+ SchemaBuilder.AlterTable(nameof(CandevItemsIndex), table => table
+ .CreateIndex("IDX_CandevItemsIndex_CaseLocalizationSet", "CaseLocalizationSet")
+ );
+ }
+
+ private void CreateCandevUsersIndex()
+ {
+ SchemaBuilder.CreateMapIndexTable(typeof(CandevUsersIndex), table => table
+ .Column("UserId", c => c.WithLength(26))
+ .Column("UserName", c => c.WithLength(26))
+ .Column("Email", c => c.Nullable().WithLength(255))
+ .Column("Roles", c => c.Nullable().WithLength(255))
+ .Column("ContactEmail", c => c.Nullable().WithLength(255))
+ .Column("FirstName", c => c.WithLength(26))
+ .Column("LastName", c => c.WithLength(26))
+ .Column("Language", c => c.WithLength(4))
+ .Column("TeamContentItemId", c => c.WithLength(26))
+ .Column("WillAttend")
+ .Column("CheckIn"),
+ null
+ );
+
+ ShellScope.AddDeferredTask(async scope => {
+ var session = scope.ServiceProvider.GetRequiredService();
+ var users = await session.Query().ListAsync();
+ foreach (var user in users)
+ {
+ session.Save(user);
+ }
+ });
+ }
+
+ private void CreateHackathonAvgScoresIndex()
+ {
+ SchemaBuilder.CreateReduceIndexTable(typeof(HackathonAvgScoresIndex), table => table
+ .Column("ScoreIndexId", c => c.WithLength(255))
+ .Column("Score")
+ .Column("Count"),
+ null
+ );
+ }
+
+ public int UpdateFrom1()
+ {
+ SchemaBuilder.AlterTable(nameof(CandevUsersIndex), table => table.AddColumn("WillAttend"));
+ SchemaBuilder.AlterTable(nameof(CandevUsersIndex), table => table.AddColumn("CheckIn"));
+ CreateHackathonAvgScoresIndex();
+
+ return 2;
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Manifest.cs b/src/Apps/StatCan.OrchardCore.Candev/Manifest.cs
new file mode 100644
index 000000000..afa80a5f8
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Manifest.cs
@@ -0,0 +1,29 @@
+using OrchardCore.Modules.Manifest;
+using static StatCan.OrchardCore.Manifest.StatCanManifestConstants;
+using static StatCan.OrchardCore.Candev.FeatureIds;
+
+[assembly: Module(
+ Name = "Candev",
+ Author = DigitalInnovationTeam,
+ Website = DigitalInnovationWebsite,
+ Version = Version,
+ Description = "Contains types and utilities for Candev",
+ Category = "Applications"
+)]
+
+[assembly: Feature(
+ Id = Candev,
+ Name = "Candev",
+ Description = "Manages types and templates for hackathon support",
+ Dependencies = new[] {
+ "OrchardCore.Contents",
+ "OrchardCore.Workflows",
+ "OrchardCore.Workflows.Http",
+ "OrchardCore.Autoroute",
+ "OrchardCore.Queries.Sql",
+ "OrchardCore.Users.CustomUserSettings",
+ "StatCan.OrchardCore.VueForms.Localized",
+ "StatCan.OrchardCore.EmailTemplates"
+ },
+ Category = "Applications"
+)]
diff --git a/src/Apps/StatCan.OrchardCore.Candev/MigrationExtensions.cs b/src/Apps/StatCan.OrchardCore.Candev/MigrationExtensions.cs
new file mode 100644
index 000000000..d30a5c948
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/MigrationExtensions.cs
@@ -0,0 +1,44 @@
+
+using OrchardCore.ContentFields.Fields;
+using OrchardCore.ContentFields.Settings;
+using OrchardCore.ContentManagement.Metadata.Builders;
+using OrchardCore.ContentManagement.Metadata.Settings;
+
+namespace StatCan.OrchardCore.Candev
+{
+ ///
+ /// Content Type / Part builder extensions to simplify migrations
+ ///
+ public static class MigrationExtensions
+ {
+ public static ContentPartDefinitionBuilder WithTeamField(this ContentPartDefinitionBuilder p, string position)
+ {
+ return p.WithField("Team", f => f
+ .OfType(nameof(ContentPickerField))
+ .WithDisplayName("Team")
+ .WithPosition(position)
+ .WithSettings(new ContentPickerFieldSettings() { DisplayedContentTypes = new string[] { "Team" } })
+ );
+ }
+
+ public static ContentPartDefinitionBuilder WithChallengeField(this ContentPartDefinitionBuilder p, string position)
+ {
+ return p.WithField("Challenge", f => f
+ .OfType(nameof(ContentPickerField))
+ .WithDisplayName("Challenge")
+ .WithPosition(position)
+ .WithSettings(new ContentPickerFieldSettings() { DisplayedContentTypes = new string[] { "Challenge" } })
+ );
+ }
+
+ public static ContentPartDefinitionBuilder WithTeamCaptainField(this ContentPartDefinitionBuilder p, string position)
+ {
+ return p.WithField("TeamCaptain", f => f
+ .OfType(nameof(UserPickerField))
+ .WithDisplayName("Team Captain")
+ .WithPosition(position)
+ .WithSettings(new UserPickerFieldSettings() { DisplayedRoles = new string[] { "Hacker" } })
+ );
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Migrations.cs b/src/Apps/StatCan.OrchardCore.Candev/Migrations.cs
new file mode 100644
index 000000000..fdb258d61
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Migrations.cs
@@ -0,0 +1,629 @@
+using OrchardCore.ContentFields.Fields;
+using OrchardCore.ContentFields.Settings;
+using OrchardCore.ContentManagement.Metadata;
+using OrchardCore.ContentManagement.Metadata.Settings;
+using OrchardCore.Data.Migration;
+using OrchardCore.Recipes.Services;
+using OrchardCore.Title.Models;
+using StatCan.OrchardCore.Extensions;
+using System.Threading.Tasks;
+
+namespace StatCan.OrchardCore.Candev
+{
+ public class Migrations : DataMigration
+ {
+ private readonly IRecipeMigrator _recipeMigrator;
+ private readonly IContentDefinitionManager _contentDefinitionManager;
+
+ public Migrations(IRecipeMigrator recipeMigrator, IContentDefinitionManager contentDefinitionManager)
+ {
+ _recipeMigrator = recipeMigrator;
+ _contentDefinitionManager = contentDefinitionManager;
+ }
+
+ public async Task CreateAsync()
+ {
+ CreateHackathonCustomSetings();
+ CreateUserProfiles();
+ CreateWidgets();
+ CreateChallenge();
+ CreateTeam();
+ CreateScore();
+ CreateNewsletterSubscriber();
+ CreateTopic();
+
+ await _recipeMigrator.ExecuteAsync("queries.recipe.json", this);
+ await _recipeMigrator.ExecuteAsync("roles.recipe.json", this);
+ await _recipeMigrator.ExecuteAsync("role-judge.recipe.json", this);
+
+ return 3;
+ }
+
+ private void CreateHackathonCustomSetings()
+ {
+ _contentDefinitionManager.AlterPartDefinition("HackathonCustomSettings", part => part
+ .WithField("StartDate", f => f
+ .OfType(nameof(DateField))
+ .WithDisplayName("Start Date")
+ .WithPosition("1")
+ )
+ .WithField("EndDate", f => f
+ .OfType(nameof(DateField))
+ .WithDisplayName("End Date")
+ .WithPosition("2")
+ )
+ .WithNumericField("Capacity", "3", new NumericFieldSettings() { DefaultValue = "0", Hint = "The maximum number of participants. Set to 0 for unlimited" })
+ .WithField("Where", field => field
+ .OfType("TextField")
+ .WithDisplayName("Where")
+ .WithPosition("0")
+ )
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("TeamCustomSettings", part => part
+ .WithField("TeamSize", field => field
+ .OfType("NumericField")
+ .WithDisplayName("Team Size")
+ .WithEditor("Slider")
+ .WithPosition("0")
+ )
+ .WithField("TeamEditable", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Teams Editable")
+ .WithEditor("Switch")
+ .WithPosition("1")
+ .WithSettings(new BooleanFieldSettings
+ {
+ Label = "Can hackers create / join / leave teams?",
+ })
+ )
+ .WithField("PartialChallenge", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Show partial challenge")
+ .WithEditor("Switch")
+ .WithPosition("2")
+ .WithSettings(new BooleanFieldSettings
+ {
+ Label = "Show partial challenge to teams (no background information)",
+ })
+ )
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("JudgingCustomSettings", part => part
+ .WithField("IsFinalRound", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Is final round")
+ .WithEditor("Switch")
+ .WithPosition("0")
+ .WithSettings(new BooleanFieldSettings
+ {
+ Label = "True when it's the final round of judging",
+ })
+ )
+ .WithField("JudgingInProgress", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Judging in progress")
+ .WithEditor("Switch")
+ .WithPosition("9")
+ .WithSettings(new BooleanFieldSettings
+ {
+ Hint = "True when a judging round is active.",
+ })
+ )
+ );
+
+ _contentDefinitionManager.AlterTypeDefinition("HackathonCustomSettings", type => type
+ .DisplayedAs("Hackathon Custom Settings")
+ .Stereotype("CustomSettings")
+ .WithPart("HackathonCustomSettings", p => p
+ .WithPosition("0")
+ )
+ .WithPart("TeamCustomSettings", part => part
+ .WithPosition("1")
+ )
+ .WithPart("JudgingCustomSettings", part => part
+ .WithPosition("2")
+ )
+ );
+ }
+
+ private void CreateUserProfiles()
+ {
+ _contentDefinitionManager.AlterPartDefinition("ParticipantProfile", part => part
+ .WithTextField("FirstName", "First Name", "0")
+ .WithTextField("LastName", "Last Name", "1")
+ .WithTextField("Email", "Contact Email", "Email", "2")
+ .WithField("Language", f => f
+ .OfType(nameof(TextField))
+ .WithDisplayName("Language")
+ .WithPosition("3")
+ .WithEditor("PredefinedList")
+ .WithSettings(new TextFieldPredefinedListEditorSettings()
+ {
+ Editor = 0,
+ DefaultValue = "en",
+ Options = new ListValueOption[] {
+ new ListValueOption(){Name = "English", Value = "en"},
+ new ListValueOption(){Name = "French", Value = "fr"},
+ new ListValueOption(){Name = "Billingual", Value = "both"}
+ }
+ })
+ )
+ .WithField("TermsAndConditions", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Terms And Conditions")
+ .WithPosition("4")
+ )
+ .WithField("Comments", field => field
+ .OfType("TextField")
+ .WithDisplayName("Comments")
+ .WithPosition("5")
+ )
+ );
+
+ _contentDefinitionManager.AlterTypeDefinition("ParticipantProfile", type => type
+ .WithPart("ParticipantProfile", p => p.WithPosition("0"))
+ .Stereotype("CustomUserSettings")
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("Hacker", part => part
+ .WithDisplayName("Hacker")
+ .WithField("Team", field => field
+ .OfType("ContentPickerField")
+ .WithDisplayName("Team")
+ .WithPosition("0")
+ .WithSettings(new ContentPickerFieldSettings
+ {
+ DisplayedContentTypes = new[] { "Team" },
+ })
+ )
+ .WithField("School", field => field
+ .OfType("TextField")
+ .WithDisplayName("School")
+ .WithPosition("1")
+ )
+ .WithField("FieldOfStudy", field => field
+ .OfType("TextField")
+ .WithDisplayName("Field of Study")
+ .WithPosition("2")
+ )
+ .WithField("ProgramName", field => field
+ .OfType("TextField")
+ .WithDisplayName("Program Name")
+ .WithPosition("3")
+ )
+ .WithField("ProgramLevel", field => field
+ .OfType("TextField")
+ .WithDisplayName("ProgramLevel")
+ .WithPosition("4")
+ )
+ .WithField("ProgramYears", field => field
+ .OfType("TextField")
+ .WithDisplayName("ProgramYears")
+ .WithPosition("5")
+ )
+ .WithField("Adult", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Adult")
+ .WithPosition("6")
+ )
+ .WithBooleanField("Attendance", "Attendance", "7")
+ .WithBooleanField("CheckIn", "Check-in", "8")
+ );
+
+ _contentDefinitionManager.AlterTypeDefinition("Hacker", type => type
+ .DisplayedAs("Hacker")
+ .Stereotype("CustomUserSettings")
+ .WithPart("Hacker", part => part
+ .WithPosition("0")
+ )
+ );
+ }
+
+ private void CreateWidgets()
+ {
+ _contentDefinitionManager.CreateBasicWidget("HackathonCalendar");
+ _contentDefinitionManager.CreateBasicWidget("ChallengeListWidget");
+ _contentDefinitionManager.CreateBasicWidget("ChallengeSubmission");
+ _contentDefinitionManager.CreateBasicWidget("TeamDashboardWidget");
+ _contentDefinitionManager.CreateBasicWidget("JudgingListWidget");
+ _contentDefinitionManager.CreateBasicWidget("ArchivedSolutions");
+ _contentDefinitionManager.CreateBasicWidget("UserProfile");
+ _contentDefinitionManager.CreateBasicWidget("JudgingResults");
+ }
+
+ private void CreateChallenge()
+ {
+ _contentDefinitionManager.AlterPartDefinition("Challenge", part => part
+ .WithField("Title", field => field
+ .OfType("TextField")
+ .WithDisplayName("Title")
+ .WithPosition("0")
+ )
+ .WithField("DatasetsFiles", field => field
+ .OfType("MediaField")
+ .WithDisplayName("Datasets Files")
+ .WithPosition("6")
+ )
+ .WithField("BackgroundInformation", field => field
+ .OfType("TextField")
+ .WithDisplayName("Background Information")
+ .WithPosition("7")
+ )
+ .WithField("ContactPersonName", field => field
+ .OfType("TextField")
+ .WithDisplayName("Contact Person Name")
+ .WithPosition("8")
+ )
+ .WithField("ContactPersonEmail", field => field
+ .OfType("TextField")
+ .WithDisplayName("Contact Person Email")
+ .WithPosition("9")
+ )
+ .WithField("TechnicalMentorName", field => field
+ .OfType("TextField")
+ .WithDisplayName("Technical Mentor Name")
+ .WithPosition("10")
+ )
+ .WithField("TechnicalMentorEmail", field => field
+ .OfType("TextField")
+ .WithDisplayName("Technical Mentor Email")
+ .WithPosition("11")
+ )
+ .WithField("CaseSpecialistName", field => field
+ .OfType("TextField")
+ .WithDisplayName("Case Specialist Name")
+ .WithPosition("12")
+ )
+ .WithField("CaseSpecialistEmail", field => field
+ .OfType("TextField")
+ .WithDisplayName("Case Specialist Email")
+ .WithPosition("13")
+ )
+ .WithField("Comments", field => field
+ .OfType("TextField")
+ .WithDisplayName("Comments")
+ .WithPosition("14")
+ )
+ .WithField("Statement", field => field
+ .OfType("TextField")
+ .WithDisplayName("Statement")
+ .WithEditor("TextArea")
+ .WithPosition("15")
+ )
+ .WithField("Datasets", field => field
+ .OfType("TextField")
+ .WithDisplayName("Datasets")
+ .WithEditor("TextArea")
+ .WithPosition("16")
+ )
+ .WithField("OrganizationNameEn", field => field
+ .OfType("TextField")
+ .WithDisplayName("Organization Name En")
+ .WithPosition("2")
+ )
+ .WithField("OrganizationAcronymEn", field => field
+ .OfType("TextField")
+ .WithDisplayName("Organization Acronym En")
+ .WithPosition("3")
+ )
+ .WithField("Keywords", field => field
+ .OfType("TextField")
+ .WithDisplayName("Keywords")
+ .WithPosition("1")
+ )
+ );
+
+ _contentDefinitionManager.AlterTypeDefinition("Challenge", t => t
+ .DisplayedAs("Challenge")
+ .Creatable()
+ .Listable()
+ .Draftable()
+ .Securable()
+ .WithPart("TitlePart", part => part
+ .WithPosition("0")
+ .WithSettings(new TitlePartSettings
+ {
+ Options = TitlePartOptions.GeneratedHidden,
+ Pattern = "{{ContentItem.Content.Challenge.Title.Text}}",
+ })
+ )
+ .WithPart("Challenge", part => part
+ .WithPosition("1")
+ )
+ .WithPart("MarkdownBodyPart", part => part
+ .WithDisplayName("Markdown Body")
+ .WithPosition("2")
+ .WithEditor("Wysiwyg")
+ )
+ .WithPart("LocalizationPart", part => part
+ .WithPosition("3")
+ )
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("Volunteer", part => part
+ .WithField("Mentor", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Mentor")
+ .WithPosition("0")
+ )
+ .WithField("Judge", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Judge")
+ .WithPosition("7")
+ )
+ .WithField("WorkshopPresenter", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Workshop Presenter")
+ .WithPosition("2")
+ )
+ .WithField("TechnicalAdvisor", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Technical Advisor")
+ .WithPosition("3")
+ )
+ .WithField("KeynoteSpeaker", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Keynote Speaker")
+ .WithPosition("4")
+ )
+ .WithField("Observer", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Observer")
+ .WithPosition("5")
+ )
+ .WithField("Organizer", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Organizer")
+ .WithPosition("6")
+ )
+ .WithField("Department", field => field
+ .OfType("TextField")
+ .WithDisplayName("Department")
+ .WithPosition("8")
+ )
+ .WithField("AgencyRepresentative", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Agency Representative")
+ .WithPosition("1")
+ )
+ );
+
+ _contentDefinitionManager.AlterTypeDefinition("Volunteer", type => type
+ .DisplayedAs("Volunteer")
+ .Securable()
+ .Stereotype("CustomUserSettings")
+ .WithPart("Volunteer", part => part
+ .WithPosition("0")
+ )
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("JudgeType", part => part
+ .Attachable()
+ .WithDisplayName("Judge Type")
+ .WithDescription("Provides a picker to choose a type of judge")
+ .WithField("Type", field => field
+ .OfType("MultiTextField")
+ .WithDisplayName("Type")
+ .WithEditor("Picker")
+ .WithPosition("0")
+ .WithSettings(new MultiTextFieldSettings
+ {
+ Options = new MultiTextFieldValueOption[] { new MultiTextFieldValueOption() {
+ Name = "Technical",
+ Value = "Technical"
+ }, new MultiTextFieldValueOption() {
+ Name = "Subject Matter",
+ Value = "SubjectMatter"
+ } },
+ })
+ )
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("Judge", part => part
+ .WithField("Challenge", field => field
+ .OfType("ContentPickerField")
+ .WithDisplayName("Challenge")
+ .WithPosition("0")
+ .WithSettings(new ContentPickerFieldSettings
+ {
+ DisplayedContentTypes = new[] { "Challenge" },
+ })
+ )
+ );
+
+ _contentDefinitionManager.AlterTypeDefinition("Judge", type => type
+ .DisplayedAs("Judge")
+ .Stereotype("CustomUserSettings")
+ .WithPart("Judge", part => part
+ .WithPosition("0")
+ )
+ .WithPart("JudgeType", part => part
+ .WithPosition("1")
+ )
+ );
+ }
+
+ private void CreateTeam()
+ {
+ _contentDefinitionManager.AlterPartDefinition("TeamSolutionPart", p => p
+ .WithDisplayName("Team Solution")
+ .WithDescription("Fields related to the team's solution to the challenge")
+ .Attachable()
+ .WithTextField("Name", "Name of solution", "0")
+ .WithTextField("Description", "Solution description", "TextArea", "1")
+ .WithTextField("RepositoryUrl", "Solution repository url", "2", new TextFieldSettings() { Hint = "Url of where we can get solution artifacts. Typically a git repository" })
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("Team", p => p
+ .WithTextField("Name", "Team Name", "0")
+ .WithTextField("Description", "Team Description", "TextArea", "1")
+ .WithChallengeField("3")
+ .WithTeamCaptainField("4")
+ .WithField("Topics", field => field
+ .OfType("ContentPickerField")
+ .WithDisplayName("Topics")
+ .WithPosition("2")
+ .WithSettings(new ContentPickerFieldSettings
+ {
+ Multiple = true,
+ DisplayedContentTypes = new[] { "Topic" },
+ })
+ )
+ .WithField("InTheRunning", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("In The Running")
+ .WithEditor("Switch")
+ .WithPosition("1")
+ .WithSettings(new BooleanFieldSettings
+ {
+ DefaultValue = true,
+ })
+ )
+ );
+
+ _contentDefinitionManager.AlterTypeDefinition("Team", t => t
+ .Creatable().Listable().Securable()
+ .WithTitlePart("0", TitlePartOptions.GeneratedDisabled, "{% assign case = ContentItem.Content.Team.Challenge.LocalizationSets | localization_set: 'en' | first %}\r\n{{ case | display_text | slugify }}-{{ContentItem.Content.Team.Name.Text}}-{{ ContentItem.Id }}")
+ .WithPart("Team", p => p.WithPosition("1"))
+ .WithPart("TeamSolutionPart", p => p.WithPosition("2"))
+ .WithPart("EmailTemplatePart", p => p.WithPosition("3"))
+ );
+ }
+
+ private void CreateScore()
+ {
+ _contentDefinitionManager.AlterPartDefinition("Score", p => p
+ .Attachable()
+ .WithNumericField("Score", "0", new NumericFieldSettings() { Required = true, DefaultValue = "0" })
+ .WithNumericField("Round", "1", new NumericFieldSettings() { Required = true, DefaultValue = "0" })
+ .WithField("Judge", f => f
+ .OfType(nameof(UserPickerField))
+ .WithDisplayName("Judge")
+ .WithPosition("2")
+ .WithSettings(new UserPickerFieldSettings() { DisplayedRoles = new string[] { "Volunteer" } })
+ )
+ .WithTeamField("3")
+ );
+
+ _contentDefinitionManager.AlterTypeDefinition("Score", t => t
+ .WithPart("Score", p => p.WithPosition("0"))
+ .WithPart("JudgeType", p => p.WithPosition("1"))
+ );
+ }
+
+ private void CreateNewsletterSubscriber()
+ {
+ _contentDefinitionManager.AlterPartDefinition("NewsletterSubscriber", part => part
+ .WithField("Email", field => field
+ .OfType("TextField")
+ .WithDisplayName("Email")
+ .WithEditor("Email")
+ .WithPosition("0")
+ )
+ .WithField("Name", field => field
+ .OfType("TextField")
+ .WithDisplayName("Name")
+ .WithPosition("1")
+ )
+ );
+
+ _contentDefinitionManager.AlterTypeDefinition("NewsletterSubscriber", type => type
+ .DisplayedAs("Newsletter Subscriber")
+ .Creatable()
+ .Draftable()
+ .Versionable()
+ .Securable()
+ .WithPart("NewsletterSubscriber", part => part
+ .WithPosition("0")
+ )
+ );
+ }
+
+ private void CreateTopic()
+ {
+ _contentDefinitionManager.AlterPartDefinition("Topic", part => part
+ .WithField("NameEn", field => field
+ .OfType("TextField")
+ .WithDisplayName("NameEn")
+ .WithPosition("0")
+ )
+ .WithField("NameFr", field => field
+ .OfType("TextField")
+ .WithDisplayName("NameFr")
+ .WithPosition("1")
+ )
+ .WithField("Challenge", field => field
+ .OfType("ContentPickerField")
+ .WithDisplayName("Challenge")
+ .WithPosition("2")
+ .WithSettings(new ContentPickerFieldSettings
+ {
+ DisplayedContentTypes = new[] { "Challenge" },
+ })
+ )
+ );
+
+ _contentDefinitionManager.AlterTypeDefinition("Topic", type => type
+ .DisplayedAs("Topic")
+ .Creatable()
+ .Listable()
+ .Draftable()
+ .Securable()
+ .WithPart("Topic", part => part
+ .WithPosition("0")
+ )
+ .WithPart("TitlePart", part => part
+ .WithPosition("1")
+ .WithSettings(new TitlePartSettings
+ {
+ Options = TitlePartOptions.GeneratedDisabled,
+ Pattern = "{{ContentItem.Content.Topic.NameEn.Text}}"
+ })
+ )
+ );
+ }
+
+ public int UpdateFrom1()
+ {
+ _contentDefinitionManager.AlterPartDefinition("Hacker", part => part
+ .WithBooleanField("CheckIn", "Check-in", "8")
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("TeamCustomSettings", part => part
+ .WithField("PartialChallenge", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Show partial challenge")
+ .WithEditor("Switch")
+ .WithPosition("2")
+ .WithSettings(new BooleanFieldSettings
+ {
+ Label = "Show partial challenge to teams (no background information)",
+ })
+ )
+ );
+
+ _contentDefinitionManager.AlterPartDefinition("JudgingCustomSettings", part => part
+ .WithField("IsFinalRound", field => field
+ .OfType("BooleanField")
+ .WithDisplayName("Is final round")
+ .WithEditor("Switch")
+ .WithPosition("0")
+ .WithSettings(new BooleanFieldSettings
+ {
+ Label = "True when it's the final round of judging",
+ })
+ )
+ );
+
+ return 2;
+ }
+
+ public int UpdateFrom2()
+ {
+ _contentDefinitionManager.CreateBasicWidget("JudgingResults");
+
+ return 3;
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Migrations/queries.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Migrations/queries.recipe.json
new file mode 100644
index 000000000..645b23531
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Migrations/queries.recipe.json
@@ -0,0 +1,65 @@
+{
+ "steps": [
+ {
+ "name": "Queries",
+ "Queries": [
+ {
+ "Name": "GetOwner",
+ "ReturnDocuments": false,
+ "Schema": null,
+ "Source": "Sql",
+ "Template": "SELECT * FROM CandevItemsIndex where Owner = '{{owner}}'"
+ },
+ {
+ "Name": "GetItemsForHackathon",
+ "ReturnDocuments": true,
+ "Schema": null,
+ "Source": "Sql",
+ "Template": "SELECT DocumentId FROM CandevItemsIndex where ContentType ='{{type}}'"
+ },
+ {
+ "Name": "GetHackersForTeam",
+ "ReturnDocuments": false,
+ "Schema": "null",
+ "Source": "Sql",
+ "Template": "SELECT * FROM CandevUsersIndex where TeamContentItemId = '{{teamContentItemId}}'"
+ },
+ {
+ "Name": "GetScoreEntry",
+ "ReturnDocuments": true,
+ "Schema": null,
+ "Source": "Sql",
+ "Template": "SELECT DocumentId FROM CandevItemsIndex where ContentType ='Score' and TeamContentItemId = '{{teamContentItemId}}' and Owner = '{{owner}}'"
+ },
+ {
+ "Name": "GetTeam",
+ "ReturnDocuments": true,
+ "Schema": null,
+ "Source": "Sql",
+ "Template": "SELECT DocumentId FROM CandevItemsIndex where ContentType ='Team' and ContentItemId = '{{teamContentItemId}}'"
+ },
+ {
+ "Name": "GetChallengeSubmissionsForOwner",
+ "ReturnDocuments": true,
+ "Schema": null,
+ "Source": "Sql",
+ "Template": "SELECT DocumentId FROM CandevItemsIndex WHERE ContentType ='Challenge' AND Owner = '{{owner}}'"
+ },
+ {
+ "Name": "GetScoresForTeam",
+ "ReturnDocuments": true,
+ "Schema": null,
+ "Source": "Sql",
+ "Template": "SELECT DocumentId FROM CandevItemsIndex where ContentType ='Score' and TeamContentItemId = '{{teamContentItemId}}'"
+ },
+ {
+ "Name": "GetAvgScoresForTeam",
+ "ReturnDocuments": false,
+ "Schema": null,
+ "Source": "Sql",
+ "Template": "SELECT * FROM HackathonAvgScoresIndex where ScoreIndexId = '{{scoreIndexId}}_{{type}}'"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Migrations/role-judge.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Migrations/role-judge.recipe.json
new file mode 100644
index 000000000..57bfdb68d
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Migrations/role-judge.recipe.json
@@ -0,0 +1,14 @@
+{
+ "steps": [
+ {
+ "name": "roles",
+ "Roles": [
+ {
+ "Name": "Judge",
+ "Description": "Candev Judge",
+ "Permissions": []
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Migrations/roles.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Migrations/roles.recipe.json
new file mode 100644
index 000000000..14ddf3452
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Migrations/roles.recipe.json
@@ -0,0 +1,24 @@
+{
+ "steps": [
+ {
+ "name": "roles",
+ "Roles": [
+ {
+ "Name": "Hacker",
+ "Description": "Candev Hacker",
+ "Permissions": []
+ },
+ {
+ "Name": "Volunteer",
+ "Description": "Candev Volunteer",
+ "Permissions": []
+ },
+ {
+ "Name": "Authenticated",
+ "Description": "Authenticated role",
+ "Permissions": ["ManageOwnCustomUserSettings_ParticipantProfile", "ManageOwnCustomUserSettings_Hacker"]
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Recipes/Candev.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Recipes/Candev.recipe.json
new file mode 100644
index 000000000..58a85dc9a
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Recipes/Candev.recipe.json
@@ -0,0 +1,2172 @@
+{
+ "name": "candev-app",
+ "displayName": "Candev app setup recipe",
+ "description": "Candev app setup recipe",
+ "author": "Digital Innovation Team",
+ "website": "https://digital.statcan.gc.ca",
+ "version": "0.1.0",
+ "issetuprecipe": true,
+ "categories": [],
+ "tags": [],
+ "steps": [
+ {
+ "name": "Feature",
+ "enable": [
+ "Application.Default",
+ "StatCan.OrchardCore.Cms.Web",
+ "OrchardCore.Resources",
+ "Lombiq.HelpfulExtensions.CodeGeneration",
+ "OrchardCore.Liquid",
+ "OrchardCore.Settings",
+ "OrchardCore.Contents",
+ "OrchardCore.ContentTypes",
+ "OrchardCore.Autoroute",
+ "OrchardCore.Widgets",
+ "OrchardCore.Flows",
+ "OrchardCore.Title",
+ "OrchardCore.Shortcodes",
+ "OrchardCore.Html",
+ "OrchardCore.Admin",
+ "OrchardCore.AdminDashboard",
+ "OrchardCore.AdminMenu",
+ "OrchardCore.Templates",
+ "OrchardCore.Alias",
+ "OrchardCore.AuditTrail",
+ "OrchardCore.Features",
+ "OrchardCore.Scripting",
+ "OrchardCore.Recipes",
+ "OrchardCore.ContentFields",
+ "OrchardCore.Users",
+ "OrchardCore.Localization",
+ "OrchardCore.ContentLocalization",
+ "OrchardCore.ContentLocalization.ContentCulturePicker",
+ "OrchardCore.ContentPreview",
+ "OrchardCore.Deployment",
+ "OrchardCore.Contents.Deployment.Download",
+ "OrchardCore.CustomSettings",
+ "OrchardCore.Diagnostics",
+ "OrchardCore.DynamicCache",
+ "OrchardCore.Email",
+ "OrchardCore.Feeds",
+ "OrchardCore.GitHub.Authentication",
+ "OrchardCore.HomeRoute",
+ "OrchardCore.Https",
+ "OrchardCore.Indexing",
+ "OrchardCore.Rules",
+ "OrchardCore.Layers",
+ "OrchardCore.Lists",
+ "OrchardCore.Markdown",
+ "OrchardCore.Media",
+ "OrchardCore.Menu",
+ "OrchardCore.Navigation",
+ "OrchardCore.Queries",
+ "OrchardCore.Queries.Sql",
+ "OrchardCore.ReverseProxy",
+ "OrchardCore.Roles",
+ "OrchardCore.Shortcodes.Templates",
+ "OrchardCore.Themes",
+ "OrchardCore.Users.AuditTrail",
+ "OrchardCore.Users.CustomUserSettings",
+ "OrchardCore.Users.Registration",
+ "OrchardCore.Users.ResetPassword",
+ "OrchardCore.Workflows",
+ "OrchardCore.Workflows.Http",
+ "StatCan.OrchardCore.Candev",
+ "StatCan.OrchardCore.ContentPermissions",
+ "StatCan.OrchardCore.CommonTypes.Page",
+ "StatCan.OrchardCore.CommonTypes.SecurePage",
+ "StatCan.OrchardCore.Configuration",
+ "StatCan.OrchardCore.ContentFields",
+ "StatCan.OrchardCore.DisplayHelpers",
+ "StatCan.OrchardCore.EmailTemplates",
+ "StatCan.OrchardCore.FIP",
+ "StatCan.OrchardCore.LocalizedText",
+ "StatCan.OrchardCore.Scripting",
+ "StatCan.OrchardCore.VueForms",
+ "StatCan.OrchardCore.VueForms.Localized",
+ "StatCan.OrchardCore.Menu",
+ "StatCan.OrchardCore.Vuetify",
+ "StatCan.OrchardCore.Vuetify.Alert",
+ "StatCan.OrchardCore.Vuetify.Card",
+ "StatCan.OrchardCore.Vuetify.ExpansionPanel",
+ "StatCan.OrchardCore.Vuetify.Grid",
+ "StatCan.OrchardCore.Vuetify.Image",
+ "StatCan.OrchardCore.Vuetify.List",
+ "StatCan.OrchardCore.Vuetify.Schedule",
+ "StatCan.OrchardCore.Vuetify.Tabs",
+ "StatCan.OrchardCore.Vuetify.Timeline",
+ "TheAdmin",
+ "DigitalAdmin",
+ "VuetifyTheme"
+ ],
+ "disable": [
+ "Lombiq.HelpfulExtensions.ContentTypes",
+ "Lombiq.HelpfulExtensions.Flows",
+ "Lombiq.HelpfulExtensions.Widgets",
+ "OrchardCore.AdminTemplates",
+ "OrchardCore.Apis.GraphQL",
+ "OrchardCore.Setup",
+ "OrchardCore.AutoSetup",
+ "OrchardCore.BackgroundTasks",
+ "OrchardCore.ContentFields.Indexing.SQL",
+ "OrchardCore.ContentFields.Indexing.SQL.UserPicker",
+ "OrchardCore.Sitemaps",
+ "OrchardCore.ContentLocalization.Sitemaps",
+ "OrchardCore.Contents.Deployment.AddToDeploymentPlan",
+ "OrchardCore.Contents.Deployment.ExportContentToDeploymentTarget",
+ "OrchardCore.Contents.FileContentDefinition",
+ "OrchardCore.Cors",
+ "OrchardCore.DataProtection.Azure",
+ "OrchardCore.Deployment.Remote",
+ "OrchardCore.Facebook",
+ "OrchardCore.Facebook.Login",
+ "OrchardCore.Facebook.Widgets",
+ "OrchardCore.Forms",
+ "OrchardCore.Google.Analytics",
+ "OrchardCore.Google.GoogleAuthentication",
+ "OrchardCore.Google.TagManager",
+ "OrchardCore.HealthChecks",
+ "OrchardCore.Lucene",
+ "OrchardCore.Lucene.ContentPicker",
+ "OrchardCore.Lucene.Worker",
+ "OrchardCore.Media.Cache",
+ "OrchardCore.Media.Azure.Storage",
+ "OrchardCore.Media.Slugify",
+ "OrchardCore.Microsoft.Authentication.AzureAD",
+ "OrchardCore.Microsoft.Authentication.MicrosoftAccount",
+ "OrchardCore.MiniProfiler",
+ "OrchardCore.OpenId",
+ "OrchardCore.OpenId.Client",
+ "OrchardCore.OpenId.Management",
+ "OrchardCore.OpenId.Server",
+ "OrchardCore.OpenId.Validation",
+ "OrchardCore.Placements",
+ "OrchardCore.Placements.FileStorage",
+ "OrchardCore.PublishLater",
+ "OrchardCore.ReCaptcha",
+ "OrchardCore.ReCaptcha.Users",
+ "OrchardCore.Redis",
+ "OrchardCore.Redis.Bus",
+ "OrchardCore.Redis.Cache",
+ "OrchardCore.Redis.DataProtection",
+ "OrchardCore.Redis.Lock",
+ "OrchardCore.XmlRpc",
+ "OrchardCore.RemotePublishing",
+ "OrchardCore.ResponseCompression",
+ "OrchardCore.Seo",
+ "OrchardCore.Sitemaps.Cleanup",
+ "OrchardCore.Sitemaps.RazorPages",
+ "OrchardCore.Spatial",
+ "OrchardCore.Taxonomies",
+ "OrchardCore.Taxonomies.ContentsAdminList",
+ "OrchardCore.Tenants",
+ "OrchardCore.Tenants.Distributed",
+ "OrchardCore.Tenants.FileProvider",
+ "OrchardCore.Twitter",
+ "OrchardCore.Twitter.Signin",
+ "OrchardCore.Users.ChangeEmail",
+ "OrchardCore.Users.TimeZone",
+ "OrchardCore.Workflows.Session",
+ "OrchardCore.Workflows.Timers",
+ "StatCan.OrchardCore.CommonTypes.AdditionalPages",
+ "StatCan.OrchardCore.CommonTypes.HtmlWidget",
+ "StatCan.OrchardCore.CommonTypes.LiquidWidget",
+ "StatCan.OrchardCore.CommonTypes.MarkdownWidget",
+ "StatCan.OrchardCore.ContentFields.MultiValueTextField",
+ "StatCan.OrchardCore.ContentFields.PredefinedGroup",
+ "StatCan.OrchardCore.GCCollab.Authentication",
+ "StatCan.OrchardCore.GitHub",
+ "StatCan.OrchardCore.Matomo",
+ "StatCan.OrchardCore.OpenAPI",
+ "StatCan.OrchardCore.Queries.GraphQL",
+ "StatCan.OrchardCore.Scheduling",
+ "StatCan.OrchardCore.VueForms.Survey",
+ "BootstrapTheme",
+ "DigitalTheme",
+ "HackathonTheme",
+ "PortalTheme",
+ "SafeMode",
+ "TheTheme"
+ ]
+ },
+ {
+ "name": "recipes",
+ "Values": [
+ {
+ "executionid": "VuetifyTheme",
+ "name": "vuetify-theme-setup"
+ }
+ ]
+ },
+ {
+ "name": "Queries",
+ "Queries": [
+ {
+ "Template": "SELECT * FROM CandevItemsIndex where Owner = '{{owner}}'",
+ "ReturnDocuments": false,
+ "Name": "GetOwner",
+ "Source": "Sql",
+ "Schema": null
+ },
+ {
+ "Template": "SELECT DocumentId FROM CandevItemsIndex where ContentType ='{{type}}'",
+ "ReturnDocuments": true,
+ "Name": "GetItemsForHackathon",
+ "Source": "Sql",
+ "Schema": null
+ },
+ {
+ "Template": "SELECT * FROM CandevUsersIndex where TeamContentItemId = '{{teamContentItemId}}'",
+ "ReturnDocuments": false,
+ "Name": "GetHackersForTeam",
+ "Source": "Sql",
+ "Schema": "null"
+ },
+ {
+ "Template": "SELECT DocumentId FROM CandevItemsIndex where ContentType ='Score' and TeamContentItemId = '{{teamContentItemId}}' and Owner = '{{owner}}'",
+ "ReturnDocuments": true,
+ "Name": "GetScoreEntry",
+ "Source": "Sql",
+ "Schema": null
+ },
+ {
+ "Template": "SELECT DocumentId FROM CandevItemsIndex where ContentType ='Team' and ContentItemId = '{{teamContentItemId}}'",
+ "ReturnDocuments": true,
+ "Name": "GetTeam",
+ "Source": "Sql",
+ "Schema": null
+ },
+ {
+ "Template": "SELECT DocumentId FROM CandevItemsIndex WHERE ContentType ='Challenge' AND Owner = '{{owner}}'",
+ "ReturnDocuments": true,
+ "Name": "GetChallengeSubmissionsForOwner",
+ "Source": "Sql",
+ "Schema": "null"
+ }
+ ]
+ },
+ {
+ "name": "Layers",
+ "Layers": [
+ {
+ "Name": "All",
+ "Rule": null,
+ "Description": null,
+ "LayerRule": {
+ "Conditions": [
+ {
+ "$type": "OrchardCore.Rules.Models.BooleanCondition, OrchardCore.Rules",
+ "Value": true,
+ "Name": "BooleanCondition",
+ "ConditionId": "4e84art6jgnj44kyh32e0wtmw0"
+ }
+ ],
+ "Name": null,
+ "ConditionId": "4cagqqka6yyjrstw5q9zcy0ncv"
+ }
+ },
+ {
+ "Name": "RegistrationAlert",
+ "Rule": null,
+ "Description": null,
+ "LayerRule": {
+ "Conditions": [
+ {
+ "$type": "OrchardCore.Rules.Models.AllConditionGroup, OrchardCore.Rules",
+ "DisplayText": "all",
+ "Conditions": [
+ {
+ "$type": "OrchardCore.Rules.Models.RoleCondition, OrchardCore.Rules",
+ "Value": "Volunteer",
+ "Operation": {
+ "$type": "OrchardCore.Rules.Models.StringNotEqualsOperator, OrchardCore.Rules",
+ "CaseSensitive": false
+ },
+ "Name": "RoleCondition",
+ "ConditionId": "43eaa7s3j6rfzvpn2p3ksq0cc1"
+ },
+ {
+ "$type": "OrchardCore.Rules.Models.RoleCondition, OrchardCore.Rules",
+ "Value": "Hacker",
+ "Operation": {
+ "$type": "OrchardCore.Rules.Models.StringNotEqualsOperator, OrchardCore.Rules",
+ "CaseSensitive": false
+ },
+ "Name": "RoleCondition",
+ "ConditionId": "4g32446mmsmw8vcvksz3zjffdc"
+ },
+ {
+ "$type": "OrchardCore.Rules.Models.RoleCondition, OrchardCore.Rules",
+ "Value": "Administrator",
+ "Operation": {
+ "$type": "OrchardCore.Rules.Models.StringNotEqualsOperator, OrchardCore.Rules",
+ "CaseSensitive": false
+ },
+ "Name": "RoleCondition",
+ "ConditionId": "4x7gadwcp0h91wm70mrtjwspd5"
+ },
+ {
+ "$type": "OrchardCore.Rules.Models.RoleCondition, OrchardCore.Rules",
+ "Value": "Editor",
+ "Operation": {
+ "$type": "OrchardCore.Rules.Models.StringNotEqualsOperator, OrchardCore.Rules",
+ "CaseSensitive": false
+ },
+ "Name": "RoleCondition",
+ "ConditionId": "4g8fw65f7c7c9w96w8c45p3vdx"
+ },
+ {
+ "$type": "OrchardCore.Rules.Models.IsAuthenticatedCondition, OrchardCore.Rules",
+ "Name": "IsAuthenticatedCondition",
+ "ConditionId": "4fsk93ggj90g2sqta4y8fjhgmq"
+ },
+ {
+ "$type": "OrchardCore.Rules.Models.UrlCondition, OrchardCore.Rules",
+ "Value": "volunteer-registration",
+ "Operation": {
+ "$type": "OrchardCore.Rules.Models.StringNotContainsOperator, OrchardCore.Rules",
+ "CaseSensitive": false
+ },
+ "Name": "UrlCondition",
+ "ConditionId": "4wqbc9zfx9q474x27qvkysxvwz"
+ },
+ {
+ "$type": "OrchardCore.Rules.Models.UrlCondition, OrchardCore.Rules",
+ "Value": "hacker-registration",
+ "Operation": {
+ "$type": "OrchardCore.Rules.Models.StringNotContainsOperator, OrchardCore.Rules",
+ "CaseSensitive": false
+ },
+ "Name": "UrlCondition",
+ "ConditionId": "40vwjxw1krp8e5yk07ttxgqj5t"
+ }
+ ],
+ "Name": "AllConditionGroup",
+ "ConditionId": "40hb7kh6mwhhp1pj7qr1spkjc9"
+ }
+ ],
+ "Name": null,
+ "ConditionId": "472zcq4ve79417y1e4hcrbp7xw"
+ }
+ },
+ {
+ "Name": "Culture en",
+ "Rule": null,
+ "Description": null,
+ "LayerRule": {
+ "Conditions": [
+ {
+ "$type": "OrchardCore.Rules.Models.CultureCondition, OrchardCore.Rules",
+ "Value": "en",
+ "Operation": {
+ "$type": "OrchardCore.Rules.Models.StringEqualsOperator, OrchardCore.Rules",
+ "CaseSensitive": false
+ },
+ "Name": "CultureCondition",
+ "ConditionId": "44h0cnh3vbwg76aq3xrhz68555"
+ }
+ ],
+ "Name": null,
+ "ConditionId": "4nm9a9hjkeaa01tehxyqsfsjn1"
+ }
+ },
+ {
+ "Name": "Culture fr",
+ "Rule": null,
+ "Description": null,
+ "LayerRule": {
+ "Conditions": [
+ {
+ "$type": "OrchardCore.Rules.Models.CultureCondition, OrchardCore.Rules",
+ "Value": "fr",
+ "Operation": {
+ "$type": "OrchardCore.Rules.Models.StringEqualsOperator, OrchardCore.Rules",
+ "CaseSensitive": false
+ },
+ "Name": "CultureCondition",
+ "ConditionId": "47n4c0d8abyby5ff7yn4crwtdr"
+ }
+ ],
+ "Name": null,
+ "ConditionId": "45612yd8w0jr04nvrp09qbtbwh"
+ }
+ }
+ ]
+ },
+ {
+ "name": "Settings",
+ "LayerSettings": {
+ "Zones": [
+ "Header",
+ "Messages",
+ "Breadcrumb",
+ "NavigationDrawer",
+ "Footer",
+ "IEBanner"
+ ]
+ },
+ "RegistrationSettings": {
+ "UsersCanRegister": 1,
+ "UsersMustValidateEmail": false,
+ "UsersAreModerated": false,
+ "UseSiteTheme": true,
+ "NoPasswordForExternalUsers": true,
+ "NoUsernameForExternalUsers": true,
+ "NoEmailForExternalUsers": true,
+ "UseScriptToGenerateUsername": true,
+ "GenerateUsernameScript": "//log(\"warning\", JSON.stringify(context));\r\n//log(\"warning\", context.loginProvider);\r\n\r\nif(context.loginProvider === \"GitHub\") \r\n{\r\n var claim = context.externalClaims.find(c => c.type == \"name\");\r\n if(claim.value)\r\n {\r\n let generatedUsername = claim.value;\r\n if (generatedUsername.includes(\"@\");\r\n\t{\r\n\t\tgeneratedUsername = generatedUsername.split(\"@\")[0];\r\n }\r\n context.userName = generatedUsername.toLowerCase();\r\n return;\r\n }\r\n}\r\nlog(\"warning\", \"Provider \" + context.loginProvider + \" was not handled\");\r\n"
+ },
+ "LoginSettings": {
+ "UseSiteTheme": true,
+ "UseExternalProviderIfOnlyOneDefined": false,
+ "DisableLocalLogin": false,
+ "UseScriptToSyncRoles": false,
+ "SyncRolesScript": null
+ },
+ "ResetPasswordSettings": {
+ "AllowResetPassword": true,
+ "UseSiteTheme": true
+ }
+ },
+ {
+ "name": "Roles",
+ "Roles": [
+ {
+ "Name": "Anonymous",
+ "Description": "Anonymous role",
+ "Permissions": [
+ "ViewContent"
+ ]
+ },
+ {
+ "Name": "Moderator",
+ "Description": "Moderator role",
+ "Permissions": [
+ "AccessAdminPanel",
+ "ManageOwnUserInformation",
+ "AccessAdminDashboard"
+ ]
+ },
+ {
+ "Name": "Hacker",
+ "Description": "Hackathon Hacker",
+ "Permissions": []
+ },
+ {
+ "Name": "Volunteer",
+ "Description": "Hackathon Volunteer",
+ "Permissions": []
+ },
+ {
+ "Name": "Judge",
+ "Description": "Hackathon Judge",
+ "Permissions": []
+ },
+ {
+ "Name": "Author",
+ "Description": "Author role",
+ "Permissions": [
+ "AccessAdminPanel",
+ "AccessAdminDashboard",
+ "ManageOwnUserInformation",
+ "LocalizeOwnContent",
+ "ManageMediaContent"
+ ]
+ },
+ {
+ "Name": "Contributor",
+ "Description": "Contributor role",
+ "Permissions": [
+ "PreviewOwnContent",
+ "CloneOwnContent",
+ "AccessAdminPanel",
+ "AccessAdminDashboard",
+ "ManageOwnUserInformation",
+ "LocalizeOwnContent",
+ "ManageMediaContent"
+ ]
+ },
+ {
+ "Name": "Authenticated",
+ "Description": "Authenticated role",
+ "Permissions": [
+ "ManageOwnCustomUserSettings_ParticipantProfile",
+ "ManageOwnCustomUserSettings_Hacker",
+ "ManageOwnCustomUserSettings_Volunteer"
+ ]
+ },
+ {
+ "Name": "Administrator",
+ "Description": "Administrator role",
+ "Permissions": [
+ "ManageSettings",
+ "PublishContent",
+ "EditContent",
+ "DeleteContent",
+ "PreviewContent",
+ "CloneContent",
+ "AccessContentApi",
+ "ListContent",
+ "ViewContentTypes",
+ "EditContentTypes",
+ "SetHomepage",
+ "AccessAdminPanel",
+ "ManageAdminSettings",
+ "ManageTemplates",
+ "ManageAdminTemplates",
+ "ManageUsers",
+ "ManageCultures",
+ "LocalizeContent",
+ "LocalizeOwnContent",
+ "ManageContentCulturePicker",
+ "Import",
+ "Export",
+ "ManageEmailSettings",
+ "ManageLayers",
+ "ManageMediaContent",
+ "ManageAttachedMediaFieldsFolder",
+ "ManageMediaProfiles",
+ "ViewMediaOptions",
+ "ManageMenu",
+ "ManageQueries",
+ "ManageSqlQueries",
+ "ManageRoles",
+ "SiteOwner",
+ "ApplyTheme",
+ "ManageRemoteInstances",
+ "ManageRemoteClients",
+ "ExportRemoteInstances",
+ "AccessAdminDashboard",
+ "ManageAdminDashboard",
+ "ManageAdminMenu",
+ "ManageWorkflows",
+ "ExecuteWorkflows",
+ "ManageEmailTemplates",
+ "ViewAuditTrail",
+ "ManageAuditTrailSettings"
+ ]
+ },
+ {
+ "Name": "Editor",
+ "Description": "Editor role",
+ "Permissions": [
+ "EditOwnContent",
+ "EditContent",
+ "PublishOwnContent",
+ "PublishContent",
+ "DeleteOwnContent",
+ "DeleteContent",
+ "ViewContent",
+ "ViewOwnContent",
+ "PreviewOwnContent",
+ "PreviewContent",
+ "ListContent",
+ "Publish_Page",
+ "PublishOwn_Page",
+ "Edit_Page",
+ "EditOwn_Page",
+ "Delete_Page",
+ "DeleteOwn_Page",
+ "View_Page",
+ "ViewOwn_Page",
+ "Preview_Page",
+ "PreviewOwn_Page",
+ "Clone_Page",
+ "CloneOwn_Page",
+ "ListContent_Page",
+ "Publish_SecurePage",
+ "PublishOwn_SecurePage",
+ "Edit_SecurePage",
+ "EditOwn_SecurePage",
+ "Delete_SecurePage",
+ "DeleteOwn_SecurePage",
+ "View_SecurePage",
+ "ViewOwn_SecurePage",
+ "Preview_SecurePage",
+ "PreviewOwn_SecurePage",
+ "Clone_SecurePage",
+ "CloneOwn_SecurePage",
+ "ListContent_SecurePage",
+ "Publish_HtmlDashboardWidget",
+ "PublishOwn_HtmlDashboardWidget",
+ "Edit_HtmlDashboardWidget",
+ "EditOwn_HtmlDashboardWidget",
+ "Delete_HtmlDashboardWidget",
+ "DeleteOwn_HtmlDashboardWidget",
+ "View_HtmlDashboardWidget",
+ "ViewOwn_HtmlDashboardWidget",
+ "Preview_HtmlDashboardWidget",
+ "PreviewOwn_HtmlDashboardWidget",
+ "Clone_HtmlDashboardWidget",
+ "CloneOwn_HtmlDashboardWidget",
+ "ListContent_HtmlDashboardWidget",
+ "View_VueForm",
+ "ViewOwn_VueForm",
+ "Preview_VueForm",
+ "PreviewOwn_VueForm",
+ "Publish_Challenge",
+ "PublishOwn_Challenge",
+ "Edit_Challenge",
+ "EditOwn_Challenge",
+ "Delete_Challenge",
+ "DeleteOwn_Challenge",
+ "View_Challenge",
+ "ViewOwn_Challenge",
+ "Preview_Challenge",
+ "PreviewOwn_Challenge",
+ "Clone_Challenge",
+ "CloneOwn_Challenge",
+ "ListContent_Challenge",
+ "Publish_Team",
+ "PublishOwn_Team",
+ "Edit_Team",
+ "EditOwn_Team",
+ "Delete_Team",
+ "DeleteOwn_Team",
+ "View_Team",
+ "ViewOwn_Team",
+ "Preview_Team",
+ "PreviewOwn_Team",
+ "Clone_Team",
+ "CloneOwn_Team",
+ "ListContent_Team",
+ "AccessAdminPanel",
+ "AccessAdminDashboard",
+ "ManageTemplates",
+ "ManageOwnUserInformation",
+ "View Users",
+ "ManageUsersInRole_Moderator",
+ "ManageUsersInRole_Hacker",
+ "ManageUsersInRole_Volunteer",
+ "ManageUsersInRole_Judge",
+ "ManageUsersInRole_Author",
+ "ManageUsersInRole_Contributor",
+ "ManageUsersInRole_Editor",
+ "ManageCultures",
+ "LocalizeContent",
+ "LocalizeOwnContent",
+ "ManageContentCulturePicker",
+ "ManageCustomSettings_HackathonCustomSettings",
+ "ManageLayers",
+ "ManageMediaContent",
+ "ManageMenu",
+ "AssignRole_Moderator",
+ "AssignRole_Hacker",
+ "AssignRole_Volunteer",
+ "AssignRole_Judge",
+ "AssignRole_Author",
+ "AssignRole_Contributor",
+ "AssignRole_Editor",
+ "ManageEmailTemplates"
+ ]
+ }
+ ]
+ },
+ {
+ "name": "ContentDefinition",
+ "ContentTypes": [
+ {
+ "Name": "HtmlWidget",
+ "DisplayName": "Html Widget",
+ "Settings": {
+ "ContentTypeSettings": {
+ "Stereotype": "Widget"
+ }
+ },
+ "ContentTypePartDefinitionRecords": [
+ {
+ "PartName": "HtmlBodyPart",
+ "Name": "HtmlBodyPart",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "DisplayName": "Html Body",
+ "Position": "1",
+ "Editor": "Wysiwyg"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "HackathonCustomSettings",
+ "DisplayName": "Hackathon Custom Settings",
+ "Settings": {
+ "ContentTypeSettings": {
+ "Stereotype": "CustomSettings"
+ },
+ "FullTextAspectSettings": {}
+ },
+ "ContentTypePartDefinitionRecords": [
+ {
+ "PartName": "HackathonCustomSettings",
+ "Name": "HackathonCustomSettings",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "0"
+ }
+ }
+ },
+ {
+ "PartName": "TeamCustomSettings",
+ "Name": "TeamCustomSettings",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "1"
+ }
+ }
+ },
+ {
+ "PartName": "JudgingCustomSettings",
+ "Name": "JudgingCustomSettings",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "2"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "ParticipantProfile",
+ "DisplayName": "Participant Profile",
+ "Settings": {
+ "ContentTypeSettings": {
+ "Stereotype": "CustomUserSettings"
+ },
+ "FullTextAspectSettings": {}
+ },
+ "ContentTypePartDefinitionRecords": [
+ {
+ "PartName": "ParticipantProfile",
+ "Name": "ParticipantProfile",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "ChallengeListWidget",
+ "DisplayName": "Challenge List Widget",
+ "Settings": {
+ "ContentTypeSettings": {
+ "Stereotype": "Widget"
+ }
+ },
+ "ContentTypePartDefinitionRecords": [
+ {
+ "PartName": "ChallengeListWidget",
+ "Name": "ChallengeListWidget",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "Challenge",
+ "DisplayName": "Challenge",
+ "Settings": {
+ "ContentTypeSettings": {
+ "Creatable": true,
+ "Listable": true,
+ "Draftable": true,
+ "Securable": true
+ },
+ "FullTextAspectSettings": {}
+ },
+ "ContentTypePartDefinitionRecords": [
+ {
+ "PartName": "TitlePart",
+ "Name": "TitlePart",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "0"
+ },
+ "TitlePartSettings": {
+ "Options": 2,
+ "Pattern": "{{ContentItem.Content.Challenge.Title.Text}}"
+ }
+ }
+ },
+ {
+ "PartName": "Challenge",
+ "Name": "Challenge",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "1"
+ }
+ }
+ },
+ {
+ "PartName": "MarkdownBodyPart",
+ "Name": "MarkdownBodyPart",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "DisplayName": "Markdown Body",
+ "Position": "2",
+ "Editor": "Wysiwyg"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "Team",
+ "DisplayName": "Team",
+ "Settings": {
+ "ContentTypeSettings": {
+ "Creatable": true,
+ "Listable": true,
+ "Securable": true
+ }
+ },
+ "ContentTypePartDefinitionRecords": [
+ {
+ "PartName": "TitlePart",
+ "Name": "TitlePart",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "0"
+ },
+ "TitlePartSettings": {
+ "Options": 1,
+ "Pattern": "{% assign case = ContentItem.Content.Team.Case.LocalizationSets | localization_set: 'en' | first %}\r\n{{ case | display_text | slugify }}-{{ContentItem.Content.Team.Name.Text}}-{{ ContentItem.Id }}"
+ }
+ }
+ },
+ {
+ "PartName": "Team",
+ "Name": "Team",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "1"
+ }
+ }
+ },
+ {
+ "PartName": "TeamSolutionPart",
+ "Name": "TeamSolutionPart",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "2"
+ }
+ }
+ },
+ {
+ "PartName": "EmailTemplatePart",
+ "Name": "EmailTemplatePart",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "3"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "Hacker",
+ "DisplayName": "Hacker",
+ "Settings": {
+ "ContentTypeSettings": {
+ "Stereotype": "CustomUserSettings"
+ },
+ "FullTextAspectSettings": {}
+ },
+ "ContentTypePartDefinitionRecords": [
+ {
+ "PartName": "Hacker",
+ "Name": "Hacker",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "NewsletterSubscriber",
+ "DisplayName": "Newsletter Subscriber",
+ "Settings": {
+ "ContentTypeSettings": {
+ "Creatable": true,
+ "Draftable": true,
+ "Versionable": true,
+ "Securable": true
+ },
+ "FullTextAspectSettings": {}
+ },
+ "ContentTypePartDefinitionRecords": [
+ {
+ "PartName": "NewsletterSubscriber",
+ "Name": "NewsletterSubscriber",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "HtmlPage",
+ "DisplayName": "Html Page",
+ "Settings": {
+ "ContentTypeSettings": {
+ "Creatable": true,
+ "Listable": true,
+ "Draftable": true,
+ "Versionable": true,
+ "Securable": true
+ },
+ "FullTextAspectSettings": {}
+ },
+ "ContentTypePartDefinitionRecords": [
+ {
+ "PartName": "HtmlPage",
+ "Name": "HtmlPage",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "4"
+ }
+ }
+ },
+ {
+ "PartName": "AutoroutePart",
+ "Name": "AutoroutePart",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "2"
+ },
+ "AutoroutePartSettings": {
+ "AllowCustomPath": true,
+ "ShowHomepageOption": true
+ }
+ }
+ },
+ {
+ "PartName": "HtmlBodyPart",
+ "Name": "HtmlBodyPart",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "3",
+ "Editor": "Monaco"
+ },
+ "HtmlBodyPartSettings": {},
+ "HtmlBodyPartMonacoEditorSettings": {
+ "Options": "{\r\n \"tabSize\": 2,\r\n \"automaticLayout\": true,\r\n \"language\": \"html\"\r\n}"
+ }
+ }
+ },
+ {
+ "PartName": "TitlePart",
+ "Name": "TitlePart",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "1"
+ }
+ }
+ },
+ {
+ "PartName": "LocalizationPart",
+ "Name": "LocalizationPart",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "HtmlCode",
+ "DisplayName": "HtmlCode",
+ "Settings": {
+ "ContentTypeSettings": {
+ "Stereotype": "Widget"
+ },
+ "FullTextAspectSettings": {}
+ },
+ "ContentTypePartDefinitionRecords": [
+ {
+ "PartName": "HtmlCode",
+ "Name": "HtmlCode",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "0"
+ }
+ }
+ },
+ {
+ "PartName": "HtmlBodyPart",
+ "Name": "HtmlBodyPart",
+ "Settings": {
+ "ContentTypePartSettings": {
+ "Position": "1",
+ "Editor": "Monaco"
+ },
+ "HtmlBodyPartSettings": {
+ "SanitizeHtml": false
+ },
+ "HtmlBodyPartMonacoEditorSettings": {
+ "Options": "{\r\n \"tabSize\": 2,\r\n \"automaticLayout\": true,\r\n \"language\": \"html\"\r\n}"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "ContentParts": [
+ {
+ "Name": "HackathonCustomSettings",
+ "Settings": {},
+ "ContentPartFieldDefinitionRecords": [
+ {
+ "FieldName": "DateField",
+ "Name": "StartDate",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Start Date",
+ "Position": "1"
+ }
+ }
+ },
+ {
+ "FieldName": "DateField",
+ "Name": "EndDate",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "End Date",
+ "Position": "2"
+ }
+ }
+ },
+ {
+ "FieldName": "NumericField",
+ "Name": "Capacity",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Capacity",
+ "Position": "3"
+ },
+ "NumericFieldSettings": {
+ "Hint": "The maximum number of participants. Set to 0 for unlimited",
+ "DefaultValue": "0"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "Where",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Where",
+ "Position": "0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "ParticipantProfile",
+ "Settings": {},
+ "ContentPartFieldDefinitionRecords": [
+ {
+ "FieldName": "TextField",
+ "Name": "FirstName",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "First Name",
+ "Position": "0"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "LastName",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Last Name",
+ "Position": "1"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "Email",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Contact Email",
+ "Editor": "Email",
+ "Position": "2"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "Language",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Language",
+ "Editor": "PredefinedList",
+ "Position": "3"
+ },
+ "TextFieldPredefinedListEditorSettings": {
+ "Options": [
+ {
+ "name": "English",
+ "value": "en"
+ },
+ {
+ "name": "French",
+ "value": "fr"
+ },
+ {
+ "name": "Billingual",
+ "value": "both"
+ }
+ ],
+ "DefaultValue": "en"
+ }
+ }
+ },
+ {
+ "FieldName": "BooleanField",
+ "Name": "TermsAndConditions",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Terms And Conditions",
+ "Position": "4"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "Comments",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Comments",
+ "Position": "5"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "ChallengeListWidget",
+ "Settings": {
+ "ContentPartSettings": {
+ "DisplayName": "ChallengeListWidget"
+ }
+ },
+ "ContentPartFieldDefinitionRecords": []
+ },
+ {
+ "Name": "Challenge",
+ "Settings": {},
+ "ContentPartFieldDefinitionRecords": [
+ {
+ "FieldName": "TextField",
+ "Name": "Title",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Title",
+ "Position": "0"
+ }
+ }
+ },
+ {
+ "FieldName": "MediaField",
+ "Name": "DatasetsFiles",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Datasets Files",
+ "Position": "6"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "BackgroundInformation",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Background Information",
+ "Position": "7"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "ContactPersonName",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Contact Person Name",
+ "Position": "8"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "ContactPersonEmail",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Contact Person Email",
+ "Position": "9"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "TechnicalMentorName",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Technical Mentor Name",
+ "Position": "10"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "TechnicalMentorEmail",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Technical Mentor Email",
+ "Position": "11"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "CaseSpecialistName",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Case Specialist Name",
+ "Position": "12"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "CaseSpecialistEmail",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Case Specialist Email",
+ "Position": "13"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "Comments",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Comments",
+ "Position": "14"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "Statement",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Statement",
+ "Editor": "TextArea",
+ "Position": "15"
+ },
+ "TextFieldSettings": {}
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "Datasets",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Datasets",
+ "Editor": "TextArea",
+ "Position": "16"
+ },
+ "TextFieldSettings": {}
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "OrganizationNameEn",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Organization Name En",
+ "Position": "2"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "OrganizationAcronymEn",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Organization Acronym En",
+ "Position": "3"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "OrganizationNameFr",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Organization Name Fr",
+ "Position": "4"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "OrganizationAcronymFr",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Organization Acronym Fr",
+ "Position": "5"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "Keywords",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Keywords",
+ "Position": "1"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "Team",
+ "Settings": {},
+ "ContentPartFieldDefinitionRecords": [
+ {
+ "FieldName": "TextField",
+ "Name": "Name",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Team Name",
+ "Position": "0"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "Description",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Team Description",
+ "Editor": "TextArea",
+ "Position": "1"
+ }
+ }
+ },
+ {
+ "FieldName": "ContentPickerField",
+ "Name": "Challenge",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Challenge",
+ "Position": "2"
+ },
+ "ContentPickerFieldSettings": {
+ "DisplayedContentTypes": [
+ "Challenge"
+ ]
+ }
+ }
+ },
+ {
+ "FieldName": "UserPickerField",
+ "Name": "TeamCaptain",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Team Captain",
+ "Position": "3"
+ },
+ "UserPickerFieldSettings": {
+ "DisplayedRoles": [
+ "Hacker"
+ ]
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "Hacker",
+ "Settings": {
+ "ContentPartSettings": {
+ "DisplayName": "Hacker"
+ }
+ },
+ "ContentPartFieldDefinitionRecords": [
+ {
+ "FieldName": "ContentPickerField",
+ "Name": "Team",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Team",
+ "Position": "0"
+ },
+ "ContentPickerFieldSettings": {
+ "DisplayedContentTypes": [
+ "Team"
+ ]
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "School",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "School",
+ "Position": "1"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "FieldOfStudy",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Field of Study",
+ "Position": "2"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "ProgramName",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Program Name",
+ "Position": "3"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "ProgramLevel",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "ProgramLevel",
+ "Position": "4"
+ }
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "ProgramYears",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "ProgramYears",
+ "Position": "5"
+ }
+ }
+ },
+ {
+ "FieldName": "BooleanField",
+ "Name": "Adult",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Adult",
+ "Position": "6"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Name": "NewsletterSubscriber",
+ "Settings": {},
+ "ContentPartFieldDefinitionRecords": [
+ {
+ "FieldName": "TextField",
+ "Name": "Email",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Email",
+ "Editor": "Email",
+ "Position": "0"
+ },
+ "TextFieldSettings": {}
+ }
+ },
+ {
+ "FieldName": "TextField",
+ "Name": "Name",
+ "Settings": {
+ "ContentPartFieldSettings": {
+ "DisplayName": "Name",
+ "Position": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Content",
+ "data": [
+ {
+ "ContentItemId": "4p0tnav2bd74gxb78t6ka5h7mt",
+ "ContentItemVersionId": "4bkyd0w5h5a3jz07mtkv12zhdf",
+ "ContentType": "VAppBar",
+ "DisplayText": "App Bar",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-07-12T20:17:33.5328933Z",
+ "PublishedUtc": "2021-07-12T20:17:33.5574603Z",
+ "CreatedUtc": "2021-07-12T20:17:33.5155676Z",
+ "Owner": "4131s49tp1mde1k2djp405v4c2",
+ "Author": "candev_adm",
+ "VAppBar": {
+ "Props": {
+ "Values": []
+ },
+ "Color": {
+ "Text": null
+ },
+ "Elevation": {
+ "Value": null
+ },
+ "ExtensionHeight": {
+ "Value": null
+ },
+ "ScrollThreshold": {
+ "Value": null
+ },
+ "BackgroundImage": {
+ "Paths": [],
+ "MediaTexts": []
+ },
+ "Height": {
+ "Value": null
+ },
+ "Width": {
+ "Value": null
+ }
+ },
+ "LayerMetadata": {
+ "Position": 1.0,
+ "Zone": "Header",
+ "RenderTitle": false,
+ "Layer": "All"
+ }
+ },
+ {
+ "ContentItemId": "4svs8ansz1p6p0kzxmk54y6pm8",
+ "ContentItemVersionId": "4ds6vnw6cdcv35asmqvxv4h9dz",
+ "ContentType": "VNavigationDrawer",
+ "DisplayText": "Navigation Drawer",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-07-12T20:17:33.5817536Z",
+ "PublishedUtc": "2021-07-12T20:17:33.5820276Z",
+ "CreatedUtc": "2021-07-12T20:17:33.5815139Z",
+ "Owner": "4131s49tp1mde1k2djp405v4c2",
+ "Author": "candev_adm",
+ "VNavigationDrawer": {
+ "Props": {
+ "Values": [
+ "clipped"
+ ]
+ },
+ "BackgroundImage": {
+ "Paths": [],
+ "MediaTexts": []
+ },
+ "Color": {
+ "Text": null
+ },
+ "MiniVariantWidth": {
+ "Value": null
+ },
+ "MobileBreakpoint": {
+ "Value": null
+ },
+ "OverlayColor": {
+ "Text": null
+ },
+ "OverlayOpacity": {
+ "Value": null
+ },
+ "Height": {
+ "Value": null
+ },
+ "Width": {
+ "Value": null
+ }
+ },
+ "LayerMetadata": {
+ "Position": 1.0,
+ "Zone": "NavigationDrawer",
+ "RenderTitle": false,
+ "Layer": "All"
+ }
+ },
+ {
+ "ContentItemId": "4r2p7x8f1z775xww8na4q9g4ng",
+ "ContentItemVersionId": "48ejed9pbfnhh2wfw0agt5hp53",
+ "ContentType": "VFooter",
+ "DisplayText": "VFooter en",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-07-30T19:29:31.2293734Z",
+ "PublishedUtc": "2021-07-30T19:29:31.2703198Z",
+ "CreatedUtc": "2021-05-27T14:22:03.6374771Z",
+ "Owner": "4yzqdjmaxdfed4c0v9vwjhw0c6",
+ "Author": "OG",
+ "VFooter": {
+ "Height": {
+ "Value": null
+ },
+ "Width": {
+ "Value": null
+ },
+ "Color": {
+ "Text": null
+ },
+ "Props": {
+ "Values": [
+ "absolute",
+ "app",
+ "inset"
+ ]
+ }
+ },
+ "FlowPart": {
+ "Widgets": [
+ {
+ "ContentItemId": "4tjzzem2bhmgcysh728casasny",
+ "ContentItemVersionId": null,
+ "ContentType": "HtmlCode",
+ "DisplayText": "",
+ "Latest": false,
+ "Published": false,
+ "ModifiedUtc": "2021-07-30T19:29:31.2414701Z",
+ "PublishedUtc": null,
+ "CreatedUtc": null,
+ "Owner": "",
+ "Author": "OG",
+ "HtmlCode": {},
+ "HtmlBodyPart": {
+ "Html": "\r\n \r\n
\r\n Follow us using #CANDEV \r\n \r\n mdi-linkedin \r\n \r\n \r\n mdi-twitter \r\n \r\n \r\n mdi-facebook \r\n \r\n \r\n mdi-instagram \r\n \r\n \r\n mdi-youtube \r\n \r\n
\r\n
\r\n \r\n \r\n"
+ },
+ "WidgetStylingPart": {
+ "CustomClasses": null
+ },
+ "@WeldedPartSettings": {
+ "WidgetStylingPart": {}
+ },
+ "FlowMetadata": {
+ "Alignment": 3,
+ "Size": 100
+ }
+ },
+ {
+ "ContentItemId": "44tbqvktm4pkxxavghysdhfr51",
+ "ContentItemVersionId": null,
+ "ContentType": "FIP",
+ "DisplayText": "",
+ "Latest": false,
+ "Published": false,
+ "ModifiedUtc": "2021-07-30T19:29:31.2526522Z",
+ "PublishedUtc": null,
+ "CreatedUtc": null,
+ "Owner": "",
+ "Author": "OG",
+ "FIP": {
+ "Props": {
+ "Values": [
+ "fixed"
+ ]
+ }
+ },
+ "WidgetStylingPart": {
+ "CustomClasses": null
+ },
+ "@WeldedPartSettings": {
+ "WidgetStylingPart": {}
+ },
+ "FlowMetadata": {
+ "Alignment": 3,
+ "Size": 100
+ }
+ }
+ ]
+ },
+ "LayerMetadata": {
+ "RenderTitle": false,
+ "Position": 0.5,
+ "Zone": "Footer",
+ "Layer": "Culture en"
+ }
+ },
+ {
+ "ContentItemId": "48f3d048f5fm02cdncaxs6715x",
+ "ContentItemVersionId": "4ye093jjxh5tj72nbdhz46t5mq",
+ "ContentType": "VFooter",
+ "DisplayText": "VFooter fr",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-07-30T19:08:34.271533Z",
+ "PublishedUtc": "2021-07-30T19:08:34.3027376Z",
+ "CreatedUtc": "2021-07-19T18:17:52.7241871Z",
+ "Owner": "4kqzqqj2zvb5c2z69mxscca9nj",
+ "Author": "OG",
+ "VFooter": {
+ "Height": {
+ "Value": null
+ },
+ "Width": {
+ "Value": null
+ },
+ "Color": {
+ "Text": null
+ },
+ "Props": {
+ "Values": [
+ "absolute",
+ "app",
+ "inset"
+ ]
+ }
+ },
+ "FlowPart": {
+ "Widgets": [
+ {
+ "ContentItemId": "4tjzzem2bhmgcysh728casasny",
+ "ContentItemVersionId": null,
+ "ContentType": "HtmlCode",
+ "DisplayText": "",
+ "Latest": false,
+ "Published": false,
+ "ModifiedUtc": "2021-07-30T19:08:34.2825303Z",
+ "PublishedUtc": null,
+ "CreatedUtc": null,
+ "Owner": "",
+ "Author": "OG",
+ "HtmlCode": {},
+ "HtmlBodyPart": {
+ "Html": "\r\n \r\n
\r\n Suivez-nous avec #CANDEV \r\n \r\n mdi-linkedin \r\n \r\n \r\n mdi-twitter \r\n \r\n \r\n mdi-facebook \r\n \r\n \r\n mdi-instagram \r\n \r\n \r\n mdi-youtube \r\n \r\n
\r\n
\r\n \r\n "
+ },
+ "WidgetStylingPart": {
+ "CustomClasses": null
+ },
+ "@WeldedPartSettings": {
+ "WidgetStylingPart": {}
+ },
+ "FlowMetadata": {
+ "Alignment": 3,
+ "Size": 100
+ }
+ },
+ {
+ "ContentItemId": "44tbqvktm4pkxxavghysdhfr51",
+ "ContentItemVersionId": null,
+ "ContentType": "FIP",
+ "DisplayText": "",
+ "Latest": false,
+ "Published": false,
+ "ModifiedUtc": "2021-07-30T19:08:34.2893608Z",
+ "PublishedUtc": null,
+ "CreatedUtc": null,
+ "Owner": "",
+ "Author": "OG",
+ "FIP": {
+ "Props": {
+ "Values": [
+ "fixed"
+ ]
+ }
+ },
+ "WidgetStylingPart": {
+ "CustomClasses": null
+ },
+ "@WeldedPartSettings": {
+ "WidgetStylingPart": {}
+ },
+ "FlowMetadata": {
+ "Alignment": 3,
+ "Size": 100
+ }
+ }
+ ]
+ },
+ "LayerMetadata": {
+ "RenderTitle": false,
+ "Position": 1.0,
+ "Zone": "Footer",
+ "Layer": "Culture fr"
+ }
+ },
+ {
+ "ContentItemId": "4dh7v2kwrt28m07ra0rzewedm1",
+ "ContentItemVersionId": "4y1cp4eavt22nyrgtft9pn13wb",
+ "ContentType": "HtmlCode",
+ "DisplayText": "Padding",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-07-28T01:48:03.9405064Z",
+ "PublishedUtc": "2021-07-28T01:48:03.9593977Z",
+ "CreatedUtc": "2021-07-28T01:14:53.3788932Z",
+ "Owner": "4131s49tp1mde1k2djp405v4c2",
+ "Author": "candev_adm",
+ "HtmlCode": {},
+ "HtmlBodyPart": {
+ "Html": " "
+ },
+ "LayerMetadata": {
+ "RenderTitle": false,
+ "Position": 0.0,
+ "Zone": "Footer",
+ "Layer": "All"
+ }
+ }
+ ]
+ },
+ {
+ "name": "deployment",
+ "Plans": [
+ {
+ "Name": "Complete Export",
+ "Steps": [
+ {
+ "Type": "AllFeaturesDeploymentStep",
+ "Step": {
+ "IgnoreDisabledFeatures": false,
+ "Id": "9e25ba96e6ea422cb6fd7e898a41f1ab",
+ "Name": "AllFeatures"
+ }
+ },
+ {
+ "Type": "AllQueriesDeploymentStep",
+ "Step": {
+ "Id": "1102d2d05dbe42dcae657456f3901273",
+ "Name": "AllQueries"
+ }
+ },
+ {
+ "Type": "AllLayersDeploymentStep",
+ "Step": {
+ "Id": "a70b516976024453a8b6d39231f77dbc",
+ "Name": "AllLayers"
+ }
+ },
+ {
+ "Type": "AllRolesDeploymentStep",
+ "Step": {
+ "Id": "d68e4e2edc6b431d9b8ec04772847452",
+ "Name": "AllRoles"
+ }
+ },
+ {
+ "Type": "AllWorkflowTypeDeploymentStep",
+ "Step": {
+ "Id": "8542c401341546b5b7845578c121930d",
+ "Name": "AllWorkflowType"
+ }
+ },
+ {
+ "Type": "ContentDefinitionDeploymentStep",
+ "Step": {
+ "IncludeAll": false,
+ "ContentTypes": [
+ "Challenge",
+ "ChallengeListWidget",
+ "HackathonCustomSettings",
+ "Hacker",
+ "HtmlCode",
+ "HtmlPage",
+ "HtmlWidget",
+ "NewsletterSubscriber",
+ "ParticipantProfile",
+ "Team"
+ ],
+ "ContentParts": [
+ "Challenge",
+ "ChallengeListWidget",
+ "HackathonCustomSettings",
+ "Hacker",
+ "HtmlCode",
+ "HtmlPage",
+ "NewsletterSubscriber",
+ "ParticipantProfile",
+ "Team"
+ ],
+ "Id": "179a50fd6e7b4cb28589cd32c407909c",
+ "Name": "ContentDefinition"
+ }
+ },
+ {
+ "Type": "AllContentDeploymentStep",
+ "Step": {
+ "ExportAsSetupRecipe": false,
+ "Id": "3cf5982dc5f14e14ae586691a28f8ac0",
+ "Name": "AllContent"
+ }
+ },
+ {
+ "Type": "DeploymentPlanDeploymentStep",
+ "Step": {
+ "IncludeAll": true,
+ "DeploymentPlanNames": [],
+ "Id": "25bb7ed20e6c4a17a3b0e5fb9e634844",
+ "Name": "DeploymentPlan"
+ }
+ },
+ {
+ "Type": "AllTemplatesDeploymentStep",
+ "Step": {
+ "ExportAsFiles": true,
+ "Id": "c728c35777f44eeaa16ac3e1d3b7b79b",
+ "Name": "AllTemplates"
+ }
+ },
+ {
+ "Type": "AllEmailTemplatesDeploymentStep",
+ "Step": {
+ "Id": "91385070e6224e1e80135218072f7351",
+ "Name": "AllEmailTemplates"
+ }
+ },
+ {
+ "Type": "RegistrationSettings_SiteSettingsPropertyDeploymentStep",
+ "Step": {
+ "Id": "87ece5cb54b647b08c0d1728a6f09680",
+ "Name": "RegistrationSettings_SiteSettingsPropertyDeploymentStep"
+ }
+ },
+ {
+ "Type": "LoginSettings_SiteSettingsPropertyDeploymentStep",
+ "Step": {
+ "Id": "5100802f45644a16b1e615403093e10a",
+ "Name": "LoginSettings_SiteSettingsPropertyDeploymentStep"
+ }
+ },
+ {
+ "Type": "SiteSettingsDeploymentStep",
+ "Step": {
+ "Settings": [
+ "HomeRoute"
+ ],
+ "Id": "77f5b6d18f7a4ccfa64ec11e95e27d83",
+ "Name": "SiteSettings"
+ }
+ },
+ {
+ "Type": "ResetPasswordSettings_SiteSettingsPropertyDeploymentStep",
+ "Step": {
+ "Id": "9009eac8fe854348acd3871361c28db0",
+ "Name": "ResetPasswordSettings_SiteSettingsPropertyDeploymentStep"
+ }
+ },
+ {
+ "Type": "AllShortcodeTemplatesDeploymentStep",
+ "Step": {
+ "Id": "559237a7789943448b0ba1b9994f542f",
+ "Name": "AllShortcodeTemplates"
+ }
+ },
+ {
+ "Type": "AdminMenuDeploymentStep",
+ "Step": {
+ "Id": "04cb826d5910436db163b451785e12c4",
+ "Name": "AdminMenu"
+ }
+ },
+ {
+ "Type": "CustomSettingsDeploymentStep",
+ "Step": {
+ "IncludeAll": false,
+ "SettingsTypeNames": [
+ "VuetifyThemeSettings",
+ "HackathonCustomSettings"
+ ],
+ "Id": "1849fcc75dc84947bea99c03e1e99ad0",
+ "Name": "CustomSettings"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Settings",
+ "HomeRoute": {
+ "Area": "OrchardCore.Contents",
+ "Controller": "Item",
+ "Action": "Display",
+ "contentItemId": "475f0691gd0yq11bs110ez4q5s",
+ "jsonPath": ""
+ }
+ },
+ {
+ "name": "ShortcodeTemplates",
+ "ShortcodeTemplates": {
+ "col": {
+ "Content": "{% capture cols -%}\r\n{%- if Args['cols'] != blank -%}\r\ncols=\"{{ Args['cols'] }}\"\r\n{% elsif Args[0] != blank %}\r\ncols=\"{{ Args[0] }}\"\r\n{% endif %}\r\n{% endcapture -%}\r\n{% capture class -%}\r\n{%- if Args['class'] != blank -%}\r\nclass=\"{{ Args['class'] }}\"\r\n{%- endif -%}\r\n{% endcapture -%}\r\n{{ Content | raw }} ",
+ "Hint": "Renders a column. to be used inside a [row] shortcode. Please see the https://vuetifyjs.com/en/api/v-col/#api-props docs for available properties. The cols property can be passed as the first argument",
+ "Usage": "[col 12 md=8 lg=6][/col]",
+ "DefaultValue": "[col][/col]",
+ "Categories": [
+ "HTML Content"
+ ]
+ },
+ "row": {
+ "Content": "{% capture class -%}\r\n{%- if Args['class'] != blank -%}\r\nclass=\"{{ Args['class'] }}\"\r\n{%- endif -%}\r\n{% endcapture -%}\r\n{{ Content | raw }} ",
+ "Hint": "Renders a row. Please see the https://vuetifyjs.com/en/api/v-row/#api-props docs for available properties.",
+ "Usage": "[row][/row]",
+ "DefaultValue": "[row][/row]",
+ "Categories": [
+ "HTML Content"
+ ]
+ },
+ "container": {
+ "Content": "{% capture class -%}\r\n{%- if Args['class'] != blank -%}\r\nclass=\"{{ Args['class'] }}\"\r\n{%- endif -%}\r\n{% endcapture -%}\r\n{{ Content | raw }} ",
+ "Hint": "Renders a container. Please see the https://vuetifyjs.com/en/api/v-container/#api-props docs for available properties.",
+ "Usage": "[container][/container]",
+ "DefaultValue": "[container][/container]",
+ "Categories": [
+ "HTML Content"
+ ]
+ },
+ "spacer": {
+ "Content": " ",
+ "Hint": "renders a v-spacer. See https://vuetifyjs.com/en/components/grids/#v-spacer for docs.",
+ "Usage": "[spacer]",
+ "DefaultValue": "[spacer]",
+ "Categories": []
+ },
+ "alias": {
+ "Content": "{% assign my_content = Content.Alias[Args[0]] %}\r\n\r\n{{ my_content | shape_build_display | shape_render }}",
+ "Hint": "Renders an item with the alias",
+ "Usage": "[alias 'item-alias']",
+ "DefaultValue": "[alias '']",
+ "Categories": [
+ "HTML Content"
+ ]
+ },
+ "hackathon_calendar": {
+ "Content": "\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n {% if Culture.Name == 'en' %}\r\n {{ Site.Properties.HackathonCustomSettings.HackathonCustomSettings.StartDate.Value | date:\"%b %e\" }}\r\n {% else %}\r\n {{ Site.Properties.HackathonCustomSettings.HackathonCustomSettings.StartDate.Value | date:\"%e %b\" }}\r\n {% endif %}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ Site.Properties.HackathonCustomSettings.HackathonCustomSettings.StartDate.Value | date:\"%Y\" }}\r\n \r\n \r\n \r\n \r\n\r\n mdi-chevron-right \r\n \r\n \r\n \r\n \r\n \r\n {% if Culture.Name == 'en' %}\r\n {{ Site.Properties.HackathonCustomSettings.HackathonCustomSettings.EndDate.Value | date:\"%b %e\" }}\r\n {% else %}\r\n {{ Site.Properties.HackathonCustomSettings.HackathonCustomSettings.EndDate.Value | date:\"%e %b\" }}\r\n {% endif %}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ Site.Properties.HackathonCustomSettings.HackathonCustomSettings.EndDate.Value | date:\"%Y\" }}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n mdi-map-marker {{Site.Properties.HackathonCustomSettings.HackathonCustomSettings.Where.Text | shortcode}}\r\n \r\n
",
+ "Hint": "Renders a calendar that used the HackathonCustomSettings dates ",
+ "Usage": "[hackathon_calendar]",
+ "DefaultValue": "[hackathon_calendar]",
+ "Categories": [
+ "HTML Content"
+ ]
+ }
+ }
+ },
+ {
+ "name": "AdminMenu",
+ "data": [
+ {
+ "Id": "18826493df934cf997f2fe985aca0f17",
+ "Name": "Editor Menu",
+ "Enabled": true,
+ "MenuItems": [
+ {
+ "$type": "OrchardCore.AdminMenu.AdminNodes.LinkAdminNode, OrchardCore.AdminMenu",
+ "LinkText": "Hackathon Settings",
+ "LinkUrl": "~/Admin/Settings/HackathonCustomSettings",
+ "IconClass": "fas fa-hammer",
+ "PermissionNames": [
+ "ManageCustomSettings_HackathonCustomSettings"
+ ],
+ "UniqueId": "622ffad08e1f468293f2a1ee71f70fcb",
+ "Enabled": true,
+ "Text": null,
+ "Id": null,
+ "Href": null,
+ "Url": null,
+ "Position": null,
+ "Priority": 0,
+ "LinkToFirstChild": true,
+ "LocalNav": false,
+ "Culture": null,
+ "Items": [],
+ "Classes": []
+ },
+ {
+ "$type": "OrchardCore.AdminMenu.AdminNodes.PlaceholderAdminNode, OrchardCore.AdminMenu",
+ "LinkText": "Content",
+ "IconClass": null,
+ "PermissionNames": [
+ "EditOwnContent"
+ ],
+ "UniqueId": "5ae465832b09468496ff09c3a39af8fb",
+ "Enabled": true,
+ "Text": null,
+ "Id": null,
+ "Href": null,
+ "Url": null,
+ "Position": null,
+ "Priority": 0,
+ "LinkToFirstChild": true,
+ "LocalNav": false,
+ "Culture": null,
+ "Items": [
+ {
+ "$type": "OrchardCore.Contents.AdminNodes.ContentTypesAdminNode, OrchardCore.Contents",
+ "ShowAll": false,
+ "IconClass": null,
+ "ContentTypes": [
+ {
+ "ContentTypeId": "Challenge",
+ "IconClass": null
+ },
+ {
+ "ContentTypeId": "HtmlPage",
+ "IconClass": null
+ },
+ {
+ "ContentTypeId": "Page",
+ "IconClass": null
+ },
+ {
+ "ContentTypeId": "SecurePage",
+ "IconClass": null
+ },
+ {
+ "ContentTypeId": "Team",
+ "IconClass": null
+ }
+ ],
+ "UniqueId": "2e126b0cb9f74f43ab77d907b9fcb146",
+ "Enabled": true,
+ "Text": null,
+ "Id": null,
+ "Href": null,
+ "Url": null,
+ "Position": null,
+ "Priority": 0,
+ "LinkToFirstChild": true,
+ "LocalNav": false,
+ "Culture": null,
+ "Items": [],
+ "Classes": []
+ }
+ ],
+ "Classes": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Recipes/ChallengeSubmissionForm.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Recipes/ChallengeSubmissionForm.recipe.json
new file mode 100644
index 000000000..e2648775a
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Recipes/ChallengeSubmissionForm.recipe.json
@@ -0,0 +1,348 @@
+{
+ "name": "Candev.ChallengeSubmissionForm",
+ "displayName": "Challenge Submission Form",
+ "description": "Creates a form that can be used by users to submit a challenge",
+ "author": "StatCan Digital Innovation",
+ "website": "digital.statcan.gc.ca",
+ "version": "1.0.0",
+ "issetuprecipe": false,
+ "categories": [],
+ "tags": [],
+ "steps": [
+ {
+ "name": "Content",
+ "data": [
+ {
+ "ContentItemId": "4kpgcnkaydrkb5hfxy10261qmb",
+ "ContentItemVersionId": "42k5f77wkg134vrt0ka0agetx6",
+ "ContentType": "VueForm",
+ "DisplayText": "Challenge Submission",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-07-30T15:13:34.1968979Z",
+ "PublishedUtc": "2021-07-30T15:13:34.2293109Z",
+ "CreatedUtc": "2021-04-23T16:36:01.9117576Z",
+ "Owner": "[js: parameters('AdminUserId')]",
+ "Author": "[js: parameters('AdminUsername')]",
+ "TitlePart": {
+ "Title": "Challenge Submission"
+ },
+ "VueForm": {
+ "Enabled": {
+ "Value": true
+ },
+ "DisabledHtml": {
+ "Html": "\n [locale en]The challenge submission form is currently disabled.[/locale]\n [locale fr]Le formulaire de soumission de défi est présentement désactivé[/locale]\n
"
+ },
+ "SuccessMessage": {
+ "Text": "{{ \"successMessage\" | localize }}"
+ },
+ "ErrorMessage": {
+ "Text": "Please correct the errors above"
+ },
+ "RenderAs": {
+ "Text": null
+ },
+ "Template": {
+ "Text": "{% assign challengeId = Request.Query['id'] %}\r\n{% assign challenge = Content.ContentItemVersionId[challengeId] %}\r\n\r\n\r\n \r\n \r\n{% if User.Identity.Name == null %}\r\n \r\n [locale en]Please login before submitting a challenge[/locale]\r\n [locale fr]Veuillez vous connecter avant de soumettre un défi[/locale]\r\n \r\n{% else %}\r\n \r\n\t\t \r\n \r\n \r\n \r\n !obs.errors.title.length != 0]\">\r\n [locale en]Title[/locale][locale fr]Titre[/locale]\r\n \r\n \t \r\n \t\t\r\n \t\t [locale en]Choose a title for your user case[/locale][locale fr]Choisissez un titre pour votre défi[/locale]
\r\n \t \t\t \r\n \t\t\r\n \t\t \r\n\t\t\t\t\r\n \t\t [locale en]Tips and examples[/locale]\r\n [locale fr]Trucs et exemples[/locale] \r\n \t\t\t
\r\n \r\n\t\t\t\t\r\n [locale en]\r\n Select a catchy title that aligns with the subject matter to refer to your data challenge. The title, along with your organization name,\r\n will be used after the event to promote the solutions developed by the students. \r\n \r\n Examples (taken from previous events): \r\n\t\t\t\t - Government points of service finder for new immigrants \r\n\t\t\t\t - Boosting Northern Lights beauty \r\n\t\t\t\t - Analyzing trends in data experts labour market\r\n [/locale]\r\n [locale fr]\r\n Choisissez un titre accrocheur en rapport avec le sujet pour faire référence à votre défi des données.\r\n Le titre, ainsi que le nom de votre organisation, seront utilisés après l'événement pour promouvoir les solutions développées par les étudiants. \r\n \r\n Exemples (tirés d'événements précédents): \r\n - Recherche de points de service gouvernementaux pour les nouveaux immigrants \r\n - Améliorer la beauté des aurores boréales \r\n - Analyser les tendances du marché du travail des experts en données\r\n [/locale]\r\n
\r\n \t \t\t \r\n \t\t \r\n \t\t \r\n \t\t \r\n \t\t \r\n \t \r\n \t\t \r\n \t\t \r\n \t\t [locale en]Continue[/locale][locale fr]Continuer[/locale] \r\n \t\t \r\n \t \r\n \r\n \r\n \t \r\n \t\t[locale en]Statement[/locale][locale fr]Énoncé[/locale]\r\n \t \r\n \t \r\n \r\n\t\t\t\r\n \t\t \r\n [locale en]In 1-2 sentences, briefly explain the business case that needs to be solved and the desired outcomes[/locale]\r\n [locale fr]En une ou deux phrases, expliquez brièvement l’étude de cas qui doit être résolu, ainsi que les résultats souhaités.[/locale] \r\n
\r\n \t \t\t \r\n \r\n \t\t \r\n\t\t\t\t\r\n \t\t [locale en]Tips and examples[/locale]\r\n [locale fr]Trucs et exemples[/locale]\r\n \t\t\t
\r\n \r\n \r\n [locale en] \r\n\t\t\t\t The challenge statement can be written like a \"user story\" to emulate an IT project requirement. Here is a generic template: \r\n\t\t\t\t - As a ˂role˃, I can ˂goal/need˃, so that ˂why˃; or \r\n\t\t\t\t - As a ˂particular class of user˃, I want to ˂be able to perform/do something˃, so that ˂I get some form of value or benefit˃. \r\n\t\t\t\t \r\n Examples: \r\n\t\t\t\t - As a new immigrant, I want to be able to find in one tool all the governmental points of service, as well as how to get there and other useful information. \r\n\t\t\t\t - As a scientist, I want to be able to identify the Northern Lights with greater precision, so that I can improve the forecasting of this phenomenon. \r\n\t\t\t\t - As a senior manager for Innovation, Science and Economic Development Canada (ISED), I want to analyze trends in the private sector for hiring data scientists (e.g. starting salary, employment status, etc.) compared with the Government of Canada's practices in order to better align ISED's recruitment strategies. \r\n [/locale]\r\n [locale fr]\r\n L'énoncé du défi des données peut être écrit comme une \"histoire d'utilisateur\" pour émuler une exigence de projet informatique. Voici un modèle générique : \r\n - En tant que ˂rôle˃, je peux ˂but/besoin˃, de sorte que ˂quoi˃ ; ou. \r\n - En tant qu’˂utilisateurs˃, je veux ˂être capable d'effectuer/faire quelque chose˃, de sorte que ˂je reçoive une certaine forme de valeur ou de bénéfice˃. \r\n \r\n Exemples : \r\n - En tant que nouvel immigrant, je veux pouvoir trouver dans un seul outil tous les points de service gouvernementaux, ainsi que la manière de s'y rendre et d'autres informations utiles. \r\n - En tant que scientifique, je veux pouvoir identifier les aurores boréales avec plus de précision, afin d'améliorer la prévision de ce phénomène. \r\n - En tant que cadre supérieur pour Innovation, Sciences et Développement économique Canada (ISDE), je veux analyser les tendances du secteur privé en matière d'embauche de scientifiques des données (p. ex. salaire de départ, statut d'emploi, etc.) par rapport aux pratiques du gouvernement du Canada, afin de mieux harmoniser les stratégies de recrutement de l'ISDE.\r\n [/locale] \r\n
\r\n \r\n \t\t \r\n \r\n \t\t \r\n\t\t\t \r\n \r\n \t\t [locale en]Continue[/locale][locale fr]Continuer[/locale] \r\n \r\n \t \r\n \r\n \r\n \t \r\n \t\t[locale en]Datasets[/locale][locale fr]Données[/locale]\r\n \t \r\n \t \r\n \r\n \r\n \t\t \r\n [locale en]Provide hyperlinked datasets and complementary documentation that students will use to develop their solutions. Alternatively, you can attach the files.[/locale]\r\n [locale fr]Fournissez des hyperliens vers les ensembles de données et la documentation complémentaire que les élèves utiliseront pour développer une solution. Au besoin, vous pouvez également joindre les fichiers.[/locale] \r\n
\r\n \t \t\t \r\n \r\n \t\t \r\n [locale en]\r\n ONLY open source data can be used throughout the Challenge and NO confidential information can be included in the datasets that your organization provides.\r\n\t\t\t [/locale en]\r\n [locale fr]\r\n Aucune information confidentielle ne doit être fournie.\r\n [/locale fr]\r\n \r\n \t\t \r\n \r\n \t\t \r\n\t\t\t\t\r\n \t\t [locale en]Tips and examples[/locale]\r\n [locale fr]Trucs et exemples[/locale]\r\n \t\t\t
\r\n \r\n \r\n [locale en]\r\n Examples: \r\n\t\t\t\t - Links to websites providing information on government services to be included in the solution, such as the Living in Canada application for new immigrants, how to get a Social Insurance Number, how to apply for a driver's license, etc. \r\n\t\t\t\t - Specific datasets on space weather, satellite imagery, extraordinary meteorological phenomenon, etc. from government and academic sources. \r\n\t\t\t\t - Demographic datasets such as reports from the Employee Exit Survey for ISED and the Public Service Employee Survey for ISED.\r\n \t \t\t \t [/locale]\r\n [locale fr]\r\n Exemples: \r\n - Liens vers des sites Web fournissant des informations sur les services gouvernementaux à inclure dans la solution, tels que le formulaire Vivre au Canada pour les nouveaux immigrants, comment obtenir un numéro d'assurance sociale, comment demander un permis de conduire, etc. \r\n - Des ensembles de données spécifiques sur la météo spatiale, l'imagerie satellite, les phénomènes météorologiques extraordinaires, etc. provenant de sources gouvernementales et universitaires. \r\n - Des ensembles de données démographiques tels que les rapports de l'enquête sur les départs des employés de l'ISDE et de l'enquête sur les employés de la fonction publique de l'ISDE.\r\n [/locale]\r\n\t\t\t\t
\r\n \t \r\n \t\t \r\n \r\n \t \t \t \r\n \r\n \r\n \t\t \r\n [locale en]\r\n Please select all files at once.\r\n\t\t\t [/locale en]\r\n [locale fr]\r\n Veuillez sélectionner tous les fichiers d'un seul coup.\r\n [/locale fr]\r\n \r\n \t\t \r\n \t\t\t\t\r\n \r\n \r\n \r\n {% for file in challenge.ContentItem.Content.Challenge.DatasetsFiles.Paths %}\r\n\t\t {{ file | remove: \"challenge/\" }} \r\n\t {% endfor %}\r\n \r\n \r\n \t \t [locale en]Continue[/locale][locale fr]Continuer[/locale] \r\n \r\n \t \r\n \r\n \r\n \t \r\n \t\t[locale en]Background Information[/locale][locale fr]Information de référence[/locale]\r\n \t \r\n \t \r\n\t\t\t \r\n \r\n \t\t \r\n [locale en] \r\n This information will be kept from students until the mentorship session,\r\n where the mentor that represents your department will be introducing the case and all of the support material to students. \r\n [/locale]\r\n [locale fr]\r\n Ces informations ne seront pas communiquées aux étudiants jusqu'à la session de mentorat, au cours de laquelle le mentor représentant votre organisation présentera le cas et tout le matériel pertinent aux étudiants.\r\n [/locale]\r\n
\r\n \t \t\t \r\n \r\n \t\t \r\n\t\t\t\t\r\n \t\t [locale en]Tips and examples[/locale]\r\n [locale fr]Trucs et exemples[/locale]\r\n \t\t\t
\r\n \r\n \r\n [locale en]\r\n Describe the current state in which the problem or opportunity exists, considering: \r\n\t\t\t\t\t- Stakeholders and users \r\n\t\t\t\t\t- Business processes \r\n\t\t\t\t\t- Paths already explored \r\n\t\t\t\t\t- Technological limitations \r\n \r\n\t\t\t\t Examples: \r\n\t\t\t\t\t- Specific information to be included about each point of service such as the types of services offered, GPS coordinates and useful links. \r\n\t\t\t\t\t- Description of how the provided technical datasets are created by satellite imaging, description of current problems with analysis of these datasets, adequate scientific context so that the problem can be understood by someone without background knowledge of space science. \r\n\t\t\t\t\t- Background on ISED's mandate and activities, desired use of tool in context of strategic planning. \t\r\n [/locale]\r\n [locale fr]\r\n Décrire l'état actuel dans lequel se trouve le problème ou l'opportunité, en tenant compte des éléments suivants: \r\n - Les parties prenantes et les utilisateurs \r\n - Les processus d'affaires \r\n - Les voies déjà explorées \r\n - Les limites technologiques \r\n \r\n Exemples : \r\n - Informations spécifiques à inclure sur chaque point de service, telles que les types de services offerts, les coordonnées GPS et les liens utiles. \r\n - Description de la manière dont les ensembles de données techniques fournis sont créés par l'imagerie satellitaire, description des problèmes actuels d'analyse de ces ensembles de données, contexte scientifique adéquat pour que le problème puisse être compris par une personne n'ayant pas de connaissances préalables en sciences spatiales. \r\n - Contexte du mandat et des activités de l'ISDE, et utilisation souhaitée de l'outil dans le contexte de la planification stratégique.\r\n [/locale]\r\n
\r\n \t \r\n \t\t \r\n \r\n \t \t \t \r\n \r\n \r\n \t\t [locale en]Continue[/locale][locale fr]Continuer[/locale] \r\n \r\n \t \r\n \r\n \r\n \t \r\n \t\t[locale en]Keywords[/locale][locale fr]Mots clés[/locale]\r\n \t \r\n \t \r\n\t\t\t \r\n \r\n \t\t \r\n [locale en]Keywords[/locale][locale fr]Mots clés[/locale] \r\n
\r\n \t \t\t \r\n \r\n \t\t \r\n\t\t\t\t\r\n \t\t [locale en]Tips and examples[/locale]\r\n [locale fr]Trucs et exemples[/locale]\r\n \t\t\t
\r\n \r\n \r\n [locale en]\r\n The keywords will help the CANDEV team assign a topic to your challenge. Participating students will be asked to rank all topics, determining which case they will solve. Our case assignment process ensures that an equal number of teams will solve your challenge. Keywords can be related to the theme of your challenge (e.g. agriculture, energy, space, etc.) or to an area of expertise (e.g. text classification, database architecture, data analysis, etc.). \t\r\n [/locale]\r\n [locale fr]\r\n Les mots-clés aideront l'équipe CANDEV à assigner un sujet à votre défi. Les étudiants participants seront invités à classer tous les sujets, déterminant ainsi le cas qu'ils auront à résoudre. Notre processus d'attribution des cas assure qu'un nombre égal d'équipes résoudra votre défi.\r\nLes mots-clés peuvent être liés au thème de votre défi (par exemple : agriculture, énergie, espace, etc.) ou à un domaine d'expertise (par exemple, classification de texte, architecture de base de données, analyse de données, etc.).\r\n [/locale]\r\n
\r\n \t \r\n \t\t \r\n \r\n \t\t \r\n \t\t \r\n \r\n \t\t [locale en]Continue[/locale][locale fr]Continuer[/locale] \r\n \r\n \t \r\n \r\n \r\n \t \r\n \t\t[locale en]Organization[/locale][locale fr]Organisation[/locale]\r\n \t \r\n \t \r\n\t\t\t \r\n \r\n \t\t \r\n [locale en]Organization[/locale][locale fr]Organisation[/locale] \r\n
\r\n \t \t\t \r\n \r\n \t\t \r\n \t\t \r\n \t\t \r\n \t\t \r\n \t\t \r\n \r\n \t\t [locale en]Continue[/locale][locale fr]Continuer[/locale] \r\n \r\n \t \r\n \r\n \r\n \t !obs.errors.contactPersonEmail.length != 0 &&\r\n !obs.errors.technicalMentorEmail.length != 0 &&\r\n !obs.errors.caseSpecialistMentorEmail.length != 0]\">\r\n \t\t[locale en]Contact information & mentor [/locale][locale fr]Informations de contact et mentor[/locale]\r\n \t \r\n \t \r\n\t\t\t \r\n \r\n \t\t \r\n \t\t [locale en]Contact information & mentor[/locale][locale fr]Informations de contact et mentor[/locale]\r\n
\r\n \t \t\t \r\n \r\n \t\t \r\n \t\t \r\n \t\t \r\n \r\n \t\t \r\n \t\t \r\n \r\n \r\n \t\t \r\n \t\t \r\n \r\n \r\n \t\t \r\n \t\t \r\n \r\n \r\n \t\t \r\n \t\t \r\n \r\n \r\n \t\t \r\n \t\t \r\n \r\n \r\n \t\t [locale en]Continue[/locale][locale fr]Continuer[/locale] \r\n \r\n \t \r\n \r\n \r\n \t \r\n \t\t[locale en]Comments[/locale][locale fr]Commentaires[/locale]\r\n [locale en]Optional[/locale][locale fr]Optionnel[/locale] \r\n \t \r\n \t \r\n\t\t\t \r\n \r\n \t\t \r\n [locale en]Comments[/locale][locale fr]Commentaires[/locale] \r\n
\r\n \t \t\t \r\n \r\n \t \r\n\t\t\t \r\n \t \r\n \r\n \t\r\n \t {% raw %}{{ form.successMessage }}{% endraw %}\r\n \t \r\n \t\r\n \t {% raw %}{{ form.serverValidationMessage[0] }}{% endraw %}\r\n \t \r\n \t \r\n \t \r\n \t \t{{ \"submitLabel\" | localize }} \r\n \r\n \t\t \r\n \r\n{% endif %}\r\n \r\n \r\n \r\n\r\n"
+ },
+ "Disabled": {
+ "Value": false
+ },
+ "Debug": {
+ "Value": false
+ }
+ },
+ "VueFormScripts": {
+ "ClientInit": {
+ "Text": "VeeValidate.setInteractionMode('passive');"
+ },
+ "OnValidation": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nif(!isAuthenticated() || data.title == \"\") {\r\n addError('serverValidationMessage', localizedText.serverValidationError);\r\n}"
+ },
+ "OnSubmitted": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\nvar saveMediaResults = saveMedia(\"challenge\", true);\r\nvar datasetsFiles = getMediaPaths(saveMediaResults);\r\n\r\nif(saveMediaResults[0]?.hasError == true){\r\n addError(\"serverValidationMessage\", localizedText.mediaUploadError);\r\n return;\r\n}\r\n\r\nif(data.datasetsFilesOld != null){\r\n\tif(Object.keys(data.datasetsFilesOld).length > 10){\r\n \tfor(var path of data.datasetsFilesOld){\r\n \tdatasetsFiles.push(path[1]);\r\n \t}\r\n\t} else {\r\n \tdatasetsFiles.push(data.datasetsFilesOld);\r\n\t}\r\n}\r\n \r\nif (data.challengeId == \"\"){\r\nvar item = createContentItem(\"Challenge\", false, { \r\n \"Challenge\": {\r\n \"Title\": {\r\n \"Text\": data.title\r\n },\r\n \"Statement\": {\r\n \"Text\": data.statement\r\n },\r\n \"Datasets\": {\r\n \"Text\": data.datasets\r\n },\r\n \"DatasetsFiles\": {\r\n \"Paths\": datasetsFiles\r\n },\r\n \"BackgroundInformation\": {\r\n \"Text\": data.backgroundInfo\r\n },\r\n \"Keywords\": {\r\n \"Text\": data.keywords\r\n },\r\n \"OrganizationNameEn\": {\r\n \"Text\": data.organizationNameEn\r\n },\r\n \"OrganizationAcronymEn\": {\r\n \"Text\": data.organizationAcronymEn\r\n },\r\n \"ContactPersonName\": {\r\n \"Text\": data.contactPersonName\r\n },\r\n \"ContactPersonEmail\": {\r\n \"Text\": data.contactPersonEmail\r\n },\r\n \"TechnicalMentorName\": {\r\n \"Text\": data.technicalMentorName\r\n },\r\n \"TechnicalMentorEmail\": {\r\n \"Text\": data.technicalMentorEmail\r\n },\r\n \"CaseSpecialistName\": {\r\n \"Text\": data.caseSpecialistMentorName\r\n },\r\n \"CaseSpecialistEmail\": {\r\n \"Text\": data.caseSpecialistMentorEmail\r\n },\r\n \"Comments\": {\r\n \"Text\": data.comments\r\n }\r\n }\r\n});\r\n} else {\r\n var update = updateContentItem(contentByVersionId(data.challengeId), {\r\n \"Challenge\": {\r\n \"Title\": {\r\n \"Text\": data.title\r\n },\r\n \"Statement\": {\r\n \"Text\": data.statement\r\n },\r\n \"Datasets\": {\r\n \"Text\": data.datasets\r\n },\r\n \"DatasetsFiles\": {\r\n \"Paths\": datasetsFiles\r\n },\r\n \"BackgroundInformation\": {\r\n \"Text\": data.backgroundInfo\r\n },\r\n \"Keywords\": {\r\n \"Text\": data.keywords\r\n },\r\n \"OrganizationNameEn\": {\r\n \"Text\": data.organizationNameEn\r\n },\r\n \"OrganizationAcronymEn\": {\r\n \"Text\": data.organizationAcronymEn\r\n },\r\n \"ContactPersonName\": {\r\n \"Text\": data.contactPersonName\r\n },\r\n \"ContactPersonEmail\": {\r\n \"Text\": data.contactPersonEmail\r\n },\r\n \"TechnicalMentorName\": {\r\n \"Text\": data.technicalMentorName\r\n },\r\n \"TechnicalMentorEmail\": {\r\n \"Text\": data.technicalMentorEmail\r\n },\r\n \"CaseSpecialistName\": {\r\n \"Text\": data.caseSpecialistMentorName\r\n },\r\n \"CaseSpecialistEmail\": {\r\n \"Text\": data.caseSpecialistMentorEmail\r\n },\r\n \"Comments\": {\r\n \"Text\": data.comments\r\n }\r\n }\r\n}); \r\n}\r\n "
+ },
+ "ComponentOptions": {
+ "Text": "{% assign challengeId = Request.Query['id'] %}\r\n{% assign challenge = Content.ContentItemVersionId[challengeId] %}\r\n\r\n{\r\n data: () => ({\r\n title: \"{{ challenge.ContentItem.Content.Challenge.Title.Text | js_encode }}\",\r\n\tstatement: \"{{ challenge.ContentItem.Content.Challenge.Statement.Text | js_encode }}\", \r\n datasets: \"{{ challenge.ContentItem.Content.Challenge.Datasets.Text | js_encode }}\",\r\n datasetsFilesOld: [ \r\n \t {%- for file in challenge.ContentItem.Content.Challenge.DatasetsFiles.Paths -%}\r\n\t\t'{{ file }}',\r\n\t {%- endfor -%}\r\n \t],\r\n backgroundInfo: \"{{ challenge.ContentItem.Content.Challenge.BackgroundInformation.Text | js_encode }}\",\r\n keywords: \"{{ challenge.ContentItem.Content.Challenge.Keywords.Text | js_encode }}\",\r\n organizationNameEn: \"{{ challenge.ContentItem.Content.Challenge.OrganizationNameEn.Text | js_encode }}\",\r\n organizationAcronymEn: \"{{ challenge.ContentItem.Content.Challenge.OrganizationAcronymEn.Text | js_encode }}\",\r\n contactPersonName: \"{{ challenge.ContentItem.Content.Challenge.ContactPersonName.Text | js_encode }}\",\r\n contactPersonEmail: \"{{ challenge.ContentItem.Content.Challenge.ContactPersonEmail.Text | js_encode }}\",\r\n technicalMentorName: \"{{ challenge.ContentItem.Content.Challenge.TechnicalMentorName.Text | js_encode }}\",\r\n technicalMentorEmail: \"{{ challenge.ContentItem.Content.Challenge.TechnicalMentorEmail.Text | js_encode }}\",\r\n caseSpecialistMentorName: \"{{ challenge.ContentItem.Content.Challenge.CaseSpecialistName.Text | js_encode }}\",\r\n caseSpecialistMentorEmail: \"{{ challenge.ContentItem.Content.Challenge.CaseSpecialistEmail.Text | js_encode }}\",\r\n comments: \"{{ challenge.ContentItem.Content.Challenge.Comments.Text | js_encode }}\",\r\n counter: 1,\r\n challengeId: \"{{ challengeId }}\"\r\n })\r\n}"
+ }
+ },
+ "LocalizedTextPart": {
+ "Data": [
+ {
+ "Name": "titleLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Titre"
+ },
+ {
+ "Culture": "en",
+ "Value": "Title"
+ }
+ ]
+ },
+ {
+ "Name": "statementLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Énoncé"
+ },
+ {
+ "Culture": "en",
+ "Value": "Statement"
+ }
+ ]
+ },
+ {
+ "Name": "datasetsLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Ensembles de données potentiels"
+ },
+ {
+ "Culture": "en",
+ "Value": "Potential datasets"
+ }
+ ]
+ },
+ {
+ "Name": "descriptionHint",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Prise en charge la syntaxe markdown"
+ },
+ {
+ "Culture": "en",
+ "Value": "Supports markdown syntax"
+ }
+ ]
+ },
+ {
+ "Name": "submitLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Soumettre"
+ },
+ {
+ "Culture": "en",
+ "Value": "Submit"
+ }
+ ]
+ },
+ {
+ "Name": "successMessage",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Votre défi a été enregistré avec succès! Retournez à la page Défi pour voir et modifier votre défi."
+ },
+ {
+ "Culture": "en",
+ "Value": "Your challenge was submitted successfully! Return to the Challenge page to view and modify your challenge."
+ }
+ ]
+ },
+ {
+ "Name": "serverValidationError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Une erreure est survenue lors de la soumission. Veuillez nous contacter."
+ },
+ {
+ "Culture": "en",
+ "Value": "An error occurred during submission. Please contact us."
+ }
+ ]
+ },
+ {
+ "Name": "backgroundInfoLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Information de référence"
+ },
+ {
+ "Culture": "en",
+ "Value": "Background information"
+ }
+ ]
+ },
+ {
+ "Name": "organizationNameEnLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom de votre organisation"
+ },
+ {
+ "Culture": "en",
+ "Value": "Your organization name"
+ }
+ ]
+ },
+ {
+ "Name": "organizationAcronymEnLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Acronyme de votre organisation"
+ },
+ {
+ "Culture": "en",
+ "Value": "Your organization acronym"
+ }
+ ]
+ },
+ {
+ "Name": "contactPersonNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom de la personne ressource"
+ },
+ {
+ "Culture": "en",
+ "Value": "Name of the contact person"
+ }
+ ]
+ },
+ {
+ "Name": "contactPersonEmailLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Courriel de la personne ressource"
+ },
+ {
+ "Culture": "en",
+ "Value": "Contact person email"
+ }
+ ]
+ },
+ {
+ "Name": "technicalMentorNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom du mentor technique"
+ },
+ {
+ "Culture": "en",
+ "Value": "Technical mentor name"
+ }
+ ]
+ },
+ {
+ "Name": "technicalMentorEmailLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Courriel du mentor technique"
+ },
+ {
+ "Culture": "en",
+ "Value": "Technical mentor email"
+ }
+ ]
+ },
+ {
+ "Name": "caseSpecialistMentorNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom du mentor spécialiste du cas"
+ },
+ {
+ "Culture": "en",
+ "Value": "Case specialist mentor name"
+ }
+ ]
+ },
+ {
+ "Name": "caseSpecialistMentorEmailLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Courriel du mentor spécialiste du cas"
+ },
+ {
+ "Culture": "en",
+ "Value": "Case specialist mentor email"
+ }
+ ]
+ },
+ {
+ "Name": "commentsLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Commentaires"
+ },
+ {
+ "Culture": "en",
+ "Value": "Comments"
+ }
+ ]
+ },
+ {
+ "Name": "datasetsFilesLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Choisissez un ou plusieurs fichiers"
+ },
+ {
+ "Culture": "en",
+ "Value": "Select one or multiple files"
+ }
+ ]
+ },
+ {
+ "Name": "keywordsLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Mots clés"
+ },
+ {
+ "Culture": "en",
+ "Value": "Keywords"
+ }
+ ]
+ },
+ {
+ "Name": "mediaUploadError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Le(s) fichier(s) que vous tentez de télécharger ont une extension non autorisée ou sont trop gros."
+ },
+ {
+ "Culture": "en",
+ "Value": "The file(s) you are trying to upload have an extension that is not allowed or is too big."
+ }
+ ]
+ }
+ ]
+ },
+ "ContentPermissionsPart": {
+ "Roles": [
+ "Volunteer",
+ "Administrator"
+ ],
+ "Enabled": true
+ },
+ "AliasPart": {
+ "Alias": "challenge-submission"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Recipes/ConfirmPresenceForm.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Recipes/ConfirmPresenceForm.recipe.json
new file mode 100644
index 000000000..96b858507
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Recipes/ConfirmPresenceForm.recipe.json
@@ -0,0 +1,171 @@
+{
+ "name": "Candev.ConfirmPresenceForm",
+ "displayName": "Confirm Presence Form",
+ "description": "Creates a form to confirm a hacker's presence",
+ "author": "StatCan Digital Innovation",
+ "website": "digital.statcan.gc.ca",
+ "version": "1.0.0",
+ "issetuprecipe": false,
+ "categories": [],
+ "tags": [],
+ "steps": [
+ {
+ "name": "Content",
+ "data": [
+ {
+ "ContentItemId": "4qxg2sr9b4ywatnhjkeq90qbcv",
+ "ContentItemVersionId": "4vecfdny1765w6g5yfmaqj2fnc",
+ "ContentType": "VueForm",
+ "DisplayText": "Confirm Presence Form",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-09-15T12:17:05.90199Z",
+ "PublishedUtc": "2021-09-15T12:17:05.924071Z",
+ "CreatedUtc": "2021-08-19T12:38:18.884471Z",
+ "Owner": "[js: parameters('AdminUserId')]",
+ "Author": "[js: parameters('AdminUsername')]",
+ "TitlePart": {
+ "Title": "Confirm Presence Form"
+ },
+ "VueForm": {
+ "Template": {
+ "Text": "\r\n \r\n \r\n \r\n {{\"titleLabel\" | localize }} \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {% raw %}{{ form.successMessage }}{% endraw %}\r\n \r\n \r\n {% raw %}{{ form.serverValidationMessage[0] }}{% endraw %}\r\n \r\n \r\n \r\n \t {{\"confirmLabel\" | localize}} \r\n \r\n \r\n \r\n \r\n\r\n"
+ },
+ "RenderAs": {
+ "Text": null
+ },
+ "Disabled": {
+ "Value": false
+ },
+ "Debug": {
+ "Value": false
+ },
+ "DisabledHtml": {
+ "Html": "\n [locale en]The is currently disabled.[/locale]\n [locale fr]Le formulaire d'enreigstrement est présentement désactivé[/locale]\n
"
+ },
+ "SuccessMessage": {
+ "Text": "{{ \"successMessage\" | localize }}"
+ }
+ },
+ "AliasPart": {
+ "Alias": "confirm-presence"
+ },
+ "VueFormScripts": {
+ "ClientInit": {
+ "Text": "VeeValidate.setInteractionMode('passive');"
+ },
+ "ComponentOptions": {
+ "Text": "{\r\n data: () => ({\r\n attendance: \"\"\r\n })\r\n}"
+ },
+ "OnValidation": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nif(!isAuthenticated() || data.attendance == \"\") {\r\n addError('serverValidationMessage', localizedText.serverValidationError);\r\n}"
+ },
+ "OnSubmitted": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar updateHackerSettingsResult = updateCustomUserSettings(\"Hacker\", {\r\n \"Hacker\" : {\r\n \"Attendance\": {\r\n \"Value\": data.attendance\r\n }\r\n }\r\n});\r\n\r\nif(updateHackerSettingsResult == 1 || updateHackerSettingsResult == 2) \r\n{\r\n addError(\"serverValidationMessage\", localizedText.serverValidationError); \r\n}"
+ }
+ },
+ "ContentPermissionsPart": {
+ "Enabled": false,
+ "Roles": []
+ },
+ "LocalizedTextPart": {
+ "Data": [
+ {
+ "Name": "titleLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Confirmer votre présence"
+ },
+ {
+ "Culture": "en",
+ "Value": "Confirm your presence"
+ }
+ ]
+ },
+ {
+ "Name": "yesLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Oui, je participerai"
+ },
+ {
+ "Culture": "en",
+ "Value": "Yes, I will attend"
+ }
+ ]
+ },
+ {
+ "Name": "noLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Non, je ne participerai pas"
+ },
+ {
+ "Culture": "en",
+ "Value": "No, I will not attend"
+ }
+ ]
+ },
+ {
+ "Name": "submitLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Envoyer"
+ },
+ {
+ "Culture": "en",
+ "Value": "Send"
+ }
+ ]
+ },
+ {
+ "Name": "successMessage",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Votre présence est confirmée !"
+ },
+ {
+ "Culture": "en",
+ "Value": "Your presence has been confirmed!"
+ }
+ ]
+ },
+ {
+ "Name": "serverValidationError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Une erreure est survenue lors de la soumission. Veuillez nous contacter."
+ },
+ {
+ "Culture": "en",
+ "Value": "An error occurred during submission. Please contact us."
+ }
+ ]
+ },
+ {
+ "Name": "confirmLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Confirmer"
+ },
+ {
+ "Culture": "en",
+ "Value": "Confirm"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+}
+
\ No newline at end of file
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Recipes/HackerRegistrationForm.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Recipes/HackerRegistrationForm.recipe.json
new file mode 100644
index 000000000..88e3ff5b5
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Recipes/HackerRegistrationForm.recipe.json
@@ -0,0 +1,327 @@
+{
+ "name": "Candev.HackerRegistrationForm",
+ "displayName": "Hacker Registration Form",
+ "description": "Creates a registration form for hackers.",
+ "author": "StatCan Digital Innovation",
+ "website": "digital.statcan.gc.ca",
+ "version": "1.0.0",
+ "issetuprecipe": false,
+ "categories": [],
+ "tags": [],
+ "steps": [
+ {
+ "name": "Content",
+ "data": [
+ {
+ "ContentItemId": "4dj03mdaztzf8wg12gw56xkg43",
+ "ContentItemVersionId": "4b0f99cqhwpepwm70xk0nha4ma",
+ "ContentType": "VueForm",
+ "DisplayText": "HackerRegistrationForm",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-07-15T00:07:50.2772891Z",
+ "PublishedUtc": "2021-07-15T00:07:50.3099919Z",
+ "CreatedUtc": "2020-12-02T20:48:00.9867066Z",
+ "Owner": "[js: parameters('AdminUserId')]",
+ "Author": "[js: parameters('AdminUsername')]",
+ "TitlePart": {
+ "Title": "HackerRegistrationForm"
+ },
+ "VueForm": {
+ "Enabled": null,
+ "DisabledHtml": {
+ "Html": "\n [locale en]The Hacker registration form is currently disabled.[/locale]\n [locale fr]Le formulaire d'enreigstrement est présentement désactivé[/locale]\n
"
+ },
+ "SuccessMessage": {
+ "Text": "{{ \"successMessage\" | localize }}"
+ },
+ "RenderAs": {
+ "Text": null
+ },
+ "Template": {
+ "Text": "\r\n \r\n \r\n \r\n [locale en]Participant registration form[/locale][locale fr]Formulaire de participation[/locale] \r\n \r\n{% assign isInRole = User | is_in_role: \"Hacker\" %}\r\n{% if User.Identity.Name == null %}\r\n \r\n [locale en]Please login before registering to this event[/locale]\r\n [locale fr]Veuillez vous connecter avant de vous enregistrer a cet événement[/locale]\r\n \r\n{% elsif isInRole %}\r\n \r\n [locale en]You are already registered to this event[/locale]\r\n [locale fr]Vous êtes déjà enregistré a cet événement[/locale]\r\n \r\n{% else %}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ \"languageLabel\" | localize }}
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\t \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n [locale en]Terms and conditions[/locale][locale fr]Termes et conditions[/locale] \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {% raw %}{{ form.successMessage }}{% endraw %}\r\n \r\n \r\n {% raw %}{{ form.serverValidationMessage[0] }}{% endraw %}\r\n \r\n \r\n \r\n \t [locale en]Register[/locale][locale fr]S'enregistrer[/locale] \r\n \r\n{% endif %}\r\n \r\n \r\n \r\n"
+ },
+ "Disabled": {
+ "Value": false
+ },
+ "Debug": {
+ "Value": false
+ }
+ },
+ "VueFormScripts": {
+ "ClientInit": {
+ "Text": "VeeValidate.setInteractionMode('passive');"
+ },
+ "OnValidation": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nif(!isAuthenticated() || \r\n data.firstName == \"\" || \r\n data.lastName == \"\" || \r\n data.email == \"\" || \r\n data.language == \"\" || \r\n !validateEmail(data.email) ||\r\n data.school == \"\" ||\r\n data.fieldOfStudy == \"\" ||\r\n data.programName == \"\" ||\r\n data.programLevel == \"\" ||\r\n data.programYears == \"\" ||\r\n data.adult == false ||\r\n data.termsAndConditions == false\r\n ) {\r\n addError('serverValidationMessage', localizedText.serverValidationError);\r\n return;\r\n}\r\nif(isInRole(httpContext().User.Identity.Name, \"Hacker\")){\r\n addError('serverValidationMessage', localizedText.alreadyRegisteredError); \r\n}\r\n"
+ },
+ "OnSubmitted": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nvar updateSettingsResult = updateCustomUserSettings(\"ParticipantProfile\", {\r\n \"ParticipantProfile\" : {\r\n \"FirstName\": {\r\n \"Text\": data.firstName\r\n },\r\n \"LastName\": {\r\n \"Text\": data.lastName\r\n },\r\n \"Email\": {\r\n \"Text\": data.email\r\n },\r\n \"Language\": {\r\n \"Text\": data.language\r\n },\r\n \"TermsAndConditions\": {\r\n \"Value\": data.termsAndConditions\r\n },\r\n \"Comments\": {\r\n \"Text\": data.comments\r\n },\r\n }\r\n});\r\n\r\nvar updateHackerSettingsResult = updateCustomUserSettings(\"Hacker\", {\r\n \"Hacker\" : {\r\n \"School\": {\r\n \"Text\": data.school\r\n },\r\n \"FieldOfStudy\": {\r\n \"Text\": data.fieldOfStudy\r\n },\r\n \"ProgramName\": {\r\n \"Text\": data.programName\r\n },\r\n \"ProgramLevel\": {\r\n \"Text\": data.programLevel\r\n },\r\n \"ProgramYears\": {\r\n \"Text\": data.programYears\r\n },\r\n \"Adult\": {\r\n \"Value\": data.adult\r\n }\r\n }\r\n});\r\n\r\nvar httpContext = httpContext();\r\nvar setUserRoleResult = setUserRole(httpContext.User.Identity.Name, \"Hacker\");\r\n\r\nif(updateSettingsResult == 1 || updateSettingsResult == 2 || !setUserRoleResult || updateHackerSettingsResult == 1 || updateHackerSettingsResult == 2) \r\n{\r\n addError(\"serverValidationMessage\", localizedText.updateSettingsError); \r\n}\r\n// success message displayed\r\n"
+ },
+ "ComponentOptions": {
+ "Text": "{\r\n {% assign user = User | user_id | users_by_id %}\r\n data: () => ({\r\n firstName: \"{{ user.Properties.ParticipantProfile.ParticipantProfile.FirstName.Text }}\",\r\n\tlastName: \"{{ user.Properties.ParticipantProfile.ParticipantProfile.LastName.Text }}\", \r\n email: \"{{ user.Properties.ParticipantProfile.ParticipantProfile.Email.Text }}\",\r\n language: \"{{ user.Properties.ParticipantProfile.ParticipantProfile.Language.Text }}\",\r\n school: \"\",\r\n fieldOfStudy: \"\",\r\n programName: \"\",\r\n programLevel: \"\",\r\n programYears: \"\",\r\n adult: null,\r\n termsAndConditions: null,\r\n comments: \"\",\r\n listProgramLevel: [\r\n '[locale en]Certificate[/locale][locale fr]Certificat[/locale]',\r\n '[locale en]College or university diploma[/locale][locale fr]Diplôme collégial ou universitaire[/locale]',\r\n '[locale en]Associate\\'s degree[/locale][locale fr]Diplôme d\\'associés[/locale]',\r\n '[locale en]Bachelor\\'s degree[/locale][locale fr]Baccalauréat[/locale]',\r\n '[locale en]Postgraduate diploma or certificate[/locale][locale fr]Diplôme ou certificat de cycle supérieur[/locale]',\r\n '[locale en]Master\\'s degree[/locale][locale fr]Maîtrise[/locale]',\r\n '[locale en]Doctorate\\'s degree[/locale][locale fr]Doctorat[/locale]',\r\n '[locale en]Post doctorate\\'s degree[/locale][locale fr]Post-doctorat[/locale]'\r\n ],\r\n listProgramYears: ['0', '1', '2', '3', '4', '5+']\r\n })\r\n}"
+ }
+ },
+ "LocalizedTextPart": {
+ "Data": [
+ {
+ "Name": "firstNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Prénom"
+ },
+ {
+ "Culture": "en",
+ "Value": "First name"
+ }
+ ]
+ },
+ {
+ "Name": "lastNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom"
+ },
+ {
+ "Culture": "en",
+ "Value": "Last name"
+ }
+ ]
+ },
+ {
+ "Name": "emailLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Adresse courriel de contact"
+ },
+ {
+ "Culture": "en",
+ "Value": "Contact email address"
+ }
+ ]
+ },
+ {
+ "Name": "languageLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Langue"
+ },
+ {
+ "Culture": "en",
+ "Value": "Language"
+ }
+ ]
+ },
+ {
+ "Name": "languageEnglishLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Anglais"
+ },
+ {
+ "Culture": "en",
+ "Value": "English"
+ }
+ ]
+ },
+ {
+ "Name": "languageFrenchLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Français"
+ },
+ {
+ "Culture": "en",
+ "Value": "French"
+ }
+ ]
+ },
+ {
+ "Name": "languageBothLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Les deux"
+ },
+ {
+ "Culture": "en",
+ "Value": "Both"
+ }
+ ]
+ },
+ {
+ "Name": "schoolLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom de l'université ou du collège"
+ },
+ {
+ "Culture": "en",
+ "Value": "University or college name"
+ }
+ ]
+ },
+ {
+ "Name": "alreadyRegisteredError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Vous êtes déjà enregistré à cet événement."
+ },
+ {
+ "Culture": "en",
+ "Value": "You are already registered to this event."
+ }
+ ]
+ },
+ {
+ "Name": "successMessage",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Votre enregistrement a été reçu avec succès!"
+ },
+ {
+ "Culture": "en",
+ "Value": "You have successfully registered!"
+ }
+ ]
+ },
+ {
+ "Name": "updateSettingsError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Une erreure est survenue lors de la mise à jour de votre profile. Veuillez contacter l'administrateur"
+ },
+ {
+ "Culture": "en",
+ "Value": "An error occurred while updating your profile. Please contact the site admin."
+ }
+ ]
+ },
+ {
+ "Name": "fieldOfStudyLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Domaine d'études"
+ },
+ {
+ "Culture": "en",
+ "Value": "Field of study"
+ }
+ ]
+ },
+ {
+ "Name": "programNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom du programme"
+ },
+ {
+ "Culture": "en",
+ "Value": "Program name"
+ }
+ ]
+ },
+ {
+ "Name": "programLevelLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Niveau du programme"
+ },
+ {
+ "Culture": "en",
+ "Value": "Program level"
+ }
+ ]
+ },
+ {
+ "Name": "programYearsLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nombre d'années complétées à votre programme"
+ },
+ {
+ "Culture": "en",
+ "Value": "Number of years completed in your program"
+ }
+ ]
+ },
+ {
+ "Name": "adultLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "J'ai 18 ans ou plus"
+ },
+ {
+ "Culture": "en",
+ "Value": "I am 18 years or older"
+ }
+ ]
+ },
+ {
+ "Name": "termsAndConditionsLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "J'ai lu et j'accepte les termes et conditions"
+ },
+ {
+ "Culture": "en",
+ "Value": "I have read and I agree to the terms and conditions"
+ }
+ ]
+ },
+ {
+ "Name": "commentsLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Commentaires (optionnel)"
+ },
+ {
+ "Culture": "en",
+ "Value": "Comments (optional)"
+ }
+ ]
+ },
+ {
+ "Name": "serverValidationError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Une erreur est survenue lors de la soumission. Veuillez nous contacter."
+ },
+ {
+ "Culture": "en",
+ "Value": "An error occurred during submission. Please contact us."
+ }
+ ]
+ }
+ ]
+ },
+ "ContentPermissionsPart": {
+ "Roles": [],
+ "Enabled": false
+ },
+ "AliasPart": {
+ "Alias": "hackerregistrationform"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Recipes/NewsletterForm.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Recipes/NewsletterForm.recipe.json
new file mode 100644
index 000000000..dc2542b6c
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Recipes/NewsletterForm.recipe.json
@@ -0,0 +1,154 @@
+{
+ "name": "Candev.Newsletter",
+ "displayName": "Newsletter",
+ "description": "Creates a newsletter form for users to subscribe to the newsletters.",
+ "author": "StatCan Digital Innovation",
+ "website": "digital.statcan.gc.ca",
+ "version": "1.0.0",
+ "issetuprecipe": false,
+ "categories": [],
+ "tags": [],
+ "steps": [
+ {
+ "name": "Content",
+ "data": [
+ {
+ "ContentItemId": "4ty56s2p8vfhmxp76p4f37b1c3",
+ "ContentItemVersionId": "4mk8wcbkywwqay8pp6arvtt5mj",
+ "ContentType": "VueForm",
+ "DisplayText": "Newsletter",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-07-19T14:36:25.0528596Z",
+ "PublishedUtc": "2021-07-19T14:36:25.0829317Z",
+ "CreatedUtc": "2021-04-23T14:48:37.4919743Z",
+ "Owner": "[js: parameters('AdminUserId')]",
+ "Author": "[js: parameters('AdminUsername')]",
+ "TitlePart": {
+ "Title": "Newsletter"
+ },
+ "VueForm": {
+ "Enabled": null,
+ "RenderAs": {
+ "Text": null
+ },
+ "DisabledHtml": {
+ "Html": "\nThe contact form is currently disabled.\n
"
+ },
+ "SuccessMessage": {
+ "Text": "{{ \"successMessage\" | localize }}"
+ },
+ "ErrorMessage": {
+ "Text": "Please correct the errors above."
+ },
+ "Template": {
+ "Text": " \r\n \r\n \r\n \r\n {{ \"submitLabel\" | localize }} \r\n \r\n {% raw %}{{ form.successMessage }}{% endraw %}\r\n \r\n \r\n {% raw %}{{ form.serverValidationMessage[0] }}{% endraw %}\r\n \r\n
"
+ },
+ "Disabled": {
+ "Value": false
+ },
+ "Debug": {
+ "Value": false
+ }
+ },
+ "VueFormScripts": {
+ "ClientInit": {
+ "Text": null
+ },
+ "ComponentOptions": {
+ "Text": "{\r\n data: () => ({\r\n\temail: \"\",\r\n })\r\n}"
+ },
+ "OnValidation": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nif(data.email == \"\" || !validateEmail(data.email)) {\r\n addError('serverValidationMessage', localizedText.serverValidationError);\r\n}"
+ },
+ "OnSubmitted": {
+ "Text": "var data = requestFormAsJsonObject();\r\n\r\nvar item = createContentItem(\"NewsletterSubscriber\", true, {\r\n \"NewsletterSubscriber\": {\r\n \"Email\": {\r\n \"Text\": data.email\r\n }\r\n }\r\n});"
+ }
+ },
+ "LocalizedText": {},
+ "LocalizedTextPart": {
+ "Data": [
+ {
+ "Name": "nameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom"
+ },
+ {
+ "Culture": "en",
+ "Value": "Name"
+ }
+ ]
+ },
+ {
+ "Name": "emailLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Adresse courriel"
+ },
+ {
+ "Culture": "en",
+ "Value": "Email address"
+ }
+ ]
+ },
+ {
+ "Name": "submitLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "S'abonner"
+ },
+ {
+ "Culture": "en",
+ "Value": "Subscribe"
+ }
+ ]
+ },
+ {
+ "Name": "successMessage",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Merci, vous serez tenu au courant des nouvelles concernant l'événement!"
+ },
+ {
+ "Culture": "en",
+ "Value": "Thank you, you will be kept up to date with news about the event!"
+ }
+ ]
+ },
+ {
+ "Name": "serverValidationError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Une erreur est survenue."
+ },
+ {
+ "Culture": "en",
+ "Value": "An error occured."
+ }
+ ]
+ }
+ ]
+ },
+ "ContentPermissionsPart": {
+ "Roles": [],
+ "Enabled": false
+ },
+ "AliasPart": {
+ "Alias": "form-newsletter"
+ },
+ "VueFormSurvey": {
+ "SurveyJson": {
+ "Text": null
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Recipes/ScoringPage.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Recipes/ScoringPage.recipe.json
new file mode 100644
index 000000000..ce24bca95
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Recipes/ScoringPage.recipe.json
@@ -0,0 +1,129 @@
+{
+ "name": "Candev.ScoringPage",
+ "displayName": "Scoring Form",
+ "description": "Creates a scoring form that can be used by judges.",
+ "author": "StatCan Digital Innovation",
+ "website": "digital.statcan.gc.ca",
+ "version": "1.0.0",
+ "issetuprecipe": false,
+ "categories": [],
+ "tags": [],
+ "steps": [
+ {
+ "name": "feature",
+ "disable": [],
+ "enable": [
+ "StatCan.OrchardCore.VueForms.Localized",
+ "OrchardCore.Workflows.Http"
+ ]
+ },
+ {
+ "name": "Content",
+ "data": [
+ {
+ "ContentItemId": "423fn7nvrwcdv2ksy8hww9qwdn",
+ "ContentItemVersionId": "447chqav6sw0d7bhf9fzmjqkmy",
+ "ContentType": "VueForm",
+ "DisplayText": "Scoring",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2020-12-08T16:46:33.0288821Z",
+ "PublishedUtc": "2020-12-08T16:46:33.0415421Z",
+ "CreatedUtc": "2020-10-30T15:39:26.8575804Z",
+ "Owner": "[js: parameters('AdminUserId')]",
+ "Author": "[js: parameters('AdminUsername')]",
+ "TitlePart": {
+ "Title": "Scoring"
+ },
+ "VueForm": {
+ "Disabled": {
+ "Value": false
+ },
+ "Debug": {
+ "Value": false
+ },
+ "DisabledHtml": {
+ "Html": "\nThe Scoring form is currently disabled.\n
"
+ },
+ "SuccessMessage": {
+ "Text": "Your submission was successful"
+ },
+ "ErrorMessage": {
+ "Text": "Please correct the errors above."
+ },
+ "RenderAs": {
+ "Text": null
+ },
+ "Template": {
+ "Text": "{% assign user = User | user_id | users_by_id %}\r\n{% assign userId = User | user_id %}\r\n{% assign team = Request.Query['teamId'] | content_item_id %}\r\n{% assign judgeType = user.Properties.Judge.JudgeType.Type.Values | first %}\r\n\r\n\r\n \r\n \r\n \r\n \r\n {{ team }}\r\n \r\n \r\n {% if judgeType == \"Technical\" %}\r\n [locale en]\r\n 1. Technical quality \r\n Considering the technical complexity, how satisfied were you with the overall quantity and quality of techniques incorporated in the final product?\r\n Does what the team delivered seem remarkable given time frame?\r\n [/locale]\r\n [locale fr]\r\n 1. Qualité technique \r\n Compte tenu de la complexité technique, dans quelle mesure avez-vous été satisfait de la quantité et de la qualité des techniques incorporées dans le produit final ?\r\n Est-ce que l'équipe a livré une solution remarquable compte tenu du temps alloué ?\r\n [/locale]\r\n {% else %}\r\n [locale en]\r\n 1. Relevance \r\n How well did the final product respond to the challenge provided?\r\n Did the team acknowledge the challenge parameters correctly in regards to the information provided by your organization?\r\n [/locale]\r\n [locale fr]\r\n 1. Pertinence \r\n Dans quelle mesure le produit final a-t-il bien répondu au cas fourni ?\r\n L'équipe a-t-elle pris en compte les paramètres du défi en ce qui concerne l'information fournie par votre organisation ?\r\n [/locale]\r\n {% endif %}\r\n \r\n \r\n \r\n \t\t \r\n \r\n \r\n {% if judgeType == \"Technical\" %}\r\n [locale en]\r\n 2. Innovation and creativity \r\n How creative has the group been in solving the challenge?\r\n Did they come up with a unique approach, or did they follow existing patterns and solutions?\r\n [/locale]\r\n [locale fr]\r\n 2. Innovation et créativité \r\n Dans quelle mesure l'équipe a-t-elle fait preuve de créativité pour relever le défi ?\r\n Ont-ils proposé une approche unique, ou ont-ils suivi des modèles et des avenues existants ?\r\n [/locale]\r\n {% else %}\r\n [locale en]\r\n 2. Business potential and viability \r\n Does the solution have the potential to be implemented and used broadly?\r\n Does the prototype or product seem viable and practical?\r\n [/locale]\r\n [locale fr]\r\n 2. Potentiel d’implantation et viabilité \r\n La solution peut-elle être mise en oeuvre et utilisée à grande échelle ?\r\n Le prototype ou le produit semble-t-il viable et pratique ?\r\n [/locale]\r\n {% endif %}\r\n \r\n \r\n \r\n \t\t \r\n \r\n \r\n {% if judgeType == \"Technical\" %}\r\n [locale en]\r\n 3. Design and polish \r\n How many steps does a user need to take to “run” the solution?\r\n Did the group think about the User Interface (UI) and User Experience (UX)?\r\n Is it easy to understand and interact with the product proposed?\r\n [/locale]\r\n [locale fr]\r\n 3. Design et perfectionnement \r\n Combien d'étapes faut-il pour « exécuter » la solution ?\r\n Le groupe a-t-il pensé à l'interface et à l'expérience utilisateur ?\r\n Est-il facile de comprendre et d’interagir avec le produit proposé ?\r\n [/locale]\r\n {% else %}\r\n [locale en]\r\n 3. Overall execution and pitch \r\n Was the group able to convey their message in the allowed pitch time?\r\n How well do you understand what the product is or what the prototype does?\r\n [/locale]\r\n [locale fr]\r\n 3. Exécution et présentation \r\n Le groupe a-t-il été en mesure de transmettre son message dans le temps alloué ?\r\n Dans quelle mesure comprenez-vous bien ce qu'est le produit et ce qu’il fait ?\r\n [/locale]\r\n {% endif %}\r\n \r\n \r\n \r\n \t\t \r\n \r\n \r\n \r\n {% raw %}{{ form.successMessage }}{% endraw %}\r\n \r\n \r\n {% raw %}{{ form.serverValidationMessage[0] }}{% endraw %}\r\n \r\n \r\n \r\n \r\n \t {{ \"submitLabel\" | localize }} \r\n \r\n \r\n \r\n \r\n \r\n"
+ }
+ },
+ "VueFormScripts": {
+ "ClientInit": {
+ "Text": "VeeValidate.setInteractionMode('passive');"
+ },
+ "OnValidation": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nif(data.score1 == \"\" || data.score2 == \"\" || data.score3 == \"\") {\r\n addError('serverValidationMessage', localizedText.scoreRequiredError);\r\n}"
+ },
+ "OnSubmitted": {
+ "Text": "var data = requestFormAsJsonObject();\r\n\r\nvar item = createContentItem(\"Score\", true, {\r\n \"Score\": {\r\n \"Score\": {\r\n \"Value\": parseInt(data.score1) + parseInt(data.score2) + parseInt(data.score3)\r\n },\r\n \"Round\": {\r\n \"Value\": data.round\r\n },\r\n \"Judge\": {\r\n \"UserIds\": [\r\n data.judge\r\n ]\r\n },\r\n \"Team\": {\r\n \"ContentItemIds\": [\r\n data.team\r\n ]\r\n },\r\n },\r\n \"JudgeType\": {\r\n \"Type\": {\r\n \"Values\": [\r\n data.judgeType\r\n ]\r\n }\r\n }\r\n});\r\n\r\n"
+ },
+ "ComponentOptions": {
+ "Text": "{% assign userId = User | user_id %}\r\n{% assign user = User | user_id | users_by_id %}\r\n{% assign round = Site.Properties.HackathonCustomSettings.JudgingCustomSettings.IsFinalRound.Value %}\r\n{% assign judgeType = user.Properties.Judge.JudgeType.Type.Values | first %}\r\n\r\n{\r\n data: () => ({\r\n score1: \"\",\r\n score2: \"\",\r\n score3: \"\",\r\n judge: \"{{ userId }}\",\r\n team: \"{{ Request.Query['teamId'] }}\",\r\n round: {% if round %}\"2\"{% else %}\"1\"{% endif %},\r\n judgeType: \"{{ judgeType }}\"\r\n })\r\n}"
+ }
+ },
+ "LocalizedTextPart": {
+ "Data": [
+ {
+ "Name": "scoreRequiredError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Un score est requis."
+ },
+ {
+ "Culture": "en",
+ "Value": "A score is required."
+ }
+ ]
+ },
+ {
+ "Name": "commentLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Commentaires"
+ },
+ {
+ "Culture": "en",
+ "Value": "Comments"
+ }
+ ]
+ },
+ {
+ "Name": "submitLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Soumettre"
+ },
+ {
+ "Culture": "en",
+ "Value": "Submit"
+ }
+ ]
+ }
+ ]
+ },
+ "AliasPart": {
+ "Alias": "scoring"
+ },
+ "ContentPermissionsPart": {
+ "Enabled": false,
+ "Roles": []
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Recipes/SolutionForm.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Recipes/SolutionForm.recipe.json
new file mode 100644
index 000000000..9e87b8767
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Recipes/SolutionForm.recipe.json
@@ -0,0 +1,157 @@
+{
+ "name": "Candev.SolutionForm",
+ "displayName": "Solution Submission Form",
+ "description": "Creates a form that can be used by hackers to submit their solution",
+ "author": "StatCan Digital Innovation",
+ "website": "digital.statcan.gc.ca",
+ "version": "1.0.0",
+ "issetuprecipe": false,
+ "categories": [],
+ "tags": [],
+ "steps": [
+ {
+ "name": "Content",
+ "data":[
+ {
+ "ContentItemId": "4fy9a011te6qx5611jv1hhtwwh",
+ "ContentItemVersionId": "4dpvctn6fbvpf2weejebbdypdw",
+ "ContentType": "VueForm",
+ "DisplayText": "Solution Submission",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-09-29T18:24:49.9316005Z",
+ "PublishedUtc": "2021-09-29T18:24:49.9448608Z",
+ "CreatedUtc": "2021-08-16T17:04:30.808582Z",
+ "Owner": "[js: parameters('AdminUserId')]",
+ "Author": "[js: parameters('AdminUsername')]",
+ "TitlePart": {
+ "Title": "Solution Submission"
+ },
+ "VueForm": {
+ "Template": {
+ "Text": "\r\n \r\n \r\n \r\n [locale en]Solution submission[/locale][locale fr]Soumission de solution[/locale] \r\n \r\n{% if User.Identity.Name == null %}\r\n \r\n [locale en]Please login before submitting a solution[/locale]\r\n [locale fr]Veuillez vous connecter avant de soumettre un solution[/locale]\r\n \r\n{% else %}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \t \r\n \t \r\n \r\n \r\n \r\n {% raw %}{{ form.successMessage }}{% endraw %}\r\n \r\n \r\n {% raw %}{{ form.errorMessage }}{% endraw %}\r\n \r\n \r\n \r\n \t{{ \"submitLabel\" | localize }} \r\n \r\n{% endif %}\r\n \r\n \r\n "
+ },
+ "RenderAs": {
+ "Text": null
+ },
+ "Disabled": {
+ "Value": false
+ },
+ "Debug": {
+ "Value": false
+ },
+ "DisabledHtml": {
+ "Html": "\n [locale en]The solution submission form is currently disabled.[/locale]\n [locale fr]Le formulaire de soumission de solution est présentement désactivé[/locale]\n
"
+ },
+ "SuccessMessage": {
+ "Text": "{{ \"successMessage\" | localize }}"
+ }
+ },
+ "AliasPart": {
+ "Alias": "solution-submission"
+ },
+ "VueFormScripts": {
+ "ClientInit": {
+ "Text": "VeeValidate.setInteractionMode('passive');"
+ },
+ "ComponentOptions": {
+ "Text": "{% assign user = User | user_id | users_by_id %}\r\n{% assign team = user.Properties.Hacker.Hacker.Team.ContentItemIds.first | content_item_id %}\r\n\r\n{\r\n data: () => ({\r\n solutionName: \"\",\r\n\tsolutionDescription: \"\", \r\n repositoryUrl: \"\",\r\n teamId: \"{{ team.ContentItemVersionId }}\"\r\n })\r\n}"
+ },
+ "OnValidation": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nif(!isAuthenticated() || data.solutionName == \"\" || data.solutionDescription == \"\" || data.repositoryUrl == \"\") {\r\n addError('serverValidationMessage', localizedText.serverValidationError);\r\n}"
+ },
+ "OnSubmitted": {
+ "Text": "var data = requestFormAsJsonObject();\r\n\r\nvar updateResult = updateContentItem(contentByVersionId(data.teamId), {\r\n \"TeamSolutionPart\": {\r\n \"Name\": {\r\n \"Text\": data.solutionName\r\n },\r\n \"Description\": {\r\n \"Text\": data.solutionDescription\r\n },\r\n \"RepositoryUrl\": {\r\n \"Text\": data.repositoryUrl\r\n }\r\n }\r\n});\r\n\r\nif(updateResult == 1 || updateResult == 2 ) {\r\n addError(\"serverValidationMessage\", localizedText.serverValidationError); \r\n}\r\n\r\n"
+ }
+ },
+ "ContentPermissionsPart": {
+ "Enabled": false,
+ "Roles": []
+ },
+ "LocalizedTextPart": {
+ "Data": [
+ {
+ "Name": "solutionNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom de la solution"
+ },
+ {
+ "Culture": "en",
+ "Value": "Solution Name"
+ }
+ ]
+ },
+ {
+ "Name": "solutionDescriptionLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Description"
+ },
+ {
+ "Culture": "en",
+ "Value": "Description"
+ }
+ ]
+ },
+ {
+ "Name": "repositoryURLLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "URL du dépot de la solution"
+ },
+ {
+ "Culture": "en",
+ "Value": "Solution repository URL"
+ }
+ ]
+ },
+ {
+ "Name": "submitLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Envoyer"
+ },
+ {
+ "Culture": "en",
+ "Value": "Send"
+ }
+ ]
+ },
+ {
+ "Name": "successMessage",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Votre solution a été envoyée avec succès!"
+ },
+ {
+ "Culture": "en",
+ "Value": "Your solution was submitted successfully!"
+ }
+ ]
+ },
+ {
+ "Name": "serverValidationError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Une erreure est survenue lors de la soumission. Veuillez nous contacter."
+ },
+ {
+ "Culture": "en",
+ "Value": "An error occurred during submission. Please contact us."
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Recipes/TeamEdit.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Recipes/TeamEdit.recipe.json
new file mode 100644
index 000000000..71ba70c00
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Recipes/TeamEdit.recipe.json
@@ -0,0 +1,170 @@
+{
+ "name": "Candev.TeamEdit",
+ "displayName": "TeamEdit",
+ "description": "Creates a VueForm for the team dashboard",
+ "author": "StatCan Digital Innovation",
+ "website": "digital.statcan.gc.ca",
+ "version": "1.0.0",
+ "issetuprecipe": false,
+ "categories": [],
+ "tags": [],
+ "steps": [
+ {
+ "name": "Content",
+ "data": [
+ {
+ "ContentItemId": "4466xex4gkry42s4n9x4ksyywd",
+ "ContentItemVersionId": "4q2x3s1ww7sfztqz9e7y4xdtc2",
+ "ContentType": "VueForm",
+ "DisplayText": "TeamEdit",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-08-26T17:36:58.5473001Z",
+ "PublishedUtc": "2021-08-26T17:36:58.8977937Z",
+ "CreatedUtc": "2021-07-30T17:51:00.281483Z",
+ "Owner": "[js: parameters('AdminUserId')]",
+ "Author": "[js: parameters('AdminUsername')]",
+ "TitlePart": {
+ "Title": "TeamEdit"
+ },
+ "VueForm": {
+ "Template": {
+ "Text": "{% assign user = User | user_id | users_by_id %}\r\n{% assign teamContentItemId = user.Properties.Hacker.Hacker.Team.ContentItemIds | first %}\r\n{% assign team = Content.ContentItemId[teamContentItemId] %}\r\n{% assign challengeSelected = team.ContentItem.Content.Team.Challenge.ContentItemIds | content_item_id | first %} \r\n\r\n \r\n \r\n [locale en]Edit my team[/locale]\r\n [locale fr]Modifier mon équipe[/locale]\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n {% if challengeSelected == null %}\r\n\t\t\t \r\n \r\n {% endif %}\r\n \r\n \r\n {% raw %}{{ form.successMessage }}{% endraw %}\r\n \r\n \r\n {% raw %}{{ form.serverValidationMessage[0] }}{% endraw %}\r\n \r\n \t[locale en]Save[/locale][locale fr]Sauvegarder[/locale] \r\n \r\n \r\n"
+ },
+ "RenderAs": {
+ "Text": null
+ },
+ "Disabled": {
+ "Value": false
+ },
+ "Debug": {
+ "Value": false
+ },
+ "DisabledHtml": {
+ "Html": "\n [locale en]The team edit form is currently disabled.[/locale]\n [locale fr]Le formulaire de modification d'équipe est présentement désactivé[/locale]\n
"
+ },
+ "SuccessMessage": {
+ "Text": "{{ \"successMessage\" | localize }}"
+ }
+ },
+ "VueFormScripts": {
+ "ClientInit": {
+ "Text": null
+ },
+ "ComponentOptions": {
+ "Text": "{% assign user = User | user_id | users_by_id %}\r\n{% assign teamContentItemId = user.Properties.Hacker.Hacker.Team.ContentItemIds | first %}\r\n{% assign team = Content.ContentItemId[teamContentItemId] %}\r\n{% assign topicList = Queries.GetItemsForHackathon | query: type: \"Topic\" %}\r\n\r\n{\r\n data: () => ({\r\n teamName: \"{{ team.Content.Team.Name.Text | js_encode }}\",\r\n\tteamDescription: \"{{ team.Content.Team.Description.Text | js_encode }}\", \r\n topics: [\r\n {% if team.Content.Team.Topics.ContentItemIds != null %}\r\n {% for topic in team.Content.Team.Topics.ContentItemIds %}\r\n {% assign topicItem = Content.ContentItemId[topic] %}\r\n {% if Culture.Name == \"en\" %}\r\n { name: \"{{topicItem.Content.Topic.NameEn.Text | js_encode }}\", id: \"{{topicItem.ContentItemId}}\" },\r\n {% else %}\r\n { name: \"{{topicItem.Content.Topic.NameFr.Text | js_encode }}\", id: \"{{topicItem.ContentItemId}}\" },\r\n {% endif %}\r\n {% endfor %}\r\n {% else %}\r\n {% for topic in topicList %}\r\n {% if Culture.Name == \"en\" %}\r\n { name: \"{{topic.Content.Topic.NameEn.Text | js_encode }}\", id: \"{{topic.ContentItemId}}\" },\r\n {% else %}\r\n { name: \"{{topic.Content.Topic.NameFr.Text | js_encode }}\", id: \"{{topic.ContentItemId}}\" },\r\n {% endif %} \r\n {% endfor %}\r\n {% endif %}\r\n ],\r\n teamId: \"{{ team.ContentItemVersionId }}\"\r\n })\r\n}"
+ },
+ "OnValidation": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nif(!isAuthenticated() || data.teamName == \"\" || data.teamDescription == \"\") {\r\n addError('serverValidationMessage', localizedText.serverValidationMessage);\r\n}"
+ },
+ "OnSubmitted": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nvar updateResult = updateContentItem(contentByVersionId(data.teamId), {\r\n \"Team\" : {\r\n \"Name\": {\r\n \"Text\": data.teamName\r\n },\r\n \"Description\": {\r\n \"Text\": data.teamDescription\r\n },\r\n \"Topics\": {\r\n \"ContentItemIds\": data[\"topics[id]\"]\r\n }\r\n }\r\n});\r\n\r\nif(updateResult == 1 || updateResult == 2 ) \r\n{\r\n addError(\"serverValidationMessage\", localizedText.updateSettingsError); \r\n}"
+ }
+ },
+ "ContentPermissionsPart": {
+ "Enabled": false,
+ "Roles": []
+ },
+ "LocalizedTextPart": {
+ "Data": [
+ {
+ "Name": "teamNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom d'équipe"
+ },
+ {
+ "Culture": "en",
+ "Value": "Team name"
+ }
+ ]
+ },
+ {
+ "Name": "teamDescriptionLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Description de l'équipe"
+ },
+ {
+ "Culture": "en",
+ "Value": "Team description"
+ }
+ ]
+ },
+ {
+ "Name": "successMessage",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Équipe mise à jour avec succès!"
+ },
+ {
+ "Culture": "en",
+ "Value": "Team updated successfully!"
+ }
+ ]
+ },
+ {
+ "Name": "serverValidationMessage",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Une erreure est survenue lors de la soumission. Veuillez nous contacter."
+ },
+ {
+ "Culture": "en",
+ "Value": "An error occurred during submission. Please contact us."
+ }
+ ]
+ },
+ {
+ "Name": "topicsTitleLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Sujets"
+ },
+ {
+ "Culture": "en",
+ "Value": "Topics"
+ }
+ ]
+ },
+ {
+ "Name": "topicsHintLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Sélectionnez et déposez les sujets dans votre ordre d'intérêt"
+ },
+ {
+ "Culture": "en",
+ "Value": "Drag and drop topics in your order of interest"
+ }
+ ]
+ },
+ {
+ "Name": "updateSettingsError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Une erreure est survenue lors de la mise à jour de votre équipe. Veuillez contacter l'administrateur"
+ },
+ {
+ "Culture": "en",
+ "Value": "An error occurred while updating your team. Please contact the site admin."
+ }
+ ]
+ }
+ ]
+ },
+ "AliasPart": {
+ "Alias": "teamedit"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Recipes/UserProfileForm.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Recipes/UserProfileForm.recipe.json
new file mode 100644
index 000000000..9fd2d4cd1
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Recipes/UserProfileForm.recipe.json
@@ -0,0 +1,316 @@
+{
+ "name": "Candev.UserProfile",
+ "displayName": "User Profile",
+ "description": "Creates a user profile form for users.",
+ "author": "StatCan Digital Innovation",
+ "website": "digital.statcan.gc.ca",
+ "version": "1.0.0",
+ "issetuprecipe": false,
+ "categories": [],
+ "tags": [],
+ "steps": [
+ {
+ "name": "Content",
+ "data": [
+ {
+ "ContentItemId": "4pbmvhq49bwy1yatrapasxctnk",
+ "ContentItemVersionId": "4bbdtp8th3p3z1xdar3fbsnhwk",
+ "ContentType": "VueForm",
+ "DisplayText": "User Profile",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-07-30T14:23:13.5956714Z",
+ "PublishedUtc": "2021-07-30T14:23:13.627574Z",
+ "CreatedUtc": "2021-04-29T18:02:07.8316851Z",
+ "Owner": "[js: parameters('AdminUserId')]",
+ "Author": "[js: parameters('AdminUsername')]",
+ "TitlePart": {
+ "Title": "User Profile"
+ },
+ "VueForm": {
+ "Enabled": null,
+ "RenderAs": {
+ "Text": null
+ },
+ "DisabledHtml": {
+ "Html": ""
+ },
+ "SuccessMessage": {
+ "Text": "{{ \"successMessage\" | localize }}"
+ },
+ "Template": {
+ "Text": "\r\n \r\n \r\n \r\n [locale en]User profile[/locale][locale fr]Profil d'utilisateur[/locale] \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n [locale en]Language[/locale][locale fr]Langue[/locale]
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {% assign isInRole = User | is_in_role: \"Volunteer\" %}\r\n {% if isInRole %}\r\n \r\n [locale en]Role(s)[/locale][locale fr]Rôle(s)[/locale]
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \t \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {% endif %}\r\n \r\n \r\n {% raw %}{{ form.successMessage }}{% endraw %}\r\n \r\n \r\n {% raw %}{{ form.serverValidationMessage[0] }}{% endraw %}\r\n \r\n \r\n \r\n \t [locale en]Update profile[/locale][locale fr]Mettre à jour votre profil[/locale] \r\n \r\n \r\n \r\n \r\n\r\n"
+ },
+ "Disabled": {
+ "Value": false
+ },
+ "Debug": {
+ "Value": false
+ }
+ },
+ "VueFormScripts": {
+ "ClientInit": {
+ "Text": null
+ },
+ "ComponentOptions": {
+ "Text": "{% assign user = User | user_id | users_by_id %}\r\n{\r\n data: () => ({\r\n firstName: \"{{user.Properties.ParticipantProfile.ParticipantProfile.FirstName.Text}}\",\r\n\tlastName: \"{{user.Properties.ParticipantProfile.ParticipantProfile.LastName.Text}}\", \r\n email: \"{{ user.Properties.ParticipantProfile.ParticipantProfile.Email.Text}}\",\r\n language: \"{{user.Properties.ParticipantProfile.ParticipantProfile.Language.Text}}\",\r\n mentor: {{user.Properties.Volunteer.Volunteer.Mentor.Value | default: false}},\r\n judge: {{user.Properties.Volunteer.Volunteer.Judge.Value | default: false}},\r\n agencyRepresentative: {{user.Properties.Volunteer.Volunteer.AgencyRepresentative.Value | default: false}},\r\n workshopPresenter: {{user.Properties.Volunteer.Volunteer.WorkshopPresenter.Value | default: false}},\r\n technicalAdvisor: {{user.Properties.Volunteer.Volunteer.TechnicalAdvisor.Value | default: false}},\r\n keynoteSpeaker: {{user.Properties.Volunteer.Volunteer.KeynoteSpeaker.Value | default: false}},\r\n observer: {{user.Properties.Volunteer.Volunteer.Observer.Value | default: false}},\r\n organizer: {{user.Properties.Volunteer.Volunteer.Organizer.Value | default: false}}\r\n })\r\n}"
+ },
+ "OnValidation": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nif(!validateEmail(data.email)){\r\n addError(\"email\", localizedText.invalidEmail);\r\n}\r\n"
+ },
+ "OnSubmitted": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nvar updateSettingsResult = updateCustomUserSettings(\"ParticipantProfile\", {\r\n \"ParticipantProfile\" : {\r\n \"FirstName\": {\r\n \"Text\": data.firstName, \r\n },\r\n \"LastName\": {\r\n \"Text\": data.lastName, \r\n },\r\n \"Email\": {\r\n \"Text\": data.email, \r\n },\r\n \"Language\": {\r\n \"Text\": data.language, \r\n },\r\n }\r\n});\r\n\r\nvar updateVolunteerSettingsResult = updateCustomUserSettings(\"Volunteer\", {\r\n \"Volunteer\" : {\r\n \"Mentor\" : {\r\n \"Value\" : data.mentor\r\n },\r\n \"AgencyRepresentative\" : {\r\n \"Value\" : data.agencyRepresentative\r\n },\r\n \"WorkshopPresenter\" : {\r\n \"Value\" : data.workshopPresenter\r\n },\r\n \"TechnicalAdvisor\" : {\r\n \"Value\" : data.technicalAdvisor\r\n },\r\n \"KeynoteSpeaker\" : {\r\n \"Value\" : data.keynoteSpeaker\r\n },\r\n \"Observer\" : {\r\n \"Value\" : data.observer\r\n },\r\n \"Organizer\" : {\r\n \"Value\" : data.organizer\r\n },\r\n \"Judge\" : {\r\n \"Value\" : data.judge\r\n },\r\n }\r\n});\r\n\r\nif(updateSettingsResult == 1 || updateSettingsResult == 2 || updateVolunteerSettingsResult == 1 || updateVolunteerSettingsResult == 2) \r\n{\r\n addError(\"serverValidationMessage\", localizedText.updateSettingsError);\r\n return;\r\n}\r\n\r\nnotify(\"success\", localizedText.successMessage);\r\n"
+ }
+ },
+ "LocalizedTextPart": {
+ "Data": [
+ {
+ "Name": "successMessage",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Votre profil a été mis à jour."
+ },
+ {
+ "Culture": "en",
+ "Value": "Your profile was updated."
+ }
+ ]
+ },
+ {
+ "Name": "emailLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Adresse courriel"
+ },
+ {
+ "Culture": "en",
+ "Value": "Email address"
+ }
+ ]
+ },
+ {
+ "Name": "invalidEmail",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Le courriel est invalide."
+ },
+ {
+ "Culture": "en",
+ "Value": "The email is invalid."
+ }
+ ]
+ },
+ {
+ "Name": "duplicateEmail",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "L'adresse courriel est déjà utilisée."
+ },
+ {
+ "Culture": "en",
+ "Value": "The email is already in use."
+ }
+ ]
+ },
+ {
+ "Name": "updateSettingsError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Une erreur est survenue lors de la mise-à-jour de votre profil. Veuillez contacter l'administrateur."
+ },
+ {
+ "Culture": "en",
+ "Value": "An error occurred while updating your profile. Please contact the site admin."
+ }
+ ]
+ },
+ {
+ "Name": "mentorLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Mentor"
+ },
+ {
+ "Culture": "en",
+ "Value": "Mentor"
+ }
+ ]
+ },
+ {
+ "Name": "judgeLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Juge"
+ },
+ {
+ "Culture": "en",
+ "Value": "Judge"
+ }
+ ]
+ },
+ {
+ "Name": "agencyRepresentativeLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Représentant"
+ },
+ {
+ "Culture": "en",
+ "Value": "Agency representative"
+ }
+ ]
+ },
+ {
+ "Name": "workshopPresenterLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Présenteur d'atelier"
+ },
+ {
+ "Culture": "en",
+ "Value": "Workshop presenter"
+ }
+ ]
+ },
+ {
+ "Name": "technicalAdvisorLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Conseiller technique"
+ },
+ {
+ "Culture": "en",
+ "Value": "Technical advisor"
+ }
+ ]
+ },
+ {
+ "Name": "keynoteSpeakerLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Conférencier"
+ },
+ {
+ "Culture": "en",
+ "Value": "Keynote speaker"
+ }
+ ]
+ },
+ {
+ "Name": "observerLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Observateur"
+ },
+ {
+ "Culture": "en",
+ "Value": "Observer"
+ }
+ ]
+ },
+ {
+ "Name": "organizerLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Organisateur / bénévole"
+ },
+ {
+ "Culture": "en",
+ "Value": "Organizer / Volunteer"
+ }
+ ]
+ },
+ {
+ "Name": "firstNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Prénom"
+ },
+ {
+ "Culture": "en",
+ "Value": "First name"
+ }
+ ]
+ },
+ {
+ "Name": "lastNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom"
+ },
+ {
+ "Culture": "en",
+ "Value": "Last name"
+ }
+ ]
+ },
+ {
+ "Name": "languageEnglishLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Anglais"
+ },
+ {
+ "Culture": "en",
+ "Value": "English"
+ }
+ ]
+ },
+ {
+ "Name": "languageFrenchLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Français"
+ },
+ {
+ "Culture": "en",
+ "Value": "French"
+ }
+ ]
+ },
+ {
+ "Name": "languageBothLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Les deux"
+ },
+ {
+ "Culture": "en",
+ "Value": "Both"
+ }
+ ]
+ }
+ ]
+ },
+ "AliasPart": {
+ "Alias": "user-profile"
+ },
+ "ContentPermissionsPart": {
+ "Enabled": true,
+ "Roles": [
+ "Authenticated"
+ ]
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Recipes/VolunteerRegistrationForm.recipe.json b/src/Apps/StatCan.OrchardCore.Candev/Recipes/VolunteerRegistrationForm.recipe.json
new file mode 100644
index 000000000..951d32c26
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Recipes/VolunteerRegistrationForm.recipe.json
@@ -0,0 +1,379 @@
+{
+ "name": "Candev.VolunteerRegistrationForm",
+ "displayName": "Volunteer Registration Form",
+ "description": "Creates a registration form for volunteers.",
+ "author": "StatCan Digital Innovation",
+ "website": "digital.statcan.gc.ca",
+ "version": "1.0.0",
+ "issetuprecipe": false,
+ "categories": [],
+ "tags": [],
+ "steps": [
+ {
+ "name": "Content",
+ "data": [
+ {
+ "ContentItemId": "4jjje1q162zaay11nbf3w2634h",
+ "ContentItemVersionId": "4a3ffebr7c9xp1g970jg94b2cv",
+ "ContentType": "VueForm",
+ "DisplayText": "VolunteerRegistrationForm",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-07-30T19:18:19.3729757Z",
+ "PublishedUtc": "2021-07-30T19:18:19.4046761Z",
+ "CreatedUtc": "2020-12-02T20:48:02.4224369Z",
+ "Owner": "[js: parameters('AdminUserId')]",
+ "Author": "[js: parameters('AdminUsername')]",
+ "TitlePart": {
+ "Title": "VolunteerRegistrationForm"
+ },
+ "VueForm": {
+ "Enabled": null,
+ "DisabledHtml": {
+ "Html": "\n [locale en]The Volunteer registration form is currently disabled.[/locale]\n [locale fr]Le formulaire d'enreigstrement est présentement désactivé[/locale]\n
"
+ },
+ "SuccessMessage": {
+ "Text": "{{ \"successMessage\" | localize }}"
+ },
+ "RenderAs": {
+ "Text": null
+ },
+ "Template": {
+ "Text": "\r\n \r\n \r\n \r\n [locale en]Partner and volunteer registration form[/locale][locale fr]Formulaire d'inscription des partenaires et des bénévoles[/locale] \r\n \r\n{% assign isInRole = User | is_in_role: \"Volunteer\" %}\r\n{% if User.Identity.Name == null %}\r\n \r\n [locale en]Please login before registering to this event.[/locale]\r\n [locale fr]Veuillez vous connecter avant de vous inscrire à cet événement.[/locale]\r\n \r\n{% elsif isInRole %}\r\n \r\n [locale en]You are registered to this event, which gives you access to My portal and Archive tabs.[/locale]\r\n [locale fr]Vous êtes inscrit à cet événement, ce qui vous donne accès aux onglets Mon portail et Archive.[/locale]\r\n \r\n{% else %}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n [locale en]Role(s)[/locale][locale fr]Rôle(s)[/locale]
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \t \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ \"languageLabel\" | localize }}
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n [locale en]Terms and conditions [/locale]\r\n [locale fr]Termes et conditions [/locale]\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {% raw %}{{ form.successMessage }}{% endraw %}\r\n \r\n \r\n {% raw %}{{ form.serverValidationMessage[0] }}{% endraw %}\r\n \r\n \r\n \r\n \t[locale en]Register[/locale][locale fr]S'enregistrer[/locale] \r\n \r\n{% endif %}\r\n \r\n \r\n \r\n\r\n"
+ },
+ "Disabled": {
+ "Value": false
+ },
+ "Debug": {
+ "Value": false
+ }
+ },
+ "VueFormScripts": {
+ "ClientInit": {
+ "Text": "VeeValidate.setInteractionMode('passive');"
+ },
+ "OnValidation": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nif(data.termsAndConditions == \"false\"){\r\n addError('serverValidationMessage', localizedText.termsAndConditionsError);\r\n}\r\n\r\nif(!isAuthenticated() || data.firstName == \"\" || data.lastName == \"\" || data.email == \"\" || data.language == \"\" || !validateEmail(data.email)) {\r\n addError('serverValidationMessage', localizedText.serverValidationError);\r\n}\r\n\r\nif(httpContext().User.IsInRole(\"Volunteer\")){\r\n addError('serverValidationMessage', localizedText.alreadyRegisteredError); \r\n}"
+ },
+ "OnSubmitted": {
+ "Text": "var data = requestFormAsJsonObject();\r\nvar localizedText = getLocalizedTextValues(getFormContentItem());\r\n\r\nvar updateSettingsResult = updateCustomUserSettings(\"ParticipantProfile\", {\r\n \"ParticipantProfile\" : {\r\n \"FirstName\": {\r\n \"Text\": data.firstName\r\n },\r\n \"LastName\": {\r\n \"Text\": data.lastName\r\n },\r\n \"Email\": {\r\n \"Text\": data.email\r\n },\r\n \"Language\": {\r\n \"Text\": data.language\r\n },\r\n \"TermsAndConditions\": {\r\n \"Value\": data.termsAndConditions\r\n },\r\n \"Comments\": {\r\n \"Text\": data.comments\r\n }\r\n }\r\n});\r\n\r\nvar updateVolunteerSettingsResult = updateCustomUserSettings(\"Volunteer\", {\r\n \"Volunteer\" : {\r\n \"Mentor\" : {\r\n \"Value\" : data.mentor\r\n },\r\n \"AgencyRepresentative\" : {\r\n \"Value\" : data.agencyRepresentative\r\n },\r\n \"WorkshopPresenter\" : {\r\n \"Value\" : data.workshopPresenter\r\n },\r\n \"TechnicalAdvisor\" : {\r\n \"Value\" : data.technicalAdvisor\r\n },\r\n \"KeynoteSpeaker\" : {\r\n \"Value\" : data.keynoteSpeaker\r\n },\r\n \"Observer\" : {\r\n \"Value\" : data.observer\r\n },\r\n \"Organizer\" : {\r\n \"Value\" : data.organizer\r\n },\r\n \"Judge\" : {\r\n \"Value\" : data.judge\r\n },\r\n \"Department\": {\r\n \"Text\": data.department\r\n }\r\n }\r\n});\r\n\r\nvar httpContext = httpContext();\r\nvar setUserRoleResult = setUserRole(httpContext.User.Identity.Name, \"Volunteer\");\r\n\r\nif(updateSettingsResult == 1 || updateSettingsResult == 2 || updateVolunteerSettingsResult == 1 || updateVolunteerSettingsResult == 2) \r\n{\r\n addError(\"serverValidationMessage\", localizedText.updateSettingsError); \r\n}\r\n// success message displayed\r\n"
+ },
+ "ComponentOptions": {
+ "Text": "{\r\n data: () => ({\r\n firstName: \"\",\r\n\tlastName: \"\", \r\n email: \"\",\r\n language: \"\",\r\n mentor: false,\r\n agencyRepresentative: false,\r\n workshopPresenter: false,\r\n technicalAdvisor: false,\r\n keynoteSpeaker: false,\r\n observer: false,\r\n organizer: false,\r\n judge: false,\r\n department: \"\",\r\n termsAndConditions: null,\r\n comments: \"\"\r\n })\r\n}"
+ }
+ },
+ "LocalizedTextPart": {
+ "Data": [
+ {
+ "Name": "firstNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Prénom"
+ },
+ {
+ "Culture": "en",
+ "Value": "First name"
+ }
+ ]
+ },
+ {
+ "Name": "lastNameLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Nom"
+ },
+ {
+ "Culture": "en",
+ "Value": "Last name"
+ }
+ ]
+ },
+ {
+ "Name": "emailLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Adresse courriel"
+ },
+ {
+ "Culture": "en",
+ "Value": "Email address"
+ }
+ ]
+ },
+ {
+ "Name": "languageLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Langue"
+ },
+ {
+ "Culture": "en",
+ "Value": "Language"
+ }
+ ]
+ },
+ {
+ "Name": "languageEnglishLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Anglais"
+ },
+ {
+ "Culture": "en",
+ "Value": "English"
+ }
+ ]
+ },
+ {
+ "Name": "languageFrenchLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Français"
+ },
+ {
+ "Culture": "en",
+ "Value": "French"
+ }
+ ]
+ },
+ {
+ "Name": "languageBothLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Les deux"
+ },
+ {
+ "Culture": "en",
+ "Value": "Both"
+ }
+ ]
+ },
+ {
+ "Name": "serverValidationError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Une erreure est survenue lors de la soumission. Veuillez nous contacter."
+ },
+ {
+ "Culture": "en",
+ "Value": "An error occurred during submission. Please contact us."
+ }
+ ]
+ },
+ {
+ "Name": "alreadyRegisteredError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Vous êtes inscrit à cet événement, ce qui vous donne accès aux onglets Archive et Mon portail."
+ },
+ {
+ "Culture": "en",
+ "Value": "You are registered to this event, which gives access to the Archive and My portal tabs."
+ }
+ ]
+ },
+ {
+ "Name": "successMessage",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Vous êtes inscrit avec succès! Veuillez rafraîchir la page pour accéder au contenu exclusif des partenaires et bénévoles."
+ },
+ {
+ "Culture": "en",
+ "Value": "You have successfully registered! Please refresh the page to access content exclusive to partners and volunteers."
+ }
+ ]
+ },
+ {
+ "Name": "updateSettingsError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Une erreure est survenue lors de la mise-à-jour de votre profil. Veuillez contacter l'administrateur"
+ },
+ {
+ "Culture": "en",
+ "Value": "An error occurred while updating your profile. Please contact the site admin."
+ }
+ ]
+ },
+ {
+ "Name": "mentorLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Mentor"
+ },
+ {
+ "Culture": "en",
+ "Value": "Mentor"
+ }
+ ]
+ },
+ {
+ "Name": "judgeLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Juge"
+ },
+ {
+ "Culture": "en",
+ "Value": "Judge"
+ }
+ ]
+ },
+ {
+ "Name": "agencyRepresentativeLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Représentant"
+ },
+ {
+ "Culture": "en",
+ "Value": "Agency representative"
+ }
+ ]
+ },
+ {
+ "Name": "workshopPresenterLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Présenteur d'atelier"
+ },
+ {
+ "Culture": "en",
+ "Value": "Workshop presenter"
+ }
+ ]
+ },
+ {
+ "Name": "technicalAdvisorLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Conseiller technique"
+ },
+ {
+ "Culture": "en",
+ "Value": "Technical advisor"
+ }
+ ]
+ },
+ {
+ "Name": "keynoteSpeakerLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Conférencier"
+ },
+ {
+ "Culture": "en",
+ "Value": "Keynote speaker"
+ }
+ ]
+ },
+ {
+ "Name": "observerLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Observateur"
+ },
+ {
+ "Culture": "en",
+ "Value": "Observer"
+ }
+ ]
+ },
+ {
+ "Name": "organizerLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Organisateur / bénévole"
+ },
+ {
+ "Culture": "en",
+ "Value": "Organizer/Volunteer"
+ }
+ ]
+ },
+ {
+ "Name": "departmentLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Ministère / agence"
+ },
+ {
+ "Culture": "en",
+ "Value": "Department/Agency"
+ }
+ ]
+ },
+ {
+ "Name": "termsAndConditionsLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "J'ai lu et j'accepte les termes et conditions."
+ },
+ {
+ "Culture": "en",
+ "Value": "I have read and I agree to the terms and conditions."
+ }
+ ]
+ },
+ {
+ "Name": "commentsLabel",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Commentaires (optionnel)"
+ },
+ {
+ "Culture": "en",
+ "Value": "Comments (optional)"
+ }
+ ]
+ },
+ {
+ "Name": "termsAndConditionsError",
+ "LocalizedItems": [
+ {
+ "Culture": "fr",
+ "Value": "Veuillez accepter les termes et conditions."
+ },
+ {
+ "Culture": "en",
+ "Value": "Please accept the terms and conditions."
+ }
+ ]
+ }
+ ]
+ },
+ "ContentPermissionsPart": {
+ "Roles": [],
+ "Enabled": false
+ },
+ "AliasPart": {
+ "Alias": "volunteerregistrationform"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Services/CandevService.cs b/src/Apps/StatCan.OrchardCore.Candev/Services/CandevService.cs
new file mode 100644
index 000000000..a2ecba052
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Services/CandevService.cs
@@ -0,0 +1,692 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Security.Claims;
+using StatCan.OrchardCore.Candev.Indexes;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.ModelBinding;
+using Microsoft.Extensions.Localization;
+using Newtonsoft.Json.Linq;
+using OrchardCore.ContentManagement;
+using OrchardCore.Queries;
+using YesSql;
+using OrchardCore.Settings;
+using OrchardCore.Entities;
+using OrchardCore.Users.Models;
+using OrchardCore.Users;
+using Microsoft.AspNetCore.Identity;
+
+namespace StatCan.OrchardCore.Candev.Services
+{
+ public class CandevService : ICandevService
+ {
+ private readonly YesSql.ISession _session;
+ private readonly IContentManager _contentManager;
+ private readonly IQueryManager _queryManager;
+ private readonly IHttpContextAccessor _httpContextAccessor;
+ private readonly ISiteService _siteService;
+ private readonly UserManager _userManager;
+
+ public CandevService(YesSql.ISession session,
+ IStringLocalizer localizer,
+ IContentManager contentManager,
+ IQueryManager queryManager,
+ IHttpContextAccessor httpContextAccessor,
+ ISiteService siteService,
+ UserManager userManager
+ )
+ {
+ _session = session;
+ _contentManager = contentManager;
+ _queryManager = queryManager;
+ _httpContextAccessor = httpContextAccessor;
+ T = localizer;
+ _siteService = siteService;
+ _userManager = userManager;
+ }
+
+ public IStringLocalizer T { get; }
+
+ public Task GetParticipantAsync()
+ {
+ var user = _httpContextAccessor.HttpContext.User;
+ if (!user.Identity.IsAuthenticated)
+ {
+ return Task.FromResult(null);
+ }
+ return _session.Query(x => x.UserId == user.FindFirst(ClaimTypes.NameIdentifier).Value).FirstOrDefaultAsync();
+ }
+
+ public Task GetTeamMemberCount(string teamContentItemId)
+ {
+ return _session.QueryIndex(x => x.TeamContentItemId == teamContentItemId).CountAsync();
+ }
+
+ public Task> GetTeamMembers(string teamContentItemId)
+ {
+ return _session.Query(x => x.TeamContentItemId == teamContentItemId).ListAsync();
+ }
+
+ public async Task TeamExists(string teamContentItemId)
+ {
+ var teamCount = await _session.QueryIndex(x => x.ContentItemId == teamContentItemId && x.ContentType == "Team" && x.Published).CountAsync();
+ return teamCount > 0;
+ }
+
+ public async Task IsTeamFull(string teamContentItemId)
+ {
+ var site = await _siteService.GetSiteSettingsAsync();
+ var hackathonCustomSettings = site.As("HackathonCustomSettings");
+
+ var members = await _session.QueryIndex(x => x.TeamContentItemId == teamContentItemId).ListAsync();
+ if (members.Any())
+ {
+ if (members.Count() >= (int)hackathonCustomSettings.Content["TeamCustomSettings"]["TeamSize"].Value.Value)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public async Task JoinTeam(string teamContentItemId, ModelStateDictionary modelState)
+ {
+ var user = await GetParticipantAsync();
+
+ if (user == null || !user.RoleNames.Contains("Hacker"))
+ {
+ modelState.AddModelError("error", T["You are not a hacker"].Value);
+ return null;
+ }
+
+ if (user.HasTeam())
+ {
+ modelState.AddModelError("error", T["Already have a team"].Value);
+ return null;
+ }
+
+ var team = await _contentManager.GetAsync(teamContentItemId);
+ if (team == null)
+ {
+ modelState.AddModelError("error", T["Team does not exist"].Value);
+ return null;
+ }
+
+ if (await IsTeamFull(teamContentItemId))
+ {
+ modelState.AddModelError("error", T["Team is full"]);
+ return null;
+ }
+
+ var contentItem = await GetSettings(user, "Hacker");
+
+ contentItem.Content.Hacker.Team = JObject.FromObject(new { ContentItemIds = new string[] { team.ContentItemId } });
+ user.Properties["Hacker"] = JObject.FromObject(contentItem);
+ _session.Save(user);
+
+ return team;
+ }
+
+ public async Task CreateTeam(ModelStateDictionary modelState)
+ {
+ var user = await GetParticipantAsync();
+ if (user == null || !user.RoleNames.Contains("Hacker"))
+ {
+ modelState.AddModelError("error", T["You are not a hacker"].Value);
+ return null;
+ }
+
+ if (user.HasTeam())
+ {
+ modelState.AddModelError("error", T["Already on a team"].Value);
+ return null;
+ }
+
+ var team = await _contentManager.NewAsync("Team");
+ team.Owner = user.UserId;
+
+ await _contentManager.CreateAsync(team, VersionOptions.Published);
+ team.Content.Team.TeamCaptain = JObject.FromObject(new { UserIds = new string[] { user.UserId } });
+ await _contentManager.UpdateAsync(team);
+
+ var contentItem = await GetSettings(user, "Hacker");
+ contentItem.Content.Hacker.Team = JObject.FromObject(new { ContentItemIds = new string[] { team.ContentItemId } });
+ user.Properties["Hacker"] = JObject.FromObject(contentItem);
+ _session.Save(user);
+
+ return team;
+ }
+
+ public async Task LeaveTeam(ModelStateDictionary modelState)
+ {
+ var user = await GetParticipantAsync();
+ var team = await _session.Query(x => x.ContentItemId == user.GetTeamId() && x.ContentType == "Team" && x.Published).FirstOrDefaultAsync();
+ var teamContentItemId = user.GetTeamId();
+
+ if (user == null || !user.RoleNames.Contains("Hacker"))
+ {
+ modelState.AddModelError("error", T["You are not a hacker"].Value);
+ return false;
+ }
+
+ if (!user.HasTeam())
+ {
+ modelState.AddModelError("error", T["You are not part of a team"].Value);
+ return false;
+ }
+
+ //Remove user from team
+ var contentItem = await GetSettings(user, "Hacker");
+ contentItem.Content.Hacker.Team?.ContentItemIds.Clear();
+ user.Properties["Hacker"] = JObject.FromObject(contentItem);
+ _session.Save(user);
+
+ //if the team has no member left, delete it
+ if (await GetTeamMemberCount(teamContentItemId) > 0)
+ {
+ //if the user was the team captain, make another hacker the team captain
+ if (team.Content.Team?.TeamCaptain?.UserIds?.First == user.UserId)
+ {
+ var hacker = await _session.Query(x => x.TeamContentItemId == teamContentItemId).FirstOrDefaultAsync();
+ team.Content.Team.TeamCaptain = JObject.FromObject(new { UserIds = new string[] { hacker.UserId } });
+ await _contentManager.UpdateAsync(team);
+ }
+ }
+ else
+ {
+ await _contentManager.RemoveAsync(team);
+ }
+
+ return true;
+ }
+
+ public string RootUrl(string slug)
+ {
+ if (string.IsNullOrWhiteSpace(slug))
+ {
+ return "/";
+ }
+ if (!slug.StartsWith("/"))
+ {
+ return "/" + slug;
+ }
+ return slug;
+ }
+
+ // TODO: move into utils
+ private string randomName()
+ {
+ string[] prefix = new string[10] { "awesome", "great", "insane", "matrix", "elite", "excellent", "amazing", "virtual", "crazy", "super" };
+ string[] sufix = new string[7] { "hackers", "coders", "cyberpunks", "programmers", "engineers", "scripters", "architects" };
+
+ Random rand = new Random();
+ return prefix[rand.Next(0, prefix.Length)] + "-" + sufix[rand.Next(0, sufix.Length)] + "-" + rand.Next(0, 9);
+ }
+
+ public async Task MatchTeams()
+ {
+ var site = await _siteService.GetSiteSettingsAsync();
+ var hackersWithoutTeams = (await _session.Query(x => (x.TeamContentItemId == null || x.TeamContentItemId == "") && x.Roles.Contains("Hacker")).ListAsync()).ToList();
+
+ var hackathonCustomSettings = site.As("HackathonCustomSettings");
+ int maxTeamSize = (int)hackathonCustomSettings.Content["TeamCustomSettings"]["TeamSize"].Value.Value;
+ await CleanupTeams();
+ var unorderedTeams = await _session.QueryIndex(x => x.ContentType == "Team" && x.Published).ListAsync();
+ var teams = unorderedTeams.OrderByDescending(x => (GetTeamMemberCount(x.ContentItemId).GetAwaiter().GetResult())).ToList();
+
+ var incompleteTeams = Array.Empty().ToList();
+ int smallestTeamCount = (teams.Count > 0) ? await GetTeamMemberCount(teams.Last().ContentItemId) : 0;
+ while (teams.Count > 0)
+ {
+ var team = teams[0];
+ int memberCount = await GetTeamMemberCount(team.ContentItemId);
+
+ // If the team is empty, just remove it from the list.
+ if (memberCount != 0)
+ {
+ // Combine teams that will form a full team together
+ while (memberCount + smallestTeamCount <= maxTeamSize && team.ContentItemId != teams.Last().ContentItemId)
+ {
+ await CombineTeams(team.ContentItemId, teams.Last());
+ teams.RemoveAt(teams.Count - 1);
+ memberCount += smallestTeamCount;
+ smallestTeamCount = await GetTeamMemberCount(teams.Last().ContentItemId);
+ }
+
+ // Move teams that are not full to a new list of teams to fill with hackers without teams.
+ if (memberCount < maxTeamSize)
+ {
+ incompleteTeams.Add(team);
+ }
+ }
+ // Remove the team from the list.
+ teams.RemoveAt(0);
+ }
+
+ // Add hackers without teams to incomplete teams
+ while (incompleteTeams.Count > 0 && hackersWithoutTeams.Count > 0)
+ {
+ var team = incompleteTeams[0];
+ int memberCount = await GetTeamMemberCount(team.ContentItemId);
+ while (memberCount < maxTeamSize && hackersWithoutTeams.Count > 0)
+ {
+ await AddHackerToTeam(team.ContentItemId, hackersWithoutTeams[0].UserId);
+ hackersWithoutTeams.RemoveAt(0);
+ memberCount++;
+ }
+ if (memberCount >= maxTeamSize)
+ {
+ incompleteTeams.RemoveAt(0);
+ }
+ }
+
+ // Create teams with the remaining hackers.
+ int n = 0;
+ string teamId = null;
+ while (hackersWithoutTeams.Count > 0)
+ {
+ var hacker = hackersWithoutTeams[0];
+ if (n == 0)
+ {
+ teamId = await CreateTeam(hacker.UserId);
+ await AddHackerToTeam(teamId, hacker.UserId);
+ n++;
+ hackersWithoutTeams.RemoveAt(0);
+ }
+ else
+ {
+ await AddHackerToTeam(teamId, hacker.UserId);
+ n++;
+ hackersWithoutTeams.RemoveAt(0);
+ }
+ if (n == maxTeamSize)
+ {
+ teamId = null;
+ n = 0;
+ }
+ }
+ // Delete remaining empty teams
+ await CleanupTeams();
+ return true;
+ }
+
+ private async Task CombineTeams(string teamContentId1, CandevItemsIndex team2)
+ {
+ var team2Members = await GetTeamMembers(team2.ContentItemId);
+ var team1 = JObject.FromObject(new { ContentItemIds = new string[] { teamContentId1 } });
+ foreach (var member in team2Members)
+ {
+ var contentItem = await GetSettings(member, "Hacker");
+
+ contentItem.Content.Hacker.Team.ContentItemIds.Add(teamContentId1);
+ member.Properties["Hacker"] = JObject.FromObject(contentItem);
+ _session.Save(member);
+ }
+ // Delete team 2
+ await _contentManager.RemoveAsync(await _contentManager.GetAsync(team2.ContentItemId));
+ return true;
+ }
+
+ private async Task AddHackerToTeam(string teamContentId, string participantContentId)
+ {
+ var participant = await _session.Query(x => x.UserId == participantContentId).FirstOrDefaultAsync();
+
+ var contentItem = await GetSettings(participant, "Hacker");
+
+ contentItem.Content.Hacker.Team = JObject.FromObject(new { ContentItemIds = new string[] { teamContentId } });
+ participant.Properties["Hacker"] = JObject.FromObject(contentItem);
+ _session.Save(participant);
+
+ return true;
+ }
+
+ private async Task CreateTeam(string UserId)
+ {
+ var team = await _contentManager.NewAsync("Team");
+ team.DisplayText = randomName();
+ await _contentManager.CreateAsync(team, VersionOptions.Published);
+ team.Content.Team.TeamCaptain = JObject.FromObject(new { UserIds = new string[] { UserId } });
+ await _contentManager.UpdateAsync(team);
+ return team.ContentItemId;
+ }
+
+ public async Task CreateTeam(string teamName, string[] topics)
+ {
+ var team = await _contentManager.NewAsync("Team");
+
+ team.Content.Team.Name = JObject.FromObject(new { Text = teamName });
+ team.Content.Team.Topics = JObject.FromObject(new { ContentItemIds = topics });
+
+ await _contentManager.CreateAsync(team, VersionOptions.Published);
+ await _contentManager.UpdateAsync(team);
+ return team.ContentItemId;
+ }
+
+ private async Task CleanupTeams()
+ {
+ foreach (var team in await _session.Query(x => x.ContentType == "Team").ListAsync())
+ {
+ var count = await GetTeamMemberCount(team.ContentItemId);
+ if (count == 0)
+ {
+ await _contentManager.RemoveAsync(team);
+ }
+ }
+ return true;
+ }
+
+ public async Task RunUpdateHandlers()
+ {
+ var allItems = await _session.Query(x => x.Published).ListAsync();
+ foreach (var item in allItems)
+ {
+ await _contentManager.UpdateAsync(item);
+ }
+ return true;
+ }
+
+ public async Task GetSettings(User user, string type)
+ {
+ ContentItem contentItem;
+ if (user.Properties.TryGetValue(type, out var properties))
+ {
+ var existing = properties.ToObject();
+ contentItem = await _contentManager.NewAsync(type);
+ contentItem.Merge(existing);
+ }
+ else
+ {
+ contentItem = await _contentManager.NewAsync(type);
+ }
+
+ return contentItem;
+ }
+
+ public async Task RemoveTeamMember(string hackerContentItemId, ModelStateDictionary modelState)
+ {
+ var participant = await _session.Query(x => x.UserId == hackerContentItemId).FirstOrDefaultAsync();
+ var user = await GetParticipantAsync();
+ var team = await _session.Query(x => x.ContentItemId == participant.GetTeamId() && x.ContentType == "Team" && x.Published).FirstOrDefaultAsync();
+
+ if (!participant.HasTeam())
+ {
+ modelState.AddModelError("error", T["You are not part of a team"].Value);
+ return false;
+ }
+
+ if (participant == null || team.Content.Team.TeamCaptain?.UserIds?.First != user.UserId)
+ {
+ modelState.AddModelError("error", T["You are not the team captain. Only the team captain can perform this action"].Value);
+ return false;
+ }
+
+ var contentItem = await GetSettings(participant, "Hacker");
+
+ contentItem.Content.Hacker.Team.ContentItemIds.Clear();
+ participant.Properties["Hacker"] = JObject.FromObject(contentItem);
+ _session.Save(participant);
+
+ return true;
+ }
+
+ public async Task SaveTeam(string teamName, string teamDescription, string challenge, ModelStateDictionary modelState)
+ {
+ var user = await GetParticipantAsync();
+
+ var team = await _session.Query(x => x.ContentItemId == user.GetTeamId() && x.ContentType == "Team" && x.Published).FirstOrDefaultAsync();
+ if (team == null || team.ContentType != "Team")
+ {
+ modelState.AddModelError("error", T["Team doesn't exist"].Value);
+ return false;
+ }
+
+ if (!user.HasTeam())
+ {
+ modelState.AddModelError("error", T["You are not part of a team"].Value);
+ return false;
+ }
+
+ if (user == null || team.Content.Team.TeamCaptain?.UserIds?.First != user.UserId)
+ {
+ modelState.AddModelError("error", T["You are not the team captain. Only the team captain can perform this action"].Value);
+ return false;
+ }
+ team.Content.Team.Name = JObject.FromObject(new { Text = teamName });
+ team.Content.Team.Description = JObject.FromObject(new { Text = teamDescription });
+ team.Content.Team.Challenge = JObject.FromObject(new { ContentItemIds = new string[] { challenge } });
+ await _contentManager.UpdateAsync(team);
+
+ return true;
+ }
+
+ public async Task AssignCases()
+ {
+ var site = await _siteService.GetSiteSettingsAsync();
+ var teams = await _session.Query(x => x.ContentType == "Team" && x.Published).ListAsync();
+ var topics = await _session.Query(x => x.ContentType == "Topic" && x.Published).ListAsync();
+ double maxCases = Math.Ceiling(Convert.ToDouble(teams.Count()) / Convert.ToDouble(topics.Count()));
+
+ IDictionary casesCount = new Dictionary();
+ foreach (var topic in topics)
+ {
+ casesCount.Add(topic.ContentItemId, 0);
+ }
+
+ foreach (var team in teams)
+ {
+ if (team.Content.Team.Topics.ContentItemIds.Count == 0)
+ {
+ foreach (var topic in topics)
+ {
+ if (casesCount.Where(x => x.Key == topic.ContentItemId).Select(x => x.Value).FirstOrDefault() < maxCases)
+ {
+ var challenge = topics.Where(x => x.ContentItemId == topic.ContentItemId.ToString()).Select(x => x.Content.Topic.Challenge).FirstOrDefault();
+ team.Content.Team.Challenge = challenge;
+ await _contentManager.UpdateAsync(team);
+ casesCount[topic.ContentItemId.ToString()]++;
+ break;
+ }
+ }
+ }
+ else
+ {
+ foreach (var topic in team.Content.Team.Topics.ContentItemIds)
+ {
+ if (casesCount.Where(x => x.Key == topic.ToString()).Select(x => x.Value).FirstOrDefault() < maxCases)
+ {
+ var challenge = topics.Where(x => x.ContentItemId == topic.ToString()).Select(x => x.Content.Topic.Challenge).FirstOrDefault();
+ team.Content.Team.Challenge = challenge;
+ await _contentManager.UpdateAsync(team);
+ casesCount[topic.ToString()]++;
+ break;
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+
+ public async Task CreateChallenge(string challengeTitle)
+ {
+ var challenge = await _contentManager.NewAsync("Challenge");
+
+ challenge.Content.Challenge.Title = JObject.FromObject(new { Text = challengeTitle });
+
+ await _contentManager.CreateAsync(challenge, VersionOptions.Published);
+ await _contentManager.UpdateAsync(challenge);
+ return challenge.ContentItemId;
+ }
+
+ public async Task CreateTopic(string topicName, string challengeId)
+ {
+ var topic = await _contentManager.NewAsync("Topic");
+
+ topic.Content.Topic.Name = JObject.FromObject(new { Text = topicName });
+ topic.Content.Topic.Challenge = JObject.FromObject(new { ContentItemIds = new string[] { challengeId } });
+
+ await _contentManager.CreateAsync(topic, VersionOptions.Published);
+ await _contentManager.UpdateAsync(topic);
+ return topic.ContentItemId;
+ }
+
+ public async Task JoinTeam(string teamContentItemId, string userName)
+ {
+ var user = await _session.Query(x => x.UserName == userName).FirstOrDefaultAsync();
+
+ if (user == null || !user.RoleNames.Contains("Hacker"))
+ {
+ return null;
+ }
+
+ if (user.HasTeam())
+ {
+ return null;
+ }
+
+ var team = await _contentManager.GetAsync(teamContentItemId);
+ if (team == null)
+ {
+ return null;
+ }
+
+ if (await IsTeamFull(teamContentItemId))
+ {
+ return null;
+ }
+
+ var contentItem = await GetSettings(user, "Hacker");
+
+ contentItem.Content.Hacker.Team = JObject.FromObject(new { ContentItemIds = new string[] { team.ContentItemId } });
+ user.Properties["Hacker"] = JObject.FromObject(contentItem);
+ _session.Save(user);
+
+ return team;
+ }
+
+ public async Task SelectNHackers(int n)
+ {
+ var users = await _session.Query(x => x.Roles.Contains("Hacker")).ListAsync();
+ var participants = await _session.QueryIndex(x => x.Roles.Contains("Hacker")).ListAsync();
+ var attendingParticipantList = participants.Where(x => x.WillAttend).ToList();
+ var notAttendingParticipantList = participants.Where(x => !x.WillAttend).ToList();
+
+ foreach (var participant in notAttendingParticipantList)
+ {
+ var user = users.Where(x => x.UserId == participant.UserId).FirstOrDefault();
+ if (user.HasTeam())
+ {
+ RemoveFromTeam(user);
+ }
+ _userManager.RemoveFromRoleAsync(user, "Hacker").GetAwaiter();
+ }
+
+ if (n < attendingParticipantList.Count)
+ {
+ attendingParticipantList.RemoveRange(0, n);
+
+ foreach (var participant in attendingParticipantList)
+ {
+ var user = users.Where(x => x.UserId == participant.UserId).FirstOrDefault();
+ if (user.HasTeam())
+ {
+ RemoveFromTeam(user);
+ }
+ _userManager.RemoveFromRoleAsync(user, "Hacker").GetAwaiter();
+ }
+ }
+
+ return true;
+ }
+
+ public async Task CheckIn()
+ {
+ var users = await _session.Query(x => x.Roles.Contains("Hacker") && !x.CheckIn).ListAsync();
+ var participants = await _session.QueryIndex(x => x.Roles.Contains("Hacker") && !x.CheckIn).ListAsync();
+
+ foreach (var participant in participants)
+ {
+ var user = users.Where(x => x.UserId == participant.UserId).FirstOrDefault();
+ if (user.HasTeam())
+ {
+ RemoveFromTeam(user);
+ }
+ _userManager.RemoveFromRoleAsync(user, "Hacker").GetAwaiter();
+ }
+
+ return true;
+ }
+
+ public async Task EliminateTeams()
+ {
+ var teams = await _session.Query(x => x.ContentType == "Team" && x.Published).ListAsync();
+ var challenges = await _session.Query(x => x.ContentType == "Challenge" && x.Published && x.Culture == "en" ).ListAsync();
+ var scores = await _session.Query(x => x.ContentType == "Score" && x.Published).ListAsync();
+ var teamsScores = new Dictionary();
+ var highestScore = 0;
+
+ foreach(var challenge in challenges)
+ {
+ var teamlist = teams.Where(x => x.Content.Team.Challenge.ContentItemIds.First == challenge.ContentItemId).ToList();
+ teamsScores.Clear();
+
+ if (teamlist.Count != 0)
+ {
+ foreach (var team in teamlist)
+ {
+ var scoreList = scores.Where(x => x.Content.Score.Team.ContentItemIds.First == team.ContentItemId).ToList();
+ var score = scoreList.Sum(x => x.Content.Score.Score.Value);
+
+ if (scoreList.Count != 0)
+ {
+ teamsScores.Add(team.ContentItemId, score);
+ }
+ }
+
+ highestScore = teamsScores.Max(x => x.Value);
+
+ foreach (var teamScore in teamsScores)
+ {
+ if (teamScore.Value == highestScore)
+ {
+ var team = teams.Where(x => x.ContentItemId == teamScore.Key).FirstOrDefault();
+ team.Content.Team.InTheRunning = JObject.FromObject(new { Value = true });
+ await _contentManager.UpdateAsync(team);
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+
+ private async void RemoveFromTeam(User user)
+ {
+ var team = await _session.Query(x => x.ContentItemId == user.GetTeamId() && x.ContentType == "Team" && x.Published).FirstOrDefaultAsync();
+ var teamContentItemId = user.GetTeamId();
+
+ //Remove user from team
+ var contentItem = await GetSettings(user, "Hacker");
+ contentItem.Content.Hacker.Team?.ContentItemIds.Clear();
+ user.Properties["Hacker"] = JObject.FromObject(contentItem);
+ _session.Save(user);
+
+ //if the team has no member left, delete it
+ if (await GetTeamMemberCount(teamContentItemId) > 0)
+ {
+ //if the user was the team captain, make another hacker the team captain
+ if (team.Content.Team?.TeamCaptain?.UserIds?.First == user.UserId)
+ {
+ var hacker = await _session.Query(x => x.TeamContentItemId == teamContentItemId).FirstOrDefaultAsync();
+ team.Content.Team.TeamCaptain = JObject.FromObject(new { UserIds = new string[] { hacker.UserId } });
+ await _contentManager.UpdateAsync(team);
+ }
+ }
+ else
+ {
+ await _contentManager.RemoveAsync(team);
+ }
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Services/ICandevService.cs b/src/Apps/StatCan.OrchardCore.Candev/Services/ICandevService.cs
new file mode 100644
index 000000000..213b973cd
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Services/ICandevService.cs
@@ -0,0 +1,34 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc.ModelBinding;
+using OrchardCore.ContentLocalization.Models;
+using OrchardCore.ContentManagement;
+using OrchardCore.Users.Models;
+
+namespace StatCan.OrchardCore.Candev.Services
+{
+ public interface ICandevService
+ {
+ Task GetParticipantAsync();
+ Task GetTeamMemberCount(string teamContentItemId);
+ Task> GetTeamMembers(string teamContentItemId);
+ Task TeamExists(string teamContentItemId);
+ Task IsTeamFull(string teamContentItemId);
+ Task CreateTeam(ModelStateDictionary modelState);
+ Task CreateTeam(string teamName, string[] topics);
+ Task JoinTeam(string teamContentItemId, ModelStateDictionary modelState);
+ Task JoinTeam(string teamContentItemId, string userName);
+ Task LeaveTeam(ModelStateDictionary modelState);
+ Task MatchTeams();
+ string RootUrl(string hackathonSlug);
+ Task RunUpdateHandlers();
+ Task RemoveTeamMember(string hackerContentItemId, ModelStateDictionary modelState);
+ Task SaveTeam(string teamName, string teamDescription, string challenge, ModelStateDictionary modelState);
+ Task AssignCases();
+ Task CreateChallenge(string challengeTitle);
+ Task CreateTopic(string topicName, string challengeId);
+ Task SelectNHackers(int n);
+ Task CheckIn();
+ Task EliminateTeams();
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Startup.cs b/src/Apps/StatCan.OrchardCore.Candev/Startup.cs
new file mode 100644
index 000000000..0c7d390ea
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Startup.cs
@@ -0,0 +1,69 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.Extensions.DependencyInjection;
+using OrchardCore.ContentManagement.Display.ContentDisplay;
+using OrchardCore.Data;
+using OrchardCore.Data.Migration;
+using OrchardCore.Environment.Commands;
+using OrchardCore.Modules;
+using OrchardCore.Navigation;
+using StatCan.OrchardCore.Candev.Commands;
+using StatCan.OrchardCore.Candev.Indexes;
+using StatCan.OrchardCore.Candev.Services;
+using System;
+using YesSql.Indexes;
+
+namespace StatCan.OrchardCore.Candev
+{
+ [Feature(FeatureIds.Candev)]
+ public class Startup : StartupBase
+ {
+ public override void ConfigureServices(IServiceCollection services)
+ {
+ services.AddScoped();
+ services.AddScoped();
+ services.AddSingleton();
+ services.AddSingleton();
+
+ services.AddScoped();
+ services.AddScoped();
+ services.AddScoped();
+ services.AddScoped();
+ services.AddScoped();
+ }
+
+ public override void Configure(IApplicationBuilder builder, IEndpointRouteBuilder routes, IServiceProvider serviceProvider)
+ {
+ routes.MapAreaControllerRoute(
+ name: "JoinTeam",
+ areaName: "StatCan.OrchardCore.Candev",
+ pattern: "team/join",
+ defaults: new { controller = "Candev", action = "JoinTeam" }
+ );
+ routes.MapAreaControllerRoute(
+ name: "LeaveTeam",
+ areaName: "StatCan.OrchardCore.Candev",
+ pattern: "team/leave",
+ defaults: new { controller = "Candev", action = "LeaveTeam" }
+ );
+ routes.MapAreaControllerRoute(
+ name: "CreateTeam",
+ areaName: "StatCan.OrchardCore.Candev",
+ pattern: "team/create",
+ defaults: new { controller = "Candev", action = "CreateTeam" }
+ );
+ routes.MapAreaControllerRoute(
+ name: "RemoveTeamMember",
+ areaName: "StatCan.OrchardCore.Candev",
+ pattern: "team/remove",
+ defaults: new { controller = "Candev", action = "RemoveTeamMember" }
+ );
+ routes.MapAreaControllerRoute(
+ name: "SaveTeam",
+ areaName: "StatCan.OrchardCore.Candev",
+ pattern: "team/save",
+ defaults: new { controller = "Candev", action = "SaveTeam" }
+ );
+ }
+ }
+}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/StatCan.OrchardCore.Candev.csproj b/src/Apps/StatCan.OrchardCore.Candev/StatCan.OrchardCore.Candev.csproj
new file mode 100644
index 000000000..cfa2a6484
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/StatCan.OrchardCore.Candev.csproj
@@ -0,0 +1,39 @@
+
+
+
+ $(AspNetCoreTargetFramework)
+ true
+ ..\..\..\roslynator.ruleset
+ StatCan.OrchardCore.Candev
+ StatCan.OrchardCore.Candev
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Admin/Index.cshtml b/src/Apps/StatCan.OrchardCore.Candev/Views/Admin/Index.cshtml
new file mode 100644
index 000000000..135f3449c
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Admin/Index.cshtml
@@ -0,0 +1,62 @@
+Hackathon management dashboard
+
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Content-Challenge.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/Content-Challenge.liquid
new file mode 100644
index 000000000..08e1db447
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Content-Challenge.liquid
@@ -0,0 +1,44 @@
+
+ {{ Model.ContentItem.Content.Challenge.Title.Text | shortcode }}
+
+ Statement
+ {{ Model.ContentItem.Content.Challenge.Statement.Text | shortcode }}
+
+ Datasets
+ {{ Model.ContentItem.Content.Challenge.Datasets.Text | shortcode }}
+ {{ Model.ContentItem.Content.Challenge.DatasetsFiles.Paths | shortcode }}
+ {% for dataset in Model.ContentItem.Content.Challenge.DatasetsFiles.Paths %}
+ {{ dataset }}
+ {% endfor %}
+
+ Background Information
+ {{ Model.ContentItem.Content.Challenge.BackgroundInformation.Text | shortcode }}
+
+ Keywords
+ {{ Model.ContentItem.Content.Challenge.Keywords.Text | shortcode }}
+
+ Organization Name
+ {{ Model.ContentItem.Content.Challenge.OrganizationNameEn.Text | shortcode }}
+
+ Organization Acronym
+ {{ Model.ContentItem.Content.Challenge.OrganizationAcronymEn.Text | shortcode }}
+
+ Contact Person
+ {{ Model.ContentItem.Content.Challenge.ContactPersonName.Text | shortcode }}
+ {{ Model.ContentItem.Content.Challenge.ContactPersonEmail.Text | shortcode }}
+
+ Technical Mentor
+ {{ Model.ContentItem.Content.Challenge.TechnicalMentorName.Text | shortcode }}
+ {{ Model.ContentItem.Content.Challenge.TechnicalMentorEmail.Text | shortcode }}
+
+ Case Specialist
+ {{ Model.ContentItem.Content.Challenge.CaseSpecialistName.Text | shortcode }}
+ {{ Model.ContentItem.Content.Challenge.CaseSpecialistEmail.Text | shortcode }}
+
+ Comments
+ {{ Model.ContentItem.Content.Challenge.Comments.Text | shortcode }}
+
+ Markdown
+ {{ Model.ContentItem.Content.MarkdownBodyPart.Markdown | markdownify | raw }}
+
+
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Content-Team-Buttons.SummaryAdmin.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/Content-Team-Buttons.SummaryAdmin.liquid
new file mode 100644
index 000000000..676e2bf14
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Content-Team-Buttons.SummaryAdmin.liquid
@@ -0,0 +1,6 @@
+{% assign teamMembers = Queries.GetHackersForTeam | query: teamContentItemId: Model.ContentItem.ContentItemId %}
+
+ {{ "Team" | t }}
+{% for member in teamMembers %}{{ member.ContactEmail }}{% if forloop.last == false %};{% endif%}{% endfor %}
+
+{% script src:'~/OrchardCore.Workflows/Scripts/crossbrowserclipboardcopy.min.js', debug_src:'~/OrchardCore.Workflows/Scripts/crossbrowserclipboardcopy.js', at:"Foot" %}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Content-Team.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/Content-Team.liquid
new file mode 100644
index 000000000..a16f6d4e2
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Content-Team.liquid
@@ -0,0 +1,99 @@
+{% assign challenges = Queries.GetItemsForHackathon | query: type: "Challenge" %}
+{% assign teamMembers = Queries.GetHackersForTeam | query: teamContentItemId: Model.ContentItem.ContentItemId %}
+{% assign challengeSelected = Model.ContentItem.Content.Team.Challenge.ContentItemIds | content_item_id %}
+{% assign userId = User | user_id %}
+
+{% capture challengeObjects %}
+[
+ {% for challenge in challenges %}
+ {% if challenge.Published == true %}
+ {
+ text: "{{challenge.DisplayText}}",
+ value: "{{challenge.ContentItemId}}"
+ }
+ {% if forloop.last != true %}
+ ,
+ {% endif %}
+ {% endif %}
+ {%endfor%}
+]
+{% endcapture %}
+
+
+
+
+{% block "script", At: "Foot", depends_on:"vuejs" %}
+Vue.component("team-component", {
+ template: "#TeamComponent",
+ data: function () {
+ return {
+ challenges: {{challengeObjects}}
+ };
+ }
+});
+{% endblock %}
+
+{% block "script", type:"text/html", At: "Foot", id: "TeamComponent" %}
+ {% if Model.ContentItem.Content.Team.TeamCaptain.UserIds.first == userId and Site.Properties.HackathonCustomSettings.TeamCustomSettings.TeamEditable.Value == true %}
+
+
+
+
+
+
+ {{ "Team Members" | t }}
+
+
+ {% for teamMember in teamMembers %}
+
+
+ {{ teamMember.FirstName }} {{ teamMember.LastName }}
+
+
+
+ {% endfor %}
+
+
+
+
+
+
+ {% endif %}
+{% endblock %}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/HackathonMessages.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/HackathonMessages.liquid
new file mode 100644
index 000000000..662a940e5
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/HackathonMessages.liquid
@@ -0,0 +1,5 @@
+
+ {% for message in Model.Messages %}
+ {{ message | shape_build_display | shape_render }}
+ {% endfor %}
+
\ No newline at end of file
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/UserFields.cshtml b/src/Apps/StatCan.OrchardCore.Candev/Views/UserFields.cshtml
new file mode 100644
index 000000000..db56dc31d
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/UserFields.cshtml
@@ -0,0 +1,22 @@
+@model OrchardCore.Users.ViewModels.SummaryAdminUserViewModel
+@inject Microsoft.AspNetCore.Identity.UserManager userManager;
+@{
+ var userRoleNames = await userManager.GetRolesAsync(Model.User);
+}
+
+@Model.User.UserName @Model.User.Email
+
+@foreach(var role in userRoleNames)
+ {
+
+ @role
+
+ }
+
+@if (!Model.User.IsEnabled)
+{
+
+ @T["Disabled"]
+
+}
+
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-ArchivedSolutions.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-ArchivedSolutions.liquid
new file mode 100644
index 000000000..44ab8ee13
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-ArchivedSolutions.liquid
@@ -0,0 +1,5645 @@
+{% capture jsonData %}
+[
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "CSPS"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "44qgygmb2d1h273k6p101dzcw4",
+ "Culture": "en"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Building an Intelligent Curriculum Framework"
+ },
+ "PotentialDatasets": {
+ "Html": "Main dataset
Curriculum of 600+ learning products
Core Subject Thesaurus
"
+ },
+ "BackgroundInformation": {
+ "Html": "The CSPS’ curriculum has 600+ learning products (e.g. online\r\nand in-class courses, videos, podcasts, web pages, job aids) developed in-house\r\nand acquired from third-party vendors. The content exists in numerous formats,\r\nincluding (e.g. texts, graphs, tables, maps, videos, etc.). CSPS wants to\r\nestablish a robust curriculum management and lifecycle framework; however,\r\ngetting started is proving to be challenging because of the extent of data that\r\nexists.
\r\n\r\nCourses have been attributed to the CSPS’ five business\r\nlines according to broad themes and product titles; however, no further triage\r\nhas occurred, and no curriculum architecture exists.
\r\n\r\n\r\n\r\nIssues
\r\n\r\nThere are several challenges with managing and maintaining a\r\nlarge, evolving curriculum, including:
\r\n\r\nClustering products based on related themes (e.g. products\r\nrelated to mental health); Being able to cluster based different on different data\r\npoints according to needs (e.g. by content, subject-matter, learning\r\nobjectives, target audience, mode of delivery, etc.); Identifying interdependencies among related products (e.g.\r\ndetermining how many products may be impacted by a single policy change); Identifying products that have similar, duplicate and/or\r\nconflicting content (e.g. 21 products under the “mental health” theme); Finding the appropriate groupings for products that\r\ntranscend multiple themes (e.g. a “New Supervisor” course that has modules on\r\nleadership, finance, HR, procurement, etc.); Searching the product inventory to see if content exists\r\nalready (e.g. when courses need to be added to the curriculum, or modified); \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nConsiderations
\r\n\r\nThe School will provide data in a CSV file; The curriculum includes a large amount of textual data.\r\nSome level of Natural Language Processing (NLP) will be required; Techniques such as Latent Dirichlet Analysis (LDA), Rapid\r\nAutomatic Keyword Extrraction (RAKE ) topic modelling and visualization tools\r\nlike pyLDAvis might be useful; The Government of Canada has developed and a Core SubjectThesaurus which could be a useful frame for metadata. \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nDeliverable
\r\n\r\nA service or solution that would allow the School to sift\r\nthrough and/or analyze course content from its entire catalogue of 600+\r\nproducts and address the challenges identify above. Data visualizations or\r\ncreative ways of representing the data and connections between elements of the\r\ncurriculum would be of great interest.
"
+ },
+ "OrganizationName": {
+ "Text": "Canadian School of Public Service"
+ },
+ "MentorName": {
+ "Text": "Christopher Allison"
+ },
+ "Statement": {
+ "Html": "Identify gaps, related and/or conflicting content, and outdated content from the Canadian School of Public Service's learning curriculum, and develop a robust curriculum architecture framework.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Intelligent Curriculum Framework Toolbox",
+ "Description": "This application allows the user to search through and analyze the data (a list of courses offered by the school) by various metrics. ",
+ "RepositoryUrl": "https://github.com/hughdingb58/candev_intelligent_curriculum_framework",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "20"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Vamsi",
+ "LastName": "Tamanala",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hugh",
+ "LastName": "Ding",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Boris",
+ "LastName": "Nzaramba",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Ebrahim ",
+ "LastName": "Allam",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "CourseConnector - A Visualization of the CSPS Curriculum",
+ "Description": "A data mining R script that extracts relevant data from the CSV file provided by CSPS for their business case. Parses the course descriptions, extracts keywords, and forms a wordcloud on a web app. ",
+ "RepositoryUrl": "https://github.com/wdond086/candev2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "22"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "WIlfried Tanezick",
+ "LastName": "Dondji Fogang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Jeff",
+ "LastName": "Cole",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Carson",
+ "LastName": "Fischl",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Building an Intelligent Curriculum Framework",
+ "Description": "To identify an automated method for matching the keywords of the new policy with the current courses and some other external courses.",
+ "RepositoryUrl": "https://github.com/mraahemi/Candev2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "25"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Hichem",
+ "LastName": "Sahraoui",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mohammad",
+ "LastName": "Raahemi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Danial",
+ "LastName": "Khorasanian",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hassan",
+ "LastName": "Ebrahimi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Team 2154 - CSPS NBSVM",
+ "Description": "Building an intelligent curriculum framework for the Canadian school of public service's learning curriculum",
+ "RepositoryUrl": "https://github.com/rossmattheww/candev_demo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "23"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Mohamed Yassine ",
+ "LastName": "Bouhamidi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Archit",
+ "LastName": "Bhatia",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Tate",
+ "LastName": "Sharp",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ross",
+ "LastName": "Matthew",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Modified database and LSTM based intelligent course scheduling web system.",
+ "Description": "Including algorithms: LDA, LSTM, RAKE. Implementation: Visualization, Back-end, Front-end, database, data engineering.
+Too much overlap in the database framework and .csv file and we tried to deal with it, and intelligence clustering algorithm to deal with manually or subjective error. Thinking NLP outlier detection method, ideally.",
+ "RepositoryUrl": "https://github.com/RichardChangCA/CANDEV-data-challenge-2113",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "12"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "15"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Lingfeng",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yuan",
+ "LastName": "Gao",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ao",
+ "LastName": "Peng",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "HONGFAN ",
+ "LastName": "Mu",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "CNDV_tSNE",
+ "Description": "This project uses transformer-based sentence embedding to vectorize and semantically understand descriptions of CSPS courses, after which clustering analysis is performed using tSNE dimensionality reduction. This allows for the understanding of course similarities on a non-superficial level, and as such the identification of areas of abundant and lacking curriculum cover.",
+ "RepositoryUrl": "https://github.com/Alunsto/CNDV_AI/",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "28"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "29"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "26"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "26.4"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Alun",
+ "LastName": "Stokes",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Geetha",
+ "LastName": "Jeyapragasan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Frances",
+ "LastName": "Lorenz",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Katarina",
+ "LastName": "Sacka",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "EFPC"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "44qgygmb2d1h273k6p101dzcw4",
+ "Culture": "fr"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Élaboration d'un cadre de programme d'études intelligent"
+ },
+ "PotentialDatasets": {
+ "Html": "Base de données principale
Programme d'études de plus de 600 produits d'apprentissage
Thésaurus des sujets de base
"
+ },
+ "BackgroundInformation": {
+ "Html": "Le programme d'études de l'EFPC compte plus de 600 produits d'apprentissage (p. ex., cours en ligne et en classe, vidéos, balados, pages Web, outils de travail) élaborés à l'interne et acquis auprès de fournisseurs tiers. Le contenu existe dans de nombreux formats (p. ex. textes, graphiques, tableaux, cartes, vidéos, etc.). L'EFPC veut établir un cadre de gestion solide des programmes d'études et du cycle de vie ; toutefois, le démarrage s'avère difficile en raison de l'étendue des données existantes. Les cours ont été attribués aux cinq secteurs d'activité de l'EFPC en fonction de thèmes généraux et de titres de produits. Toutefois, aucun autre tri n'a été effectué et il n'existe aucune architecture de programme d'études.
Enjeux
La gestion et le maintien d'un vaste programme d'études en évolution posent plusieurs défis, notamment :
Regrouper les produits en fonction de thèmes connexes (p. ex. produits liés à la santé mentale) ; Pouvoir regrouper les produits en fonction de différents points de données selon les besoins (p. ex. par contenu, sujet, objectifs d'apprentissage, public cible, mode de prestation, etc ;) Déterminer les interdépendances entre les produits connexes (p. ex. déterminer combien de produits peuvent être touchés par un seul changement de politique) ; Déterminer combien de produits peuvent être touchés par un seul changement de politique); Déterminer les produits qui ont un contenu similaire, qui font double emploi ou qui sont contradictoires (p. ex. 21 produits sous le thème de la \" santé mentale \") ; Trouver les groupes appropriés pour les produits qui transcendent les thèmes multiples (p. ex. un cours de \" nouveau superviseur \" qui comporte des modules sur le leadership, les finances, les RH, l'approvisionnement, etc; Recherche dans l'inventaire des produits pour voir si le contenu existe déjà (p. ex. lorsque des cours doivent être ajoutés au programme d'études ou modifiés). Considérations
L'École fournira les données dans un fichier CSV ; Le programme d'études comprend une grande quantité de données texte. Un certain niveau de traitement des langues naturelles (NLP) sera requis ; Des techniques telles que l'analyse des Dirichlets latents (LDA), la modélisation de sujets par extraction automatique rapide de mots-clés (RAKE ) et des outils de visualisation comme pyLDAvis pourraient être utiles ; Le gouvernement du Canada a élaboré un thésaurus des sujets de base qui pourrait constituer un cadre utile pour les métadonnées. Produit livrable
Un service ou une solution qui permettrait à l'École de passer au crible et/ou d'analyser le contenu des cours de son catalogue complet de plus de 600 produits et de relever les défis susmentionnés. Des visualisations de données ou des façons créatives de représenter les données et les liens entre les éléments du programme d'études seraient d'un grand intérêt.
"
+ },
+ "OrganizationName": {
+ "Text": "École de la fonction publique du Canada"
+ },
+ "MentorName": {
+ "Text": "Christopher Allison"
+ },
+ "Statement": {
+ "Html": "Identifier les lacunes, le contenu connexe ou contradictoire et le contenu désuet du programme d'apprentissage de l'École de la fonction publique du Canada, et élaborer un cadre d'architecture de programme d'études solide.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Intelligent Curriculum Framework Toolbox",
+ "Description": "This application allows the user to search through and analyze the data (a list of courses offered by the school) by various metrics. ",
+ "RepositoryUrl": "https://github.com/hughdingb58/candev_intelligent_curriculum_framework",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "20"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Vamsi",
+ "LastName": "Tamanala",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hugh",
+ "LastName": "Ding",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Boris",
+ "LastName": "Nzaramba",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Ebrahim ",
+ "LastName": "Allam",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "CourseConnector - A Visualization of the CSPS Curriculum",
+ "Description": "A data mining R script that extracts relevant data from the CSV file provided by CSPS for their business case. Parses the course descriptions, extracts keywords, and forms a wordcloud on a web app. ",
+ "RepositoryUrl": "https://github.com/wdond086/candev2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "22"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "WIlfried Tanezick",
+ "LastName": "Dondji Fogang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Jeff",
+ "LastName": "Cole",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Carson",
+ "LastName": "Fischl",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Building an Intelligent Curriculum Framework",
+ "Description": "To identify an automated method for matching the keywords of the new policy with the current courses and some other external courses.",
+ "RepositoryUrl": "https://github.com/mraahemi/Candev2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "25"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Hichem",
+ "LastName": "Sahraoui",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mohammad",
+ "LastName": "Raahemi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Danial",
+ "LastName": "Khorasanian",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hassan",
+ "LastName": "Ebrahimi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Team 2154 - CSPS NBSVM",
+ "Description": "Building an intelligent curriculum framework for the Canadian school of public service's learning curriculum",
+ "RepositoryUrl": "https://github.com/rossmattheww/candev_demo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "23"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Mohamed Yassine ",
+ "LastName": "Bouhamidi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Archit",
+ "LastName": "Bhatia",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Tate",
+ "LastName": "Sharp",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ross",
+ "LastName": "Matthew",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Modified database and LSTM based intelligent course scheduling web system.",
+ "Description": "Including algorithms: LDA, LSTM, RAKE. Implementation: Visualization, Back-end, Front-end, database, data engineering.
+Too much overlap in the database framework and .csv file and we tried to deal with it, and intelligence clustering algorithm to deal with manually or subjective error. Thinking NLP outlier detection method, ideally.",
+ "RepositoryUrl": "https://github.com/RichardChangCA/CANDEV-data-challenge-2113",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "12"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "15"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Lingfeng",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yuan",
+ "LastName": "Gao",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ao",
+ "LastName": "Peng",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "HONGFAN ",
+ "LastName": "Mu",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "CNDV_tSNE",
+ "Description": "This project uses transformer-based sentence embedding to vectorize and semantically understand descriptions of CSPS courses, after which clustering analysis is performed using tSNE dimensionality reduction. This allows for the understanding of course similarities on a non-superficial level, and as such the identification of areas of abundant and lacking curriculum cover.",
+ "RepositoryUrl": "https://github.com/Alunsto/CNDV_AI/",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "28"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "29"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "26"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "26.4"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Alun",
+ "LastName": "Stokes",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Geetha",
+ "LastName": "Jeyapragasan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Frances",
+ "LastName": "Lorenz",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Katarina",
+ "LastName": "Sacka",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "STATCAN_1"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4w22bqm4mqgn91wv6crgsrbtmm",
+ "Culture": "fr"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Données sur l'électricité en temps réel"
+ },
+ "PotentialDatasets": {
+ "Html": "Répertoire GitHub
Alberta Electric System Operator
Independent Electric System Operator (IESO) - Ontario
Newfoundland Labrador Board of Commissioners of Public Utilities
Nova Scotia Power
New-Brunswick Power
"
+ },
+ "BackgroundInformation": {
+ "Html": "StatCan\r\nrecueille actuellement de l'information mensuelle sur l'approvisionnement, la\r\ndisposition et le commerce de l'électricité. Ces données sont collectées par\r\nles enquêtes et ont un délai de publication de deux mois. Ces dernières années,\r\nles services publics, les gestionnaires de réseau et les gouvernements ont\r\ncommencé à publier en ligne des données plus viables et plus granulaires, qui\r\nsont collectées directement auprès du réseau électrique, des opérateurs et des\r\ngénérateurs. L'actualité de ces données va du courant (temps réel) à\r\nl’heure, quotidien ou hebdomadaire, ce qui représente une amélioration par\r\nrapport aux données mensuelles actuelles de StatCan.
\r\n\r\nCes\r\ndonnées d'exploitation de l'électricité en temps réel fournissent l'image la\r\nplus détaillée du réseau électrique du Canada et peuvent alimenter la\r\nmodélisation de futurs scénarios énergétiques, éclairer les politiques et\r\npermettre aux entreprises de prendre de meilleures décisions. Il n'y a\r\nactuellement aucun programme en place pour exploiter cette richesse de\r\n«mégadonnées».
\r\n\r\n\r\n\r\nLa\r\ncollecte des données de plusieurs sources et leur traitement automatique dans\r\nun format lisible est la priorité de ce projet. De plus, le système devrait\r\nêtre capable de gérer les différences de synchronisation et la variété des\r\ninformations disponibles à partir de sources en ligne (exemple: certains ont un\r\ndécalage de 24 heures contre un décalage d'une heure, certains publient en\r\ntemps réel, certains publient un intervalle de 5 minutes par rapport à des\r\nintervalles horaires). Concentrez-vous sur les données relatives à la demande\r\nréelle d'énergie (charge), qui devraient être recueillies au niveau provincial.
"
+ },
+ "OrganizationName": {
+ "Text": "Statistique Canada"
+ },
+ "MentorName": {
+ "Text": "Ivy Mckee, Jake Purdy, Olivier Godard, Joseph Kuchar"
+ },
+ "Statement": {
+ "Html": "En tant qu'analyste de données, j'aimerais être en mesure de recueillir, de traiter et de diffuser automatiquement des données sur l'électricité en temps réel à l'échelle provinciale et nationale. Cela permettrait d'améliorer la qualité et l'actualité des données pour l'élaboration et l'analyse des politiques, les scénarios de modélisation, ainsi que les décisions relatives aux échanges sur le marché et à l'équilibrage du réseau.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Real-Time Electricity Data",
+ "Description": "Data from 4 provinces is scrapped and displayed in a web app.",
+ "RepositoryUrl": "https://github.com/Selameab/CANDEV_DC",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Selameab",
+ "LastName": "Demilew",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ao",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mehardeep Singh",
+ "LastName": "Bhalla",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Md Atiqur",
+ "LastName": "Rahman",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Real-Time Electricity Data",
+ "Description": "We made a software that focus on getting real time data from different websites and demonstrate to user with graph. For users' convince and the need of saving data, the software provide data files to user as well.",
+ "RepositoryUrl": "https://github.com/DAOUDISOUFIANE/DATACHALLENGECANDEV",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "14"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "SOUFIANE",
+ "LastName": "DAOUDI",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Cheikh",
+ "LastName": "Ndoye",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Xudong",
+ "LastName": "Liu",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Real-time Electricity Data",
+ "Description": "We made a software on Real-time Electricity data getting the datas of a few real-time based sites using python. And we made a UI to represent the graphs of alberta's and novascotia electricity demand and supply ",
+ "RepositoryUrl": "https://github.com/DAOUDISOUFIANE/DATACHALLENGECANDEV",
+ "Scores": [
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Rajat",
+ "LastName": "Sen",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Khurram",
+ "LastName": "Shafiq",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "Real-Time Electricity Data Capture",
+ "Description": "Our code extracts electric load data from multiple provincial sources and compiles it into a single excel file.",
+ "RepositoryUrl": "https://github.com/matthewt154/DEVCan2020-Electricity-Grid-",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "22"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Thu",
+ "LastName": "Nguyen",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "McKenna",
+ "LastName": "Craven",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Matthew",
+ "LastName": "Tran",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Iyiola",
+ "LastName": "Aloko",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Nico Loreto",
+ "Description": "",
+ "RepositoryUrl": "https://github.com/nic23nic/CANDEV2184.git",
+ "Scores": [
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Mohammad",
+ "LastName": "Nokhbeh Zaeem",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Grant",
+ "LastName": "Wagner",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Omid",
+ "LastName": "Davoudi",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Nico",
+ "LastName": "Loreto",
+ "AttendedPresentation": ""
+ },
+ ]
+ },
+ {
+ "Name": "Dynamo Real Time Energy Stats",
+ "Description": "Dynamo provides real time power consumption for Ontario",
+ "RepositoryUrl": "https://github.com/filipp-g/dynamo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "22"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Filipp",
+ "LastName": "Gorodkov",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Elder",
+ "LastName": "Gomes Pereira",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Gaurav ",
+ "LastName": "Dewan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "SHAN",
+ "LastName": "THIND",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Real-Time National Electricity Load Visualizer ",
+ "Description": "We used Python and the Beautiful Soup package to webscrape various datasets for provincial supply/demand energy reports. We then visualized the data into a legible format in a Power BI dashboard. ",
+ "RepositoryUrl": "https://github.com/Shanemacisaac/CanDev2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "22"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "22"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "25.4"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Eli",
+ "LastName": "Faid",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Oliver",
+ "LastName": "Clarke",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mayson",
+ "LastName": "Fleury",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Shane",
+ "LastName": "MacIsaac",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "SCTC_1"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4h1c379beqkg6tvsx4706adv5m",
+ "Culture": "fr"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Explorer le financement gouvernemental pour les entreprises"
+ },
+ "PotentialDatasets": {
+ "Html": ""
+ },
+ "BackgroundInformation": {
+ "Html": "L'Unité centrale d'évaluation du rendement et de l'impact (UCEI), en partenariat avec Statistique Canada, travaille à relier les données sur les subventions et les contributions gouvernementales - en d'autres termes, le financement accordé aux entreprises et à certains organismes sans but lucratif pour soutenir l'innovation et la croissance des entreprises - aux données fiscales et à de nombreuses autres sources de données disponibles dans l'environnement de fichiers couplés de l'organisme statistique national. Pour établir cet ensemble de données, une nouvelle unité d'analyse a été identifiée, appelée \" volet de programme \". Le défi que doivent maintenant relever l'UCEI et STC est que les volets de programme n'existent pas techniquement dans le cadre de comptabilité financière, mais qu'ils sont nécessaires pour articuler la réalité des programmes au sein du gouvernement. Notre glossaire est joint pour fournir un contexte plus détaillé. Ces volets de programme changent en fait considérablement au fil du temps. Ils s'inspirent de divers mécanismes de comptabilité financière et fluctuent en fonction de ce que le gouvernement considère comme étant le mieux pour le pays, à mesure que l'économie évolue au fil du temps. À l'heure actuelle, il n'y a pas eu beaucoup d'analyse ou de visualisation des données à partir de cet ensemble de données, et un outil interactif quelconque serait utile pour préciser où se situent les changements et ce qu'ils reflètent. De plus, vous avez l'occasion de nous faire part des connaissances que vous pouvez tirer de nos données. Bien que nous travaillions sur certains tableaux préliminaires avec des données intégrées de Statistique Canada , il y a beaucoup de possibilités de travaux exploratoires, ainsi que de données ou d'aperçus supplémentaires que vous aimeriez ajouter. Nous aimerions beaucoup voir de nouvelles données, structurées ou non, ajoutées à cet important travail et nous espérons que vous avez des idées !
"
+ },
+ "OrganizationName": {
+ "Text": "Secrétariat du Conseil du Trésor du Canada"
+ },
+ "MentorName": {
+ "Text": "Shirely Steller, Jean-François Côté"
+ },
+ "Statement": {
+ "Html": "Créer des outils ou des applications de visualisation de données pour aider à dépeindre le paysage en constante évolution du financement gouvernemental aux entreprises. Nous avons besoin que vous élaboriez une meilleure façon d'explorer et de comprendre comment les programmes liés à l'innovation et à la croissance des entreprises soutiennent l'évolution au fil du temps.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Exploration of government funding through visualizations",
+ "Description": "Dashboard that will tell the story of how an organization spends money through both quantitative and qualitative measures, helping government make decisions. ",
+ "RepositoryUrl": "https://github.com/zorinahan1024/Candev_TBS2480",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "20"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Yu Tong(Zorina)",
+ "LastName": "Han",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hanan",
+ "LastName": "Ather",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Tanvi",
+ "LastName": "Adithan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Vincent",
+ "LastName": "Lam",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Databases! The Solution to all your Problems!",
+ "Description": "We've decided to work with the datasets we've been given by attempting to scrape and clean them, and put them into a database using python. Visualization and manipulation is done via a website allowing users to directly interact with the data",
+ "RepositoryUrl": "https://github.com/ChroniclerCherry/CANDEV2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "24"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Katarzyna",
+ "LastName": "Gocal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Julien",
+ "LastName": "Fried-Favreau",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ronald",
+ "LastName": "Tavarez",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yiminxue",
+ "LastName": "Zheng",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Analyzing if the funded businesses are actually worth to be funded",
+ "Description": "Health program, settlement program and total number of patents were analyzed with the amount of funding to find if the funded businesses have had positive impacts.",
+ "RepositoryUrl": "https://github.com/lee00516/Team-2144",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "19"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "20"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Yunxian",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hye Lim",
+ "LastName": "Lee",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Moh'd Kazem",
+ "LastName": "Al Tamimi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Kurian",
+ "LastName": "George Binu",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Treasury Board Data Visualization ",
+ "Description": "This project focuses on visualizing the change and growth of businesses across Canada based on grants and contribution received from the treasury board over time. ",
+ "RepositoryUrl": "https://github.com/oelnajmi/oelnajmi-Exploring-Government-Funding-to-Businesses-Candev2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "22"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Muhammad Anas",
+ "LastName": "Paracha",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Omar",
+ "LastName": "Elnajmi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Kareem",
+ "LastName": "Awad",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "analysis of government funding status",
+ "Description": "This project is developed to help depict the ever-changing landscape of Government funding to businesses. And the data is collected and stored in MySQL. Data features are extracted in Python and visualized with Plotly. ",
+ "RepositoryUrl": "https://github.com/feimlyang/candev_demo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "23"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "22"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Wenjie",
+ "LastName": "Chen",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Sainan",
+ "LastName": "Dong",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Manlin",
+ "LastName": "Guo",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "yun feng",
+ "LastName": "li",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Visualizing TBS Funding Data With Various Geographic Boundaries",
+ "Description": "A RShiny application depicting TBS grants and contributions data from 2013-2019, segmented by type of recipient and various geographic boundaries. ",
+ "RepositoryUrl": "https://github.com/QXiJohnny/CanDev-Sub",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Saran",
+ "LastName": "Vadlamudi",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "qianxiang",
+ "LastName": "zang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Linyi",
+ "LastName": "Guo",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Quanhan",
+ "LastName": "Xi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "TBS DataViz Drill Down",
+ "Description": "Lets you 'follow the money' by tracking government funding trends from a very macro level down to the exact companies that receive the grant money. Every webpage is automatically updated and created by scraping the web, no maintenance required",
+ "RepositoryUrl": "https://github.com/liamhebert/CAN-DEV2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "27"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "19.6"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "23.6"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Ken",
+ "LastName": "Lorbetskie",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Aman",
+ "LastName": "Riag",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Liam",
+ "LastName": "Hebert",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Idriss",
+ "LastName": "Amadou Ali",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "TBS_1"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4h1c379beqkg6tvsx4706adv5m",
+ "Culture": "en"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Exploring Government Funding to Businesses"
+ },
+ "PotentialDatasets": {
+ "Html": "
"
+ },
+ "BackgroundInformation": {
+ "Html": "The Central Performance and Impact Assessment Unit (CPIA),\r\nin partnership with Statistics Canada, is working to link government grant and\r\ncontribution data – in other words, funding provided to businesses and select\r\nnon-profits to support business innovation and growth – with tax data and many\r\nother data sources available through the national statistical agency’s linkable\r\nfile environment.
\r\n\r\n\r\n\r\nTo establish this dataset, a new unit of analysis was\r\nidentified, called the ‘program stream.’ The challenge now faced by CPIA and\r\nSTC is that program streams do not technically exist in the financial\r\naccounting framework, but are required to articulate the programming reality\r\nwithin government. Our glossary is attached to provide further context.
\r\n\r\n\r\n\r\nThese program streams actually change significantly over\r\ntime. They draw from a variety of financial accounting mechanisms and fluctuate\r\nbased on what the government sees as best for the country as the economy shifts\r\nover time. At the moment, there has not been much analysis or data\r\nvisualization done with this dataset and an interactive tool of some kind would\r\nbe helpful to articulate where changes are and what they reflect.
\r\n\r\n\r\n\r\nFurther, you have the opportunity to tell us what insights\r\nyou can gain from our data. While we are working on some preliminary tables\r\nwith Statistics Canada data linked in, there is a lot of opportunity for\r\nexploratory work, as well as any additional data or insights you would like to\r\nadd in. We would love to see new data, structured or unstructured, added to\r\nthis important work and hope you have some ideas!
"
+ },
+ "OrganizationName": {
+ "Text": "Treasury Board of Canada Secretariat"
+ },
+ "MentorName": {
+ "Text": "Shirely Steller, Jean-François Côté"
+ },
+ "Statement": {
+ "Html": "Create data visualization tools or apps to help depict the ever-changing landscape of Government funding to businesses. We need you to build a better way to explore and understand how programs related to business innovation and growth support change over time.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Exploration of government funding through visualizations",
+ "Description": "Dashboard that will tell the story of how an organization spends money through both quantitative and qualitative measures, helping government make decisions. ",
+ "RepositoryUrl": "https://github.com/zorinahan1024/Candev_TBS2480",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "20"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Yu Tong(Zorina)",
+ "LastName": "Han",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hanan",
+ "LastName": "Ather",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Tanvi",
+ "LastName": "Adithan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Vincent",
+ "LastName": "Lam",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Databases! The Solution to all your Problems!",
+ "Description": "We've decided to work with the datasets we've been given by attempting to scrape and clean them, and put them into a database using python. Visualization and manipulation is done via a website allowing users to directly interact with the data",
+ "RepositoryUrl": "https://github.com/ChroniclerCherry/CANDEV2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "24"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Katarzyna",
+ "LastName": "Gocal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Julien",
+ "LastName": "Fried-Favreau",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ronald",
+ "LastName": "Tavarez",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yiminxue",
+ "LastName": "Zheng",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Analyzing if the funded businesses are actually worth to be funded",
+ "Description": "Health program, settlement program and total number of patents were analyzed with the amount of funding to find if the funded businesses have had positive impacts.",
+ "RepositoryUrl": "https://github.com/lee00516/Team-2144",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "19"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "20"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Yunxian",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hye Lim",
+ "LastName": "Lee",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Moh'd Kazem",
+ "LastName": "Al Tamimi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Kurian",
+ "LastName": "George Binu",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Treasury Board Data Visualization ",
+ "Description": "This project focuses on visualizing the change and growth of businesses across Canada based on grants and contribution received from the treasury board over time. ",
+ "RepositoryUrl": "https://github.com/oelnajmi/oelnajmi-Exploring-Government-Funding-to-Businesses-Candev2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "22"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Muhammad Anas",
+ "LastName": "Paracha",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Omar",
+ "LastName": "Elnajmi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Kareem",
+ "LastName": "Awad",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "analysis of government funding status",
+ "Description": "This project is developed to help depict the ever-changing landscape of Government funding to businesses. And the data is collected and stored in MySQL. Data features are extracted in Python and visualized with Plotly. ",
+ "RepositoryUrl": "https://github.com/feimlyang/candev_demo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "23"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "22"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Wenjie",
+ "LastName": "Chen",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Sainan",
+ "LastName": "Dong",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Manlin",
+ "LastName": "Guo",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "yun feng",
+ "LastName": "li",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Visualizing TBS Funding Data With Various Geographic Boundaries",
+ "Description": "A RShiny application depicting TBS grants and contributions data from 2013-2019, segmented by type of recipient and various geographic boundaries. ",
+ "RepositoryUrl": "https://github.com/QXiJohnny/CanDev-Sub",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Saran",
+ "LastName": "Vadlamudi",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "qianxiang",
+ "LastName": "zang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Linyi",
+ "LastName": "Guo",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Quanhan",
+ "LastName": "Xi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "TBS DataViz Drill Down",
+ "Description": "Lets you 'follow the money' by tracking government funding trends from a very macro level down to the exact companies that receive the grant money. Every webpage is automatically updated and created by scraping the web, no maintenance required",
+ "RepositoryUrl": "https://github.com/liamhebert/CAN-DEV2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "27"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "19.6"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "23.6"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Ken",
+ "LastName": "Lorbetskie",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Aman",
+ "LastName": "Riag",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Liam",
+ "LastName": "Hebert",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Idriss",
+ "LastName": "Amadou Ali",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "STATCAN_1"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4w22bqm4mqgn91wv6crgsrbtmm",
+ "Culture": "en"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Real-Time Electricity Data"
+ },
+ "PotentialDatasets": {
+ "Html": "GitHub repo
Alberta Electric System Operator
Independent Electric System Operator (IESO) - Ontario
Newfoundland Labrador Board of Commissioners of Public Utilities
Nova Scotia Power
New-Brunswick Power
"
+ },
+ "BackgroundInformation": {
+ "Html": "StatCan currently collects information on electricity supply, disposition and trade on a monthly basis. This data is collected via survey, and has a publication lag of two months. In recent years, utilities, system operators, and governments have begun to publish more timely and granular data online, which is collected directly from the electricity grid, operators and generators. The timeliness of this data ranges from current (real time) to hourly, daily or weekly – all of which is an improvement over StatCan’s currently monthly data. These real-time electricity operating data provide the most detailed picture of Canada’s electrical grid, and can feed into modelling of future energy scenarios, inform policy, and allow companies to make better decisions. There is currently no program in place to harness this wealth of “big data”. Collecting the data from multiple sources and automatically processing it into a legible format is the top priority for this project. Additionally, the system should be able to handle the timing differences and variety of information available from online sources (example: Some have 24 hours lag vs 1 hour lag, some publish in real time, some publish 5 minute interval vs hourly intervals.). Focus on data related to actual energy demand (load), which should be collected at the provincial level.
"
+ },
+ "OrganizationName": {
+ "Text": "Statistics Canada"
+ },
+ "MentorName": {
+ "Text": "Ivy Mckee, Olivier Godard, Jake Purdy, Joseph Kuchar"
+ },
+ "Statement": {
+ "Html": "As a data analyst, I would like to be able to automatically collect, process and disseminate real-time electricity data at the provincial and national level. This would improve data quality and timeliness for policy making and analysis, modelling scenarios, as well as market trading and system balancing decisions.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Real-Time Electricity Data",
+ "Description": "Data from 4 provinces is scrapped and displayed in a web app.",
+ "RepositoryUrl": "https://github.com/Selameab/CANDEV_DC",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Selameab",
+ "LastName": "Demilew",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ao",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mehardeep Singh",
+ "LastName": "Bhalla",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Md Atiqur",
+ "LastName": "Rahman",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Real-Time Electricity Data",
+ "Description": "We made a software that focus on getting real time data from different websites and demonstrate to user with graph. For users' convince and the need of saving data, the software provide data files to user as well.",
+ "RepositoryUrl": "https://github.com/DAOUDISOUFIANE/DATACHALLENGECANDEV",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "14"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "SOUFIANE",
+ "LastName": "DAOUDI",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Cheikh",
+ "LastName": "Ndoye",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Xudong",
+ "LastName": "Liu",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Real-time Electricity Data",
+ "Description": "We made a software on Real-time Electricity data getting the datas of a few real-time based sites using python. And we made a UI to represent the graphs of alberta's and novascotia electricity demand and supply ",
+ "RepositoryUrl": "https://github.com/DAOUDISOUFIANE/DATACHALLENGECANDEV",
+ "Scores": [
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Rajat",
+ "LastName": "Sen",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Khurram",
+ "LastName": "Shafiq",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "Real-Time Electricity Data Capture",
+ "Description": "Our code extracts electric load data from multiple provincial sources and compiles it into a single excel file.",
+ "RepositoryUrl": "https://github.com/matthewt154/DEVCan2020-Electricity-Grid-",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "22"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Thu",
+ "LastName": "Nguyen",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "McKenna",
+ "LastName": "Craven",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Matthew",
+ "LastName": "Tran",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Iyiola",
+ "LastName": "Aloko",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Nico Loreto",
+ "Description": "",
+ "RepositoryUrl": "https://github.com/nic23nic/CANDEV2184.git",
+ "Scores": [
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Mohammad",
+ "LastName": "Nokhbeh Zaeem",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Grant",
+ "LastName": "Wagner",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Omid",
+ "LastName": "Davoudi",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Nico",
+ "LastName": "Loreto",
+ "AttendedPresentation": ""
+ },
+ ]
+ },
+ {
+ "Name": "Dynamo Real Time Energy Stats",
+ "Description": "Dynamo provides real time power consumption for Ontario",
+ "RepositoryUrl": "https://github.com/filipp-g/dynamo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "22"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Filipp",
+ "LastName": "Gorodkov",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Elder",
+ "LastName": "Gomes Pereira",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Gaurav ",
+ "LastName": "Dewan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "SHAN",
+ "LastName": "THIND",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Real-Time National Electricity Load Visualizer ",
+ "Description": "We used Python and the Beautiful Soup package to webscrape various datasets for provincial supply/demand energy reports. We then visualized the data into a legible format in a Power BI dashboard. ",
+ "RepositoryUrl": "https://github.com/Shanemacisaac/CanDev2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "22"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "22"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "25.4"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Eli",
+ "LastName": "Faid",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Oliver",
+ "LastName": "Clarke",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mayson",
+ "LastName": "Fleury",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Shane",
+ "LastName": "MacIsaac",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "CER"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4nbgwbk1k7zg33y8r7j4kqwyxt",
+ "Culture": "en"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Re-imagining Energy Data"
+ },
+ "PotentialDatasets": {
+ "Html": "NFC tags and bookmarks with NFC tags will be made available during the event. Here is the complete guide to NFC tags.
Here are the datasets you can potentially use:
"
+ },
+ "BackgroundInformation": {
+ "Html": "Code for Canada, in collaboration with the Canada Energy\r\nRegulator, is exploring new uses of our datasets found in our regulatory documents\r\ndatabase: REGDOCS . In the link to each\r\ndataset, you will learn more about how regulatory instruments, engagement, and\r\nhearing orders help residents of Canada, including landowners, scientists,\r\nstudents, and Indigenous communities, fully participate in the national energy\r\ndialogue. It is difficult to find this information in REGDOCS and use it for\r\nnew insights about our land, public engagement, and progress in our hearings\r\nabout energy projects. Your creativity and innovation will guide direction for\r\nincreasing accessibility, discoverability, and participation within the process\r\nof how energy projects are developed and how residents in Canada can learn\r\nabout energy data. Learn more about what we are doing at the Canada Energy\r\nRegulator, in our co-design sessions, software testing with Indigenous users\r\nand prototyping new ideas here . Learn\r\nmore about hearings and regulatory instruments here .
"
+ },
+ "OrganizationName": {
+ "Text": "Canada Energy Regulator"
+ },
+ "MentorName": {
+ "Text": "Lequanne Collins-Bacchus, Ryan Hum, Roan Reimer"
+ },
+ "Statement": {
+ "Html": "Help re-imagine how the Canada Energy Regulator provides data to the public. Using Near-Field Communication (NFC) and machine learning, we would love to explore new, exciting ways of understanding and using our energy data.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Data Visualization and Representation through IoT",
+ "Description": "Using IoT and block chain technology to make data accessible to various groups of people. ",
+ "RepositoryUrl": "https://github.com/NaomiH167/Candev2",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "6"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "11"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Houda",
+ "LastName": "Nkaili",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mathew",
+ "LastName": "George Binu",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Meryem",
+ "LastName": "Nadak",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Naomi",
+ "LastName": "Halder",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Recommended Information to share energy data with people",
+ "Description": "In this presentation, we presented an idea about sharing energy data with users ",
+ "RepositoryUrl": "https://github.com/mohsenrzp/CANDEV_2587",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "4"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "7"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Mohsen",
+ "LastName": "Rezapour Toughari",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "cissokho",
+ "LastName": "youssouph",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Analyzing Permit Processing Times",
+ "Description": "Our project grabs all permit PDFs and processes the text in order to analyze permit processing times.",
+ "RepositoryUrl": "https://github.com/fatimasajadi/candev_fgteam",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Ghazal",
+ "LastName": "Fouladfard",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Fatima",
+ "LastName": "Sajadi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Cyber Preparedness of Critical Infrastructure",
+ "Description": "Critical Infrastructure is a high value target in the era of cyber and hybrid warfare. Complex regulations and regulatory hierarchies make it difficult to provide clarity and transparency in the process of ensuring compliance with standards of the Critical Infrastructure Protection Program.
+We provide a visualization of the state of compliance by companies responsible for power generation, distribution, and delivery with respect to applicable standards, and an estimate of the risk incurred by non compliance. ",
+ "RepositoryUrl": "https://github.com/dimonoid/candev2491",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "25"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "19"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Hanh Trinh",
+ "LastName": "Nguyen",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Pierfrancesco",
+ "LastName": "Cervellini",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Gregory",
+ "LastName": "Wilson",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Dima",
+ "LastName": "Cherepovskyi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Group letter of Comment by Writers Information",
+ "Description": "Organizing and Visualizing comment letters. By location, writer's type, Theme, project being addressed and project location",
+ "RepositoryUrl": "https://github.com/zweldemichael/CANDEV",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Zelalem",
+ "LastName": "WELDEMICHAEL ",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Tasneema",
+ "LastName": "Pathan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Eric",
+ "LastName": "Baxter",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Biwei",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Regulating Pipeline Accidents Using Natural Language Processing",
+ "Description": "Used graph convolutional neural networks as a tool for natural language processing. Applied the model pipeline accident reports, thereby identifying the most common contributors to accidents. This reveals evidence-based targets for regulatory exploration and provides a risk-model for industry management.",
+ "RepositoryUrl": "https://docs.google.com/presentation/d/11vGtvD8wqkLsLjh2YDKcXELhxg66Dl4MmtZ7P7dos8Y/edit?usp=sharing",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "17"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "15"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Ana",
+ "LastName": "Farias",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yuteng",
+ "LastName": "Zeng",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Shabnam Parveen",
+ "LastName": "Pathan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Evan",
+ "LastName": "Thomas",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Data Reality",
+ "Description": "Augmented reality using big data.
+https://prezi.com/view/SDoVntVg5m5qdmZMXj2n/",
+ "RepositoryUrl": "https://github.com/pvafaie/candev_demo.git",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "10"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Amirhossein",
+ "LastName": "Moosavi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Shahin",
+ "LastName": "Basiratzadeh",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Parsa",
+ "LastName": "Vafaie",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Masoud",
+ "LastName": "Dorrikhteh",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Energy 4 Energy",
+ "Description": "We propose a new product/business model on how to engage the public while ensuring Energy Data values are delivered. ",
+ "RepositoryUrl": "https://github.com/Abbycoco71/Team-2150.git",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "4"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "11"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Jinay",
+ "LastName": "Shah",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Lindsay",
+ "LastName": "Dorder",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Razieh",
+ "LastName": "Mansouri",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Wenjia (Abby)",
+ "LastName": "Yang",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "REGDOCS Analysis",
+ "Description": "Extracted letter receivers from document text and visualized/analyzed sender/receiver connections as a graph using Neo4J
+Built doc2vec model and visualized contents using TSNE and NLP principles",
+ "RepositoryUrl": "https://github.com/ThinhHong/CanDev",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "20"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "22.4"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "22.1"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Quang-Vinh",
+ "LastName": "Do",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Thinh",
+ "LastName": "Hong",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Shaafici",
+ "LastName": "Ali",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "REC"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4nbgwbk1k7zg33y8r7j4kqwyxt",
+ "Culture": "fr"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Ré-imaginer les données sur l'énergie"
+ },
+ "PotentialDatasets": {
+ "Html": "Des tags NFC et des signets avec des tags CNF seront mis à votre disposition pendant l'événement. Voici le guide complet des tags CNF.
Voici des ensembles de données que vous pouvez potentiellement utiliser :
"
+ },
+ "BackgroundInformation": {
+ "Html": "Code for Canada, en collaboration avec la Régie de l'énergie du Canada, développe de nouvelles utilisations de nos ensembles de données se trouvant dans notre base de données des documents de réglementation, REGDOCS . Dans le lien vers chaque ensemble de données, vous en apprendrez davantage sur la façon dont les instruments de réglementation, la participation et les ordonnances d'audience aident les résidents du Canada, y compris les propriétaires fonciers, les scientifiques, les étudiants et les collectivités autochtones, à participer pleinement au dialogue national sur l'énergie. Il est difficile de trouver cette information dans REGDOCS et de l'utiliser pour obtenir de nouveaux points de vue sur nos terres, la participation du public et les progrès de nos audiences sur les projets énergétiques. Votre créativité et votre innovation guideront l'orientation à prendre pour accroître l'accessibilité, la possibilité de découverte et la participation au processus d'élaboration des projets énergétiques et à la façon dont les résidents du Canada peuvent se renseigner sur les données énergétiques. Pour en savoir plus sur ce que nous faisons à la Régie de l'énergie du Canada, dans le cadre de nos séances de conception, de l'essai de logiciels avec des utilisateurs autochtones et du prototypage de nouvelles idées, cliquez sur le lien suivant . Pour en savoir plus sur les audiences et les instruments de réglementation, consultez le site suivant .
"
+ },
+ "OrganizationName": {
+ "Text": "Régie de l'énergie du Canada"
+ },
+ "MentorName": {
+ "Text": "Lequanne Collins-Bacchus, Ryan Hum, Roan Reimer"
+ },
+ "Statement": {
+ "Html": "Aidez à réimaginer la façon dont la Régie de l'énergie du Canada fournit ses données au public. Grâce à la communication en champ proche (CNF) et à l'apprentissage machine, nous aimerions explorer de nouvelles et passionnantes façons de comprendre et d'utiliser nos données sur l'énergie.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Data Visualization and Representation through IoT",
+ "Description": "Using IoT and block chain technology to make data accessible to various groups of people. ",
+ "RepositoryUrl": "https://github.com/NaomiH167/Candev2",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "6"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "11"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Houda",
+ "LastName": "Nkaili",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mathew",
+ "LastName": "George Binu",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Meryem",
+ "LastName": "Nadak",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Naomi",
+ "LastName": "Halder",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Recommended Information to share energy data with people",
+ "Description": "In this presentation, we presented an idea about sharing energy data with users ",
+ "RepositoryUrl": "https://github.com/mohsenrzp/CANDEV_2587",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "4"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "7"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Mohsen",
+ "LastName": "Rezapour Toughari",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "cissokho",
+ "LastName": "youssouph",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Analyzing Permit Processing Times",
+ "Description": "Our project grabs all permit PDFs and processes the text in order to analyze permit processing times.",
+ "RepositoryUrl": "https://github.com/fatimasajadi/candev_fgteam",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Ghazal",
+ "LastName": "Fouladfard",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Fatima",
+ "LastName": "Sajadi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Cyber Preparedness of Critical Infrastructure",
+ "Description": "Critical Infrastructure is a high value target in the era of cyber and hybrid warfare. Complex regulations and regulatory hierarchies make it difficult to provide clarity and transparency in the process of ensuring compliance with standards of the Critical Infrastructure Protection Program.
+We provide a visualization of the state of compliance by companies responsible for power generation, distribution, and delivery with respect to applicable standards, and an estimate of the risk incurred by non compliance. ",
+ "RepositoryUrl": "https://github.com/dimonoid/candev2491",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "25"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "19"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Hanh Trinh",
+ "LastName": "Nguyen",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Pierfrancesco",
+ "LastName": "Cervellini",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Gregory",
+ "LastName": "Wilson",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Dima",
+ "LastName": "Cherepovskyi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Group letter of Comment by Writers Information",
+ "Description": "Organizing and Visualizing comment letters. By location, writer's type, Theme, project being addressed and project location",
+ "RepositoryUrl": "https://github.com/zweldemichael/CANDEV",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Zelalem",
+ "LastName": "WELDEMICHAEL ",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Tasneema",
+ "LastName": "Pathan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Eric",
+ "LastName": "Baxter",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Biwei",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Regulating Pipeline Accidents Using Natural Language Processing",
+ "Description": "Used graph convolutional neural networks as a tool for natural language processing. Applied the model pipeline accident reports, thereby identifying the most common contributors to accidents. This reveals evidence-based targets for regulatory exploration and provides a risk-model for industry management.",
+ "RepositoryUrl": "https://docs.google.com/presentation/d/11vGtvD8wqkLsLjh2YDKcXELhxg66Dl4MmtZ7P7dos8Y/edit?usp=sharing",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "17"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "15"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Ana",
+ "LastName": "Farias",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yuteng",
+ "LastName": "Zeng",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Shabnam Parveen",
+ "LastName": "Pathan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Evan",
+ "LastName": "Thomas",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Data Reality",
+ "Description": "Augmented reality using big data.
+https://prezi.com/view/SDoVntVg5m5qdmZMXj2n/",
+ "RepositoryUrl": "https://github.com/pvafaie/candev_demo.git",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "10"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Amirhossein",
+ "LastName": "Moosavi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Shahin",
+ "LastName": "Basiratzadeh",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Parsa",
+ "LastName": "Vafaie",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Masoud",
+ "LastName": "Dorrikhteh",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Energy 4 Energy",
+ "Description": "We propose a new product/business model on how to engage the public while ensuring Energy Data values are delivered. ",
+ "RepositoryUrl": "https://github.com/Abbycoco71/Team-2150.git",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "4"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "11"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Jinay",
+ "LastName": "Shah",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Lindsay",
+ "LastName": "Dorder",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Razieh",
+ "LastName": "Mansouri",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Wenjia (Abby)",
+ "LastName": "Yang",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "REGDOCS Analysis",
+ "Description": "Extracted letter receivers from document text and visualized/analyzed sender/receiver connections as a graph using Neo4J
+Built doc2vec model and visualized contents using TSNE and NLP principles",
+ "RepositoryUrl": "https://github.com/ThinhHong/CanDev",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "20"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "22.4"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "22.1"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Quang-Vinh",
+ "LastName": "Do",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Thinh",
+ "LastName": "Hong",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Shaafici",
+ "LastName": "Ali",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "RCMP"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4ar93nvxr6fek01dgvrr3c5s5y",
+ "Culture": "en"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Uncovering Modern Policing Talent"
+ },
+ "PotentialDatasets": {
+ "Html": "Feel free to develop additional sets of skills or competencies for profiles if you find justifications (e.g. plays sports: agents, participates in hackathons: cyber policing) likewise if you find \"trends\" based on the current RCMP population and associated skills and competencies. This is open for your assessment.
"
+ },
+ "BackgroundInformation": {
+ "Html": "Federal Policing is an RCMP business line often requiring\r\nmore specialized skills to effectively address the changing and often more\r\ncomplex world of federal and international crime and criminality. This can\r\nrange from transnational organized crime to cybercrime.
Top tasks performed include:
\r\n\r\nInvestigative Tasks
\r\n\r\n
Receive/act upon a complaint or information received\r\nalleging a particular offense or concern Assess and prioritize actions to be taken in response to\r\nan occurrence Organize, establish and manage investigative priorities on\r\nnumerous engagements with competing priorities Identify origins, potential suspects, crime pattern, and\r\navenues of investigation Conduct background investigation on individuals,\r\ncorporations, business entities using available computer data systems Determine which directions to pursue and what additional\r\nevidence needs to be collected \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nCyber-specific Tasks
\r\n\r\n
Conducts extensive digital analyses of large volumes of\r\ndigital evidence from lawfully seized digital devices and data using a variety\r\nof tools and techniques, and is able to interpret large amounts of digital\r\nevidence. Plans, designs, programs, customizes and maintains\r\nspecialized systems, and the reconstruction of digital environments. \r\n\r\n\r\n\r\n\r\n\r\nStakeholders and users: RCMP hiring managers and HR personnel.
\r\n\r\nBusiness process: When an HR need is identified, there are\r\ntwo likely scenarios: an existing position is vacant and needs to be filled or\r\na position has not yet been created. If the position exists, the works\r\ndescription is used to create a job poster that outlines the skills and\r\ncompetencies required to qualify for the job. If the position does not exist, a\r\nwork description must be developed before further steps can be taken.
"
+ },
+ "OrganizationName": {
+ "Text": "Royal Canadian Mounted Police"
+ },
+ "MentorName": {
+ "Text": "Emma MacNeil, Colleen Ryan"
+ },
+ "Statement": {
+ "Html": "As the Royal Canadian Mounted Police (RCMP) seeks to find and refine the more specialized nature of our work (ranging from transnational organized crime to cybercrime), we require a more strategic and systematic way to: 1) define the specific skills and competencies required to carry out particularly specialized tasks; 2) locate the education programs/courses that develop these skills and competencies; 3) isolate the tools that would best enable us to assess the required skills and competencies; and 4) locate people across Canada who may already possess those skills and competencies. (ex. the final product could be a system that matches public profile data with \"personas\" you create for each policing stream you develop i.e. cyber, international, federal agent, etc.)
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Systemically Discovering Modern Police Talent",
+ "Description": "We understand that jobs are described as a set of tasks to be preformed.
+Our goal is to describe these tasks as a set of qualifications.
+We have identified key skills required to be proficient at a specific task.
+We intend to build a data management system which can stream line the hiring process.
+This also means that future hiring can use the information to better inform their decision making.
+The goal is to keep job descriptions classified in terms of task, skills, and qualification.
+This way, future policing challenges can reference specific common tasks to dynamically populate a list of job requirements.
+These terms can be used by HR professionals to scrub resume data for attractive applicants.",
+ "RepositoryUrl": "https://github.com/CosmaticSalad/CanDev2020_T2569",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "20"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "18"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Georges",
+ "LastName": "Djoumna",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Zavi",
+ "LastName": "Benaissa",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yilin",
+ "LastName": "Yang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Daimei",
+ "LastName": "Fu",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Uncovering Modern Policing Talent (RCMP)_Team 2097",
+ "Description": "We use the data from Linkedin to extract important skills or variables about hiring criminal position in RCMP based on PCA and Logistic Regression. ",
+ "RepositoryUrl": "https://github.com/Mujingrui/candev_demo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "12"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "14"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Bing",
+ "LastName": "Wang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yi",
+ "LastName": "Luo ",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Jingrui",
+ "LastName": "Mu",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yi",
+ "LastName": "Li",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "SmartPol",
+ "Description": "It is a smart police recruitment system that leverages the use of Artificial intelligence and machine learning to analyze and automate the existing system.",
+ "RepositoryUrl": "https://github.com/sourabhagarwal07/Candev_demo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "17"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "22.7"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Sourabh",
+ "LastName": "Agarwal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Rahul",
+ "LastName": "Sharma",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Arpit",
+ "LastName": "Rathore",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ruvita",
+ "LastName": "Sharma",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "GRC"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4ar93nvxr6fek01dgvrr3c5s5y",
+ "Culture": "fr"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Dépister le talent des policiers modernes"
+ },
+ "PotentialDatasets": {
+ "Html": "N'hésitez pas à développer d'autres ensembles d'aptitudes ou de compétences pour les profils si vous trouvez des justifications (p. ex. \" fait du sport \" : agents, \" participe à des hackathons \" : cyberpolice), de même si vous trouvez des \" tendances \" fondées sur la population actuelle de la GRC et les aptitudes et compétences connexes. Vous pouvez évaluer cette situation.
"
+ },
+ "BackgroundInformation": {
+ "Html": "La police fédérale est un secteur d'activité de la GRC qui exige souvent des compétences plus spécialisées pour faire face efficacement au monde changeant et souvent plus complexe de la criminalité et du crime fédéral et international. Cela peut aller du crime organisé transnational à la cybercriminalité.
Tâches d'enquête
Recevoir/agir suite à une plainte ou une information reçue alléguant une infraction ou une préoccupation particulière Évaluer et hiérarchiser les mesures à prendre en réponse à un événement Organiser, établir et gérer les priorités d'enquête sur de nombreux engagements ayant des priorités concurrentes Identifier les origines, les suspects potentiels, le type de criminalité et les pistes d'enquête Mener une enquête sur les personnes, les sociétés et les entreprises utilisant les systèmes de données informatiques disponibles Déterminer les orientations à suivre et les preuves supplémentaires à recueillir Tâches spécifiques au cybernétique
Effectue des analyses numériques approfondies de grandes quantités de preuves numériques provenant d'appareils et de données numériques saisis légalement en utilisant une variété d'outils et de techniques, et est capable d'interpréter de grandes quantités de preuves numériques. Planifie, conçoit, programme, personnalise et entretient des systèmes spécialisés, ainsi que la reconstruction d'environnements numériques.\r\nParties prenantes et utilisateurs : Les responsables du recrutement de la GRC et le personnel des RH. Intervenants et utilisateurs : Gestionnaires de l'embauche et personnel des RH de la GRC.
Processus d'affaires : Lorsqu'un besoin en RH est identifié, il existe deux scénarios probables : un poste existant est vacant et doit être pourvu ou un poste n'a pas encore été créé. Si le poste existe, la description de travail est utilisée pour créer une affiche de paoste qui décrit les aptitudes et les compétences requises pour se qualifier pour le poste. Si le poste n'existe pas, une description de travail doit être élaborée avant que d'autres mesures puissent être prises.
"
+ },
+ "OrganizationName": {
+ "Text": "Gendarmerie royale du Canada"
+ },
+ "MentorName": {
+ "Text": "Emma MacNeil, Colleen Ryan"
+ },
+ "Statement": {
+ "Html": "Alors que la Gendarmerie royale du Canada (GRC) cherche à trouver et à préciser la nature plus spécialisée de son travail (qui va du crime organisé transnational à la cybercriminalité), nous avons besoin d'un moyen plus stratégique et plus systématique de : 1) définir les aptitudes et les compétences particulières requises pour exécuter des tâches particulièrement spécialisées ; 2) trouver les programmes ou les cours d'éducation qui permettent d'acquérir ces aptitudes et ces compétences ; 3) isoler les outils qui nous permettraient le mieux d'évaluer les aptitudes et les compétences requises ; et 4) trouver des personnes au Canada qui pourraient déjà posséder ces aptitudes et ces compétences. (p. ex. le produit final pourrait être un système qui fait correspondre les données sur le profil public avec les \" personnalités \" que vous créez pour chaque filière policière que vous développez, c.-à-d. cyber, internationale, agent fédéral, etc.)
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Systemically Discovering Modern Police Talent",
+ "Description": "We understand that jobs are described as a set of tasks to be preformed.
+Our goal is to describe these tasks as a set of qualifications.
+We have identified key skills required to be proficient at a specific task.
+We intend to build a data management system which can stream line the hiring process.
+This also means that future hiring can use the information to better inform their decision making.
+The goal is to keep job descriptions classified in terms of task, skills, and qualification.
+This way, future policing challenges can reference specific common tasks to dynamically populate a list of job requirements.
+These terms can be used by HR professionals to scrub resume data for attractive applicants.",
+ "RepositoryUrl": "https://github.com/CosmaticSalad/CanDev2020_T2569",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "20"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "18"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Georges",
+ "LastName": "Djoumna",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Zavi",
+ "LastName": "Benaissa",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yilin",
+ "LastName": "Yang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Daimei",
+ "LastName": "Fu",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Uncovering Modern Policing Talent (RCMP)_Team 2097",
+ "Description": "We use the data from Linkedin to extract important skills or variables about hiring criminal position in RCMP based on PCA and Logistic Regression. ",
+ "RepositoryUrl": "https://github.com/Mujingrui/candev_demo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "12"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "14"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Bing",
+ "LastName": "Wang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yi",
+ "LastName": "Luo ",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Jingrui",
+ "LastName": "Mu",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yi",
+ "LastName": "Li",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "SmartPol",
+ "Description": "It is a smart police recruitment system that leverages the use of Artificial intelligence and machine learning to analyze and automate the existing system.",
+ "RepositoryUrl": "https://github.com/sourabhagarwal07/Candev_demo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "17"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "22.7"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Sourabh",
+ "LastName": "Agarwal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Rahul",
+ "LastName": "Sharma",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Arpit",
+ "LastName": "Rathore",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ruvita",
+ "LastName": "Sharma",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "DFO"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4s2fcd0qznqrery5s86wv2nndy",
+ "Culture": "en"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Processing Marine Vessels Location Data"
+ },
+ "PotentialDatasets": {
+ "Html": "Introduction
Specifications
Decoder (Not Tested – Download and use at own risk)
https://arundaleais.github.io/docs/ais/ais_decoder.html https://ais-decoder.software.informer.com/3.1/ https://help.fleetmon.com/en/articles/2010882-ais-decoder https://www.yachtingsoftware.com/aisplotter-lite---free-download_c23.aspx Ship Data Websites
"
+ },
+ "BackgroundInformation": {
+ "Html": "AIS is the marine Automatic Identification System fitted to\r\nmarine vessels, navigation markers, and certain types of shore stations in our\r\ncoastal water systems. Understanding the location and trajectory of marine\r\nvessels is critically important to DFO in their efforts to avoid collisions\r\nwith marine mammals such as the endangered North American Right Whales, and\r\nSouthern Resident Killer Whales.
\r\n\r\n\r\n\r\nThe challenge with AIS transmitted data is that it comes to\r\nus in ASCII data packets filled with cryptic representations of critical\r\ninformation such as latitude, longitude, speed, course and other important\r\ninformation. DFO personnel often require subsets of the AIS data. In some\r\ncases, only vessel position and track are required while in others, detailed\r\nknowledge of vessel type, tonnage, etc. may also be required. The result is\r\nthat over time many scientist have written individual programs, often in different\r\nprogramming languages and running on separate operating system, in an attempted\r\nto parse out the data they required for their scientific research.
"
+ },
+ "OrganizationName": {
+ "Text": "Fisheries and Oceans Canada"
+ },
+ "MentorName": {
+ "Text": "Peter OBlenis, James Theriault"
+ },
+ "Statement": {
+ "Html": "Use open source software tools to design a better marine Automatic Identification System (AIS) data processing system. This new system would be able to parse all of the information in the source AIS data stream and then stores the processed AIS information in a database so that DFO scientists can simply access a central processed database to retrieve their AIS data requirements.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Improved AIS Data Processing System",
+ "Description": "Improved the AIS Data Processing System and answered complex business questions",
+ "RepositoryUrl": "https://github.com/RyanxLoi/CANDEV_Challenge_AIS",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "17"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "8"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Dennis",
+ "LastName": "Zhu",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Michele",
+ "LastName": "Lambardi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Chiedu",
+ "LastName": "Okwechime",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ryan",
+ "LastName": "Loi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Leverage AIS",
+ "Description": "We did EDA on given data after cleaning it and used R to calculate Vessel density. We also created a small demo API to access data.",
+ "RepositoryUrl": "https://github.com/shivam-31/Team-2223-CANDEV-",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "20"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "20"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "vincy",
+ "LastName": "wang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Haitian",
+ "LastName": "Zhong",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "xiaomeng",
+ "LastName": "zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Shivam ",
+ "LastName": "Singh",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "CANDEV AIS Processing and Filtering Tool",
+ "Description": "Process raw AIS data into usable .csv documents for data analysis. Provides options for user to filter data as they see fit.",
+ "RepositoryUrl": "https://github.com/aelshatshat/CANDEV-AIS-Tool",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "23"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Jenna",
+ "LastName": "Olson",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ryan",
+ "LastName": "McCarron",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Colin",
+ "LastName": "McFarlane",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ahmed",
+ "LastName": "El Shatshat",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "coffeeAis",
+ "Description": "The only cost is a cup of coffee.",
+ "RepositoryUrl": "https://github.com/jzhang1/CANDEV-2020-Team2112/blob/master/test.py",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "25"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "24"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Jeffery",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Rui",
+ "LastName": "Li",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Weihan",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Junzheng",
+ "LastName": "Wu",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "My Fisheries My Oceans - Group 2472",
+ "Description": "We start by parsing through the raw data to extract relevant information concerning the problems to be solved. We then included a model for an application that could be used by both administrators and users in the network, with different functions available to each category.",
+ "RepositoryUrl": "https://github.com/CANDEV-AIS-Group-Number-2472/CANDEV_2020_2472",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "23"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Bhavika",
+ "LastName": "Sewpal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Abdulaziz",
+ "LastName": "Almoallim",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Harveen",
+ "LastName": "Grewal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ali",
+ "LastName": "Reghigh ",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "Assessment and Proposed Plan for AIS Data Challenge ",
+ "Description": "Overall plan for efficient data cleaning, sparsing, and analysis for raw AIS message. Our design was based in an understanding of how data scientists may be working on various projects. ",
+ "RepositoryUrl": "https://github.com/queenofscotts/CANDEV-AIS-TEAMX",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "28"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "25"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "23"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "24.4"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Hira",
+ "LastName": "Khan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mary ",
+ "LastName": "Scott",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Lama ",
+ "LastName": "Elnaggar",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Zaina",
+ "LastName": "Kahiel",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "MPO"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4s2fcd0qznqrery5s86wv2nndy",
+ "Culture": "fr"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Traitement des données sur la localisation des navires"
+ },
+ "PotentialDatasets": {
+ "Html": "Introduction
Information complémentaire
Décodeur (Non testé - Téléchargement et utilisation à vos risques et périls)
https://arundaleais.github.io/docs/ais/ais_decoder.html https://ais-decoder.software.informer.com/3.1/ https://help.fleetmon.com/en/articles/2010882-ais-decoder https://www.yachtingsoftware.com/aisplotter-lite---free-download_c23.aspx Sites Web de données sur les navires
"
+ },
+ "BackgroundInformation": {
+ "Html": "Le SIA est le système d'identification automatique maritime dont sont équipés les navires, les balises de navigation et certains types de stations côtières dans nos systèmes d'eaux côtières. Il est essentiel que le MPO comprenne l'emplacement et la trajectoire des navires pour éviter les collisions avec les mammifères marins comme la baleine noire de l'Amérique du Nord, une espèce en voie de disparition, et les épaulards résidents du Sud. Le défi que posent les données transmises par les SIA est qu'elles nous parviennent dans des paquets de données ASCII remplis de représentations cryptiques d'informations critiques comme la latitude, la longitude, la vitesse, la trajectoire et d'autres informations importantes. Le personnel du MPO a souvent besoin de sous-ensembles de données du SIA. Dans certains cas, seules la position et la trajectoire du navire sont requises, tandis que dans d'autres, une connaissance détaillée du type de navire, du tonnage, etc. peuvent également être nécessaires. Il s'ensuit qu'avec le temps, de nombreux scientifiques ont écrit des programmes uniques, souvent dans des langages de programmation différents et fonctionnant sur des systèmes d'exploitation distincts, pour obtenir et analyser les données dont ils avaient besoin pour leurs recherches scientifiques.
"
+ },
+ "OrganizationName": {
+ "Text": "Pêches et Océans Canada"
+ },
+ "MentorName": {
+ "Text": "Peter OBlenis, James Theriault"
+ },
+ "Statement": {
+ "Html": "Utiliser des outils provenant de logiciels open source pour concevoir un meilleur système de traitement des données du Système d'identification automatique (SIA) maritime. Ce nouveau système serait capable d'analyser toute l'information du flux de données source et ensuite de stocker l'information traitée dans une seule base de données centrale, afin que les scientifiques de Pêches et Océans Canada puissent accéder simplement les données dont ils ont besoin.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Improved AIS Data Processing System",
+ "Description": "Improved the AIS Data Processing System and answered complex business questions",
+ "RepositoryUrl": "https://github.com/RyanxLoi/CANDEV_Challenge_AIS",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "17"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "8"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Dennis",
+ "LastName": "Zhu",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Michele",
+ "LastName": "Lambardi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Chiedu",
+ "LastName": "Okwechime",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ryan",
+ "LastName": "Loi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Leverage AIS",
+ "Description": "We did EDA on given data after cleaning it and used R to calculate Vessel density. We also created a small demo API to access data.",
+ "RepositoryUrl": "https://github.com/shivam-31/Team-2223-CANDEV-",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "20"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "20"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "vincy",
+ "LastName": "wang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Haitian",
+ "LastName": "Zhong",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "xiaomeng",
+ "LastName": "zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Shivam ",
+ "LastName": "Singh",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "CANDEV AIS Processing and Filtering Tool",
+ "Description": "Process raw AIS data into usable .csv documents for data analysis. Provides options for user to filter data as they see fit.",
+ "RepositoryUrl": "https://github.com/aelshatshat/CANDEV-AIS-Tool",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "23"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Jenna",
+ "LastName": "Olson",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ryan",
+ "LastName": "McCarron",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Colin",
+ "LastName": "McFarlane",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ahmed",
+ "LastName": "El Shatshat",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "coffeeAis",
+ "Description": "The only cost is a cup of coffee.",
+ "RepositoryUrl": "https://github.com/jzhang1/CANDEV-2020-Team2112/blob/master/test.py",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "25"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "24"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Jeffery",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Rui",
+ "LastName": "Li",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Weihan",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Junzheng",
+ "LastName": "Wu",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "My Fisheries My Oceans - Group 2472",
+ "Description": "We start by parsing through the raw data to extract relevant information concerning the problems to be solved. We then included a model for an application that could be used by both administrators and users in the network, with different functions available to each category.",
+ "RepositoryUrl": "https://github.com/CANDEV-AIS-Group-Number-2472/CANDEV_2020_2472",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "24"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "23"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Bhavika",
+ "LastName": "Sewpal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Abdulaziz",
+ "LastName": "Almoallim",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Harveen",
+ "LastName": "Grewal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ali",
+ "LastName": "Reghigh ",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "Assessment and Proposed Plan for AIS Data Challenge ",
+ "Description": "Overall plan for efficient data cleaning, sparsing, and analysis for raw AIS message. Our design was based in an understanding of how data scientists may be working on various projects. ",
+ "RepositoryUrl": "https://github.com/queenofscotts/CANDEV-AIS-TEAMX",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "28"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "25"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "23"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "24.4"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Hira",
+ "LastName": "Khan",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mary ",
+ "LastName": "Scott",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Lama ",
+ "LastName": "Elnaggar",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Zaina",
+ "LastName": "Kahiel",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "ISED"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "47xfjk5xkgkgyv58r6p6sjecxx",
+ "Culture": "en"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Communication and Marketing Dashboard"
+ },
+ "PotentialDatasets": {
+ "Html": "Main repository covering:
Social Media Data
Social Media Terms and Definitions Glossary Datasets Web Data
Webtrends definitions available online Datasets Contact Centre Data
ISED Contact Centre Tagging Definitions Datasets Media Relations
Media Relations Tagging Definitions Datasets Public Opinion Research (POR) Data
"
+ },
+ "BackgroundInformation": {
+ "Html": "About Innovation, Science and Economic Development Portfolio
\r\n\r\nInnovation, Science and Economic Development (ISED) is a\r\nfederal government department that works in partnerships with other departments\r\nas part of the ISED portfolio. ISED works with Canadians in all areas of the\r\neconomy and in all parts of the country to improve conditions for investment,\r\nenhance Canada's innovation performance, increase Canada's share of global trade\r\nand build a fair, efficient and competitive marketplace. ISED’s mission is to\r\nfoster a growing, competitive and knowledge-based Canadian economy. The department’s mandate drives all activities and services\r\noffered by ISED, such as the programs and initiatives.
\r\n\r\n\r\n\r\nAbout Strategic Communications and Marketing Sector (SCMS)
\r\n\r\nThe experts in at SCMS advise all ISED employees about\r\nCommunications and Marketing. Multiple teams exist in our group such as web\r\ndevelopment contact centre, social media, public opinion research, media\r\nrelations, etc. Although teams collaborate and avoid working in silos, the\r\nsector’s data is stored in various tracking and evaluation systems. This\r\nprevents us from having a coordinated approach to metrics and data analytics to\r\nsupport evidence-based decision-making.
\r\n\r\n\r\n\r\nWe need to standardize and formalize the use of data to\r\nensure our activities achieve the best results and that we continuously improve\r\nby learning from our insights. This approach would not only benefit us as\r\ncommunications and marketing experts, but also all ISED employees developing\r\nprograms and services with the end goal of helping Canadians and the economy.
\r\n\r\n\r\n\r\nCurrently the evaluation of communications and marketing\r\ncampaign is marginal and data analytics tools and techniques are minimal. The\r\ndata is kept in silos and requests for integrated reporting must be done\r\nmanually by every team.
"
+ },
+ "OrganizationName": {
+ "Text": "Innovation, Science and Economic Development"
+ },
+ "MentorName": {
+ "Text": "Cezary Gesikowski, Xavier Patry"
+ },
+ "Statement": {
+ "Html": "As a communication and marketing specialist, I want to provide my senior management with a suite of dynamic interactive visualizations that combine a variety of data (contact centre, social media, web, public opinion research, media relations, etc.) with the goal of storytelling. These products should align with the various business lines and ministerial responsibilities within ISED. The outcome of these products can explore, but not be limited to the following:
Evaluating communications and marketing efforts Comparing the effectiveness of various communications channels Providing a visual representation of data to guide evidence-based strategy development and decision-making "
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Visualization of the ISED problem",
+ "Description": "A Power Bi Dashboard tool, to understand and interpret ISED marketing numbers with ease. ",
+ "RepositoryUrl": "https://github.com/kishdubey/ISED_CANDEV",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "11"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "15"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Sarthak",
+ "LastName": "Rajpal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Kish",
+ "LastName": "Dubey",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Manav ",
+ "LastName": "Patel",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Aditi",
+ "LastName": "Singh",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "ISED_2170",
+ "Description": "Tool to evaluate impact of social media over contact center/media relations of ISED",
+ "RepositoryUrl": "https://github.com/adil659/CANDEV2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Nizamuddin Mansoor ",
+ "LastName": "Sardar ",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Siraj ",
+ "LastName": "Ahmed",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Adil",
+ "LastName": "Ughratdar",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Abdul Jabbar",
+ "LastName": "Siddiqui",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Communication and Marketing Dashboard ",
+ "Description": "The team compiled data to build a high level dashboard which can assist management to make decisions regarding Communication and Marketing policies and directions for ISED Canada",
+ "RepositoryUrl": "https://github.com/shar0489/can-dev-team2191.git",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "14"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "14"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "hang ",
+ "LastName": "gong",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Fan",
+ "LastName": "Wu",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Rashad",
+ "LastName": "Sharaf",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Vishal",
+ "LastName": "Rajak",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "ISED Website traffic analysis, and Media Relations performance. ",
+ "Description": "1-Analysed the website traffic. Showing visitors' location on a world map, helps us learn where are they from using Tableau. And analysis on the data in the following aspects: query text analysis, impressions based on page titles, time spent on pages based on page titles, impressions based on time of day and day of week, and impressions based on locations. This analysis was done using python notebooks under jupyter.
+2- Analysis on Media Relations enquires and tickets using PowerBi",
+ "RepositoryUrl": "https://github.com/aloshalaa1992/CAVDEV2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Alaa Eddin",
+ "LastName": "Alchalabi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Fang",
+ "LastName": "Chen",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Clara",
+ "LastName": "Ghali",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Aqeel",
+ "LastName": "Baqar",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "Handy dashboard synergising website and social media data ",
+ "Description": "This is a communication and customer interaction dashboard designed for the Marketing and Communication team. ",
+ "RepositoryUrl": "https://github.com/coffeeboost/CANDEV_solution",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "19"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Anant ",
+ "LastName": "Ojha ",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Gordon",
+ "LastName": "Tang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Kelvin",
+ "LastName": "Du",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yassine",
+ "LastName": "Sarifuddin",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Dongjin",
+ "LastName": "Shin",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Team Number - 2319 , Vidhi Mistry, Rani Adhaduk, Michael Agyei-Kena, Gaurish Kohli",
+ "Description": "An interactive user-friendly social analytics dashboard developed to aid decision making process and strategy building for social media marketing.",
+ "RepositoryUrl": "https://github.com/vidhi-mistry/CANDEV_2019_Socialytics",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "25"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "21.3"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "22.4"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Gaurish",
+ "LastName": "Kohli",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Rani",
+ "LastName": "Adhaduk",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Vidhi",
+ "LastName": "Mistry",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Michael",
+ "LastName": "Agyei-Kena",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "ISDE"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "47xfjk5xkgkgyv58r6p6sjecxx",
+ "Culture": "fr"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Tableau de bord de la communication et du marketing"
+ },
+ "PotentialDatasets": {
+ "Html": "Répertoire qui couvre :
Données sur les médias sociaux
Glossaire des termes et définitions des médias sociaux Ensembles de données Données Web
Définitions des tendances Web disponibles en ligne Ensembles de données Données du centre de contact
Tags des centres de contact d'ISED Ensembles de données Relations avec les médias
Relations avec les médias - Définitions des tags Ensembles de données Données de recherche sur l'opinion publique (ROP)
Définitions Ensembles de données "
+ },
+ "BackgroundInformation": {
+ "Html": "À propos du ministère de l'Innovation, de la Science et du Développement économique
Innovation, science et développement économique (ISDE) est un ministère du gouvernement fédéral qui travaille en partenariat avec d'autres ministères dans le cadre du mandat d'ISDE. L'ISDE travaille avec les Canadiens dans tous les secteurs de l'économie et dans toutes les régions du pays afin d'améliorer les conditions d'investissement, de rehausser la performance du Canada en matière d'innovation, d'accroître la part du Canada dans le commerce mondial et de bâtir un marché équitable, efficace et concurrentiel. La mission d'ISDE est de favoriser une économie canadienne croissante, compétitive et fondée sur le savoir. Le mandat du Ministère oriente toutes les activités et tous les services offerts par l'ISDE, tels les programmes et les initiatives. À propos du Secteur des communications stratégiques et du marketing (SCMS)
Les experts du SCMS conseillent tous les employés d'ISDE en matière de communication et de marketing. Plusieurs équipes existent dans notre groupe comme le centre de contact pour le développement web, les médias sociaux, la recherche sur l'opinion publique, les relations avec les médias, etc. Bien que les équipes collaborent et évitent de travailler en silos, les données du secteur sont stockées dans divers systèmes de suivi et d'évaluation. Cela nous empêche d'avoir une approche coordonnée des mesures et de l'analyse des données pour appuyer la prise de décisions fondées sur des données probantes.
Nous devons normaliser et officialiser l'utilisation des données pour nous assurer que nos activités donnent les meilleurs résultats et que nous nous améliorons continuellement en apprenant de nos observations. Cette approche serait bénéfique non seulement pour nous, en tant qu'experts en communications et en marketing, mais aussi pour tous les employés d'ISDE qui élaborent des programmes et des services dans le but ultime d'aider les Canadiens et l'économie.
Actuellement, l'évaluation des campagnes de communication et de marketing est marginale et les outils et techniques d'analyse des données sont minimes. Les données sont conservées en silos et les demandes de rapports intégrés doivent être faites manuellement par chaque équipe.
"
+ },
+ "OrganizationName": {
+ "Text": "Innovation, Sciences et Développement économique Canada"
+ },
+ "MentorName": {
+ "Text": "Cezary Gesikowski, Xavier Patry"
+ },
+ "Statement": {
+ "Html": "En tant que spécialiste en communication et marketing, je veux offrir à mes cadres supérieurs une série de visualisations interactives qui combinent une variété de données (centre de contact, médias sociaux, web, recherche sur l'opinion publique, relations avec les médias, etc.). Ces produits devraient s'harmoniser avec les divers secteurs d'activité et les responsabilités ministérielles au sein d'Innovation, Sciences et Développement économique Canada. Les résultats de ces produits peuvent explorer, sans s'y limiter, les domaines suivants :
Évaluer les efforts de communication et de marketing Comparer l'efficacité des divers canaux de communication Fournir une représentation visuelle des données pour guider l'élaboration de stratégies et la prise de décisions fondées sur des données probantes "
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Visualization of the ISED problem",
+ "Description": "A Power Bi Dashboard tool, to understand and interpret ISED marketing numbers with ease. ",
+ "RepositoryUrl": "https://github.com/kishdubey/ISED_CANDEV",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "11"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "15"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Sarthak",
+ "LastName": "Rajpal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Kish",
+ "LastName": "Dubey",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Manav ",
+ "LastName": "Patel",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Aditi",
+ "LastName": "Singh",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "ISED_2170",
+ "Description": "Tool to evaluate impact of social media over contact center/media relations of ISED",
+ "RepositoryUrl": "https://github.com/adil659/CANDEV2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Nizamuddin Mansoor ",
+ "LastName": "Sardar ",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Siraj ",
+ "LastName": "Ahmed",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Adil",
+ "LastName": "Ughratdar",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Abdul Jabbar",
+ "LastName": "Siddiqui",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Communication and Marketing Dashboard ",
+ "Description": "The team compiled data to build a high level dashboard which can assist management to make decisions regarding Communication and Marketing policies and directions for ISED Canada",
+ "RepositoryUrl": "https://github.com/shar0489/can-dev-team2191.git",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "14"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "14"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "hang ",
+ "LastName": "gong",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Fan",
+ "LastName": "Wu",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Rashad",
+ "LastName": "Sharaf",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Vishal",
+ "LastName": "Rajak",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "ISED Website traffic analysis, and Media Relations performance. ",
+ "Description": "1-Analysed the website traffic. Showing visitors' location on a world map, helps us learn where are they from using Tableau. And analysis on the data in the following aspects: query text analysis, impressions based on page titles, time spent on pages based on page titles, impressions based on time of day and day of week, and impressions based on locations. This analysis was done using python notebooks under jupyter.
+2- Analysis on Media Relations enquires and tickets using PowerBi",
+ "RepositoryUrl": "https://github.com/aloshalaa1992/CAVDEV2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Alaa Eddin",
+ "LastName": "Alchalabi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Fang",
+ "LastName": "Chen",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Clara",
+ "LastName": "Ghali",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Aqeel",
+ "LastName": "Baqar",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "Handy dashboard synergising website and social media data ",
+ "Description": "This is a communication and customer interaction dashboard designed for the Marketing and Communication team. ",
+ "RepositoryUrl": "https://github.com/coffeeboost/CANDEV_solution",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "19"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Anant ",
+ "LastName": "Ojha ",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Gordon",
+ "LastName": "Tang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Kelvin",
+ "LastName": "Du",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Yassine",
+ "LastName": "Sarifuddin",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Dongjin",
+ "LastName": "Shin",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Team Number - 2319 , Vidhi Mistry, Rani Adhaduk, Michael Agyei-Kena, Gaurish Kohli",
+ "Description": "An interactive user-friendly social analytics dashboard developed to aid decision making process and strategy building for social media marketing.",
+ "RepositoryUrl": "https://github.com/vidhi-mistry/CANDEV_2019_Socialytics",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "26"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "25"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "21.3"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "22.4"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Gaurish",
+ "LastName": "Kohli",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Rani",
+ "LastName": "Adhaduk",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Vidhi",
+ "LastName": "Mistry",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Michael",
+ "LastName": "Agyei-Kena",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "INFC"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4rahtes02jxn0sc5r47e6756dn",
+ "Culture": "fr"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Découvrir le potentiel du Canada pour les villes intelligentes"
+ },
+ "PotentialDatasets": {
+ "Html": "Ressources de données à considérer
Gouvernements ouverts à travers le Canada : https://ouvert.canada.ca/fr/cartes/donnees-ouvertes-au-canada Portail du gouvernement ouvert : https://open.canada.ca/fr Base de données sur les décisions de financement des IRSC : http://webapps.cihr-irsc.gc.ca/decisions/p/main.html?lang=fr#sort=namesort%20asc&start=0&rows=20 Moteur de recherche des attributions du CRSH : https://www.sshrc-crsh.gc.ca/results-resultats/award_search-recherche_attributions/index-fra.aspx Base de données sur les subventions et bourses du CRSNG : https://www.nserc-crsng.gc.ca/ase-oro/index_fra.asp Programme de données communautaires : https://communitydata.ca/ Principales statistiques, bases de données et publications de l'OCDE sur la STI : https://www.oecd.org/innovation/stistatistics.htm Trousse d'outils de la science des données UrbanSim : https://urbansim.com/udst Données de StatCan: https://www144.statcan.gc.ca/sdg-odd/goal-objectif11-eng.htm Autres ressources à considérer
NordOuvert (OpenNorth) : https://www.nordouvert.ca/ Guide de l'Open Smart Cities : https://www.opennorth.ca/publications/#open-smart-cities-guide État des villes intelligentes ouvertes au Canada : https://www.opennorth.ca/publications/#the-state-of-open-smart-communities-2019 Villes d'Avenir Canada (Future Cities Canada) : https://futurecitiescanada.ca/fr/ Comment faire preuve d'intelligence dans les villes de taille moyenne en Ontario : https://futurecitiescanada.ca/downloads/2018/FCC_MSC_TechData_201807_REV.pdf OCDE/Bloomberg Philanthropies : Renforcer la capacité d'innovation dans les administrations municipales : https://www.oecd.org/publications/enhancing-innovation-capacity-in-city-government-f10c96e5-en.htm Carte OCDE/Bloomberg de l'innovation dans les villes : https://cities-innovation-oecd.com/ Boîte à outils numérique de l'OCDE : https://goingdigital.oecd.org/en/ et https://www.oecd.org/going-digital/ Conseil mondial sur les données urbaines (WCCD) : https://www.dataforcities.org/ McMaster University Smart City Technologies au Canada : https://mcmaster.maps.arcgis.com/apps/MapSeries/index.html?appid=e785bc894ee94ccebf31feda573b35e4 Enquête sur les infrastructures publiques essentielles du Canada : https://www.infrastructure.gc.ca/plan/ccpi-ipec-fra.html\r\n "
+ },
+ "BackgroundInformation": {
+ "Html": "Le paysage numérique du Canada est en pleine évolution. Par\r\nconséquent, les municipalités sont à l'avant-garde de ce changement - elles\r\ninvestissent dans de nouvelles pratiques numériques, techniques et de données\r\net adoptent des \" approches de ville intelligente \" [1] pour\r\naméliorer la qualité de vie de leurs citoyens. De plus, les gouvernements\r\nmunicipaux améliorent leurs compétences en matière de données numériques et\r\nleurs structures de gouvernance pour s'adapter à la dynamique des projets\r\nd'infrastructure public-privé en réponse aux nouveaux mouvements\r\ntechnologiques. Le gouvernement du Canada est conscient de ce changement et\r\ndoit établir une méthode pour mieux comprendre et identifier les
\r\n\r\n\r\n\r\n
Les municipalités qui s'engagent dans des approches de\r\nvilles intelligentes Facteurs qui permettent ou non aux municipalités d'avoir\r\nla capacité d'innover et de mettre en œuvre des technologies intelligentes Lacunes et limites des connaissances au sein des\r\ngouvernements fédéral et municipaux et des organismes tiers au sujet du secteur\r\nde l'innovation du Canada (universités, secteur public, secteur privé) \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nOn ignore ce qui rend certaines collectivités plus\r\nsusceptibles d'adopter de nouvelles technologies et d'innover en matière de\r\nstratégies pour résoudre les problèmes auxquels font face leurs citoyens. Les\r\ngrands centres d'innovation des villes comme Vancouver et Surrey, en\r\nColombie-Britannique [2], Toronto, en Ontario [3] et Montréal, au Québec [4]\r\nsont des chefs de file en matière de progrès technologique et ont depuis\r\nlongtemps recours à des stratégies et à des plans numériques pour transformer\r\nleurs espaces urbains afin qu'ils soient plus interconnectés, plus efficaces et\r\nplus durables. D'autre part, des collectivités beaucoup plus petites comme\r\nBridgewater, en Nouvelle-Écosse [5], Innisfil, en Ontario [6] et St. Albert, en\r\nAlberta [7] ont également adopté des approches progressives pour mettre en\r\nœuvre des technologies de villes intelligentes, alors que d'autres ne l'ont pas\r\nfait.
\r\n\r\n\r\n\r\nQuestions d'orientations
\r\n\r\n
Quels sont les facteurs qui déterminent la propension\r\nd'une municipalité à adopter rapidement des technologies et des infrastructures\r\nintelligentes ? Y a-t-il des tendances intéressantes que l'on peut\r\nobserver ? Par exemple : Géospatial ? Les partenariats ? L'engagement des\r\ncitoyens ? Ces facteurs pourraient-ils servir de modèle pour\r\ndéterminer si une collectivité a la capacité de mettre en œuvre des approches\r\nde ville intelligente ? Ou est-il possible de modéliser la façon dont un\r\nchangement dans un facteur affecterait le résultat d'un autre facteur ? \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nInfrastructure Canada (INFC) - Défi des villes intelligentes (DVI)
\r\n\r\nDans le cadre du plan Investir au Canada, le gouvernement du\r\nCanada a investi environ 180 milliards de dollars (sur 12 ans) dans\r\nl'infrastructure afin de fournir aux collectivités de tout le pays les outils\r\ndont elles ont besoin pour innover. C'est ainsi qu'a été mis en œuvre le\r\nprogramme INFC-SCC, qui prévoit un investissement de 300 millions de dollars\r\nsur 10 ans.
\r\n\r\n\r\n\r\nLe DVI est un programme axé sur les résultats - une approche\r\nqui exige des candidats qu'ils suivent leurs progrès en précisant des\r\nindicateurs de rendement mesurables et les méthodes à utiliser pour quantifier\r\nles extrants et les résultats en matière de rendement. En 2017, le DVI a reçu\r\n130 demandes admissibles représentant 225 collectivités, et 20 finalistes ont\r\nété choisis en juin 2018. Au début de 2019, quatre gagnants représentant trois\r\ncatégories de prix ont été annoncés. On peut trouver de plus amples\r\nrenseignements sur le DVI sur le site Web d'INFC :\r\nhttp://www.infrastructure.gc.ca/cities-villes/index-eng.html et sur la\r\nplateforme de l'initiative Impact Canada\r\n:https://impact.canada.ca/fr/defis/villes-intelligentes
\r\n\r\n\r\n\r\nNOTES :
\r\n\r\n[1] Selon la définition du Guide du candidat du CCN d'INFC :\r\n\" L'approche des villes intelligentes vise à obtenir des résultats\r\nsignificatifs pour les résidents en tirant parti des avantages fondamentaux que\r\nles données et la technologie connectée ont à offrir \". Cela comprend les\r\nconcepts d'ouverture, d'intégration, de transférabilité et de collaboration.\r\nPour de plus amples renseignements, voir :\r\nhttps://impact.canada.ca/en/challenges/smart-cities/applicant-guide
\r\n\r\n[2] https://www.smartertogether.ca/
\r\n\r\n[3] https://www.sidewalktoronto.ca/
\r\n\r\n[4] https://www.makingmtl.ca/challenge
\r\n\r\n[5] https://www.bridgewater.ca/town-services/planning/strategic-initiatives/bridgewater-smart-cities
\r\n\r\n[6] https://innisfil.ca/
\r\n\r\n[7] https://access.stalbert.ca/dev/smart/
"
+ },
+ "OrganizationName": {
+ "Text": "Infrastructure Canada"
+ },
+ "MentorName": {
+ "Text": "Natalie Frank, Jacqueline Ha"
+ },
+ "Statement": {
+ "Html": "Évaluer l'état de la technologie intelligente et de la capacité des infrastructures des municipalités de tout le Canada. Infrastructure Canada aimerait que votre équipe élabore un outil qui caractérise et détermine les caractéristiques communes des \" villes intelligentes pionnières \" au Canada.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Identifying smart city potential",
+ "Description": "Developed a model that can help cities identify their potential as smart cities. It could be implemented as a web application.",
+ "RepositoryUrl": "https://github.com/candev2565/smart_cities_2565",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "17"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Jie",
+ "LastName": "Song",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Jane Shaw",
+ "LastName": "MacDonald",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Jean Loic",
+ "LastName": "Kandikandi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Sébastien",
+ "LastName": "Girard",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Canadian Interactive Smart City Map",
+ "Description": "An interactive map that can be used to highlight 'smart cities' and potential smart cities based on user-selected parameters.",
+ "RepositoryUrl": "https://github.com/CornUkOpia/CANDEV",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "17"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Parth",
+ "LastName": "Sharma",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Alexander",
+ "LastName": "Cornish",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Standardization of Smart City Requirements",
+ "Description": "Comparing key features and goals of multiple cities across Canada. Using this data, creating a standardized functional requirements for city to be classified as smart city.",
+ "RepositoryUrl": "https://github.com/Jainil10/CANDEV-Smart_Cities",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "19"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "19"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Jainil",
+ "LastName": "Gandhi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Nouran",
+ "LastName": "Nouh",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Philip",
+ "LastName": "Mogbock",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Heemel",
+ "LastName": "Saha",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Smart City Indicators (SCI's)",
+ "Description": "It's one thing to be able to identify a smart city. We set out to determine which characteristics indicate that a city has the potential to become a smart city.",
+ "RepositoryUrl": "https://github.com/Frank-F-A/CANDEV2020-2105",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "17"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "19"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Dan",
+ "LastName": "Li",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Farhang Frank",
+ "LastName": "Amini",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Bradley",
+ "LastName": "Audet",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Carter",
+ "LastName": "Macklin",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "AI Model for Enabling Smart Cities",
+ "Description": "Step 1: Analyse the most impactful smart technologies for smart cities around the world
+Step 2: Analyse the geographical data of Canadian cities that can support the most impactful smart technologies and find trends to help other developing Canadian cities.",
+ "RepositoryUrl": "https://github.com/ferna11i/SmartCities_Features",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "22"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "24"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Nima",
+ "LastName": "Taherifard",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Jichu",
+ "LastName": "Jiang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Johan",
+ "LastName": "Fernandes",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ahmed",
+ "LastName": "Omara",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "SmartCity Analysis",
+ "Description": "This application defines and classifies a city's current 'smart' city potential, based on a statistical grading system.",
+ "RepositoryUrl": "https://github.com/Marco-Cen/Candev2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "23"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "17"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "20.1"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Branko",
+ "LastName": "Malaver-Vojvodic",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "stephanie",
+ "LastName": "mcgraw",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Marco",
+ "LastName": "Cen",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Gabrielle",
+ "LastName": "Gravel",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "STATCAN_2"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4vestfbtvrw50x814gnem6e44s",
+ "Culture": "en"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Let the machine beat the analyst"
+ },
+ "PotentialDatasets": {
+ "Html": "You can use any releases from The Daily , such as:
"
+ },
+ "BackgroundInformation": {
+ "Html": "StatsCan produces numerous Daily releases on a recurring basis, especially for monthly statistical programs. However, the writing of a Daily can be time-consuming, formulaic (but not trivial) and is subject to human error. The translation of the Daily articles also adds to production time and effort. Other statistical products or corporate reports might also be generated on a recurring basis but are not being done so owing to resource constraints. To address these problems, Natural Language Generation (NLG) is being considered as a solution to automate text-writing processes, reduce human error and, when done separately in each language, to remove the need for translation.
NLG, also called Text Generation, uses numbers or images to produce text. StatsCan’s Daily releases are one example of (human) NLG, where Common Output Database Repository (CODR) tables (plus, perhaps, some additional information) are used to generate narratives for Daily readers. Financial and sports reporting rely increasingly on NLG to automatically generate articles, with readers none the wiser to an algorithm’s role. Another possible application might be StatsCan reports on crop conditions, where regular updates of satellite images are automatically translated into crop reports for readers.
The challenge then is to extract useful information from the data or images, and to transform that information into readable text. For the information (and NLG, more generally) to be most beneficial, the algorithm has to select only information that is useful: unexpected results, breaks in trends, outliers, etc. In this respect, NLG can have an advantage over other reporting systems (including data tables and dashboards) in that NLG can selectively generate narratives of only that information which is useful to the reader.
The most significant benefits of NLG are time savings and reduced error rates. Developing separate algorithms in each official languages also does away with translation. The time savings are most pronounced where text is currently generated, or might be generated, on a recurring basis. Daily texts are a prime candidate for NLG, but other (perhaps corporate) processes, where recurring analyses are being performed (or might profitably be performed) using data or images might also serve as good use cases for NLG.
"
+ },
+ "OrganizationName": {
+ "Text": "Statistics Canada"
+ },
+ "MentorName": {
+ "Text": "Tony Peluso, Guillaume Dubé"
+ },
+ "Statement": {
+ "Html": " StatsCan produces numerous Daily releases on a recurring basis, \r\nespecially for monthly statistical programs. However, the writing of a \r\nDaily can be time-consuming, formulaic (but not trivial) and is subject \r\nto human error. The challenge is to automate the generation of analytical reports from recurring data releases. Natural Language Generation (NLG) is being considered as a solution to automate text-writing processes, reduce human error and, when done separately in each language, to remove the need for translation.\r\n
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Simple simpleNLG",
+ "Description": "A simple implementation of natural language generation, generating briefings from The Daily data tables using the simpleNLG library which can be found here: https://github.com/simplenlg/simplenlg",
+ "RepositoryUrl": "https://github.com/schinniah/candev_demo/",
+ "Scores": [
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Vy",
+ "LastName": "Nguyen",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Darren",
+ "LastName": "Pierre",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Suseela",
+ "LastName": "Chinniah",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Shamsuddin",
+ "LastName": "Ahmed",
+ "AttendedPresentation": ""
+ },
+ ]
+ },
+ {
+ "Name": "The Daily NLG",
+ "Description": "Takes in a 2 CSVs one for metadata and one for data, strips data by content, and defines a heading a category it belongs to. ",
+ "RepositoryUrl": "https://github.com/greggoryelton/StatsCan-Challenge",
+ "Scores": [
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Wsam",
+ "LastName": "Majeed",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Greggory",
+ "LastName": "Elton",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Alex",
+ "LastName": "Mushyirahamwe",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Joshua",
+ "LastName": "Buentiempo",
+ "AttendedPresentation": ""
+ },
+ ]
+ },
+ {
+ "Name": "Mechanical Language Generation (MLG)",
+ "Description": "We went mechanical over Language generation instead of using Neural Network or N-grams or skip-grams because of one of the requirements which stated that our result should be legible and perfect. Our goal is to generate report by gathering all forms of statistics related to a dataset and populate relevant ones to the report where report will have mechanical selection of words but metrics would be changable, depending on which metric makes more sense.",
+ "RepositoryUrl": "https://github.com/Amitsrma/CANDEV-2020-Natural-language-Generation",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "17"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Amit",
+ "LastName": "Sharma",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Khipro",
+ "LastName": "Basu",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Simardeep",
+ "LastName": "Singh",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ajay",
+ "LastName": "Modagi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "SimpleGen",
+ "Description": "SimpleGen is a template-based natural language generator built for the purpose of automating the creation of human-sounding periodic reports for StatsCan.",
+ "RepositoryUrl": "https://github.com/efharkin/candev",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Xin",
+ "LastName": "Wang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Emerson",
+ "LastName": "Harkin",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Sophia",
+ "LastName": "Duong",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Astha",
+ "LastName": "Tiwari",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "Team 2571",
+ "Description": "Let the machine beat the analyst
+Members: Himanshu Garg, Prince Batra, Raj Mukherjee, Kaustubh Dutta",
+ "RepositoryUrl": "https://github.com/kaudutta/team_2571",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "20"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "21"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "22.8"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Kaustubh",
+ "LastName": "Dutta",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "RAJSHEKHAR",
+ "LastName": "MUKHERJEE",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Prince",
+ "LastName": "Batra",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Himanshu",
+ "LastName": "Garg",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "STATCAN_2"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4vestfbtvrw50x814gnem6e44s",
+ "Culture": "fr"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Laissez la machine battre l'analyste"
+ },
+ "PotentialDatasets": {
+ "Html": "Vous pouvez utiliser n'importe quel communiqué du Quotidien , par exemple :
"
+ },
+ "BackgroundInformation": {
+ "Html": "Statistique Canada produit de façon récurrente de nombreuses publications dans le Quotidien, surtout pour les programmes statistiques mensuels. Cependant, la rédaction d'un article dans le Quotidien peut prendre beaucoup de temps, être basée sur des formules pré-fabriquées (mais pas sans importance) et est sujette à l'erreur humaine. La traduction des articles du Quotidien ajoute également au temps et aux efforts de production. D'autres produits statistiques ou rapports d'entreprise peuvent également être générés de façon récurrente, mais ils ne le sont pas en raison de contraintes de ressources. Pour résoudre ces problèmes, la génération du langage naturel (GLN) est envisagée comme solution pour automatiser les processus de rédaction de textes, réduire l'erreur humaine et, lorsqu'elle est effectuée séparément dans chaque langue, supprimer la nécessité de traduire. La GLN, également appelée Génération de texte, utilise des nombres ou des images pour produire du texte. Les versions du Quotidien de Statistique Canada sont un exemple de GLN (humain), où les tableaux du Dépôt commun des bases de données des sorties (DCBD) (plus, peut-être, quelques renseignements supplémentaires) sont utilisés pour générer des récits pour les lecteurs du Quotidien. Sans même que le lecteur ne s'en aperçoive, plusieurs rapports financiers et sportifs s'appuient de plus en plus sur la GNL pour générer automatiquement des articles. Une autre application possible serait les rapports de Statistique Canada sur l'état des cultures agricoles, où les mises à jour régulières des images satellites sont automatiquement traduites en rapports sur les cultures pour les lecteurs. Le défi consiste alors à extraire des données ou des images des informations utiles et à transformer ces informations en texte lisible. Pour que l'information (et la GNL, de façon plus générale) soit la plus utile possible, l'algorithme doit sélectionner uniquement l'information utile : résultats inattendus, ruptures de tendances, valeurs aberrantes, etc. cet égard, NLG peut avoir un avantage par rapport à d'autres systèmes d'établissement de rapports (y compris les tableaux de données et les tableaux de bord) en ce sens qu'il peut générer de manière sélective des récits portant uniquement sur les informations utiles au lecteur. Les avantages les plus importants de la GLN sont les gains de temps et la réduction des taux d'erreur. La mise au point d'algorithmes distincts dans chaque langue officielle permet également d'éviter la traduction. Les économies de temps sont plus prononcées lorsque le texte est actuellement généré, ou pourrait être généré, de façon récurrente. Les textes du Quotidien sont un candidat de choix pour la GNL, mais d'autres processus (peut-être d'entreprise), où des analyses récurrentes sont effectuées (ou pourraient être effectuées avec profit) à l'aide de données ou d'images, pourraient également constituer de bons cas d'utilisation pour la GNL.
"
+ },
+ "OrganizationName": {
+ "Text": "Statistique Canada"
+ },
+ "MentorName": {
+ "Text": "Tony Peluso, Guillaume Dubé"
+ },
+ "Statement": {
+ "Html": "Statistique Canada produit de façon récurrente de nombreuses publications, surtout pour les programmes statistiques mensuels. Cependant, la rédaction d'un Quotidien peut prendre beaucoup de temps et être sujette à l'erreur humaine. Le défi consiste à automatiser la production de rapports d'analyse à partir de données publiées fréquemment. La génération en langage naturel (GNL) est considérée comme une solution pour automatiser les processus de rédaction de textes, réduire l'erreur humaine et, lorsqu'elle est effectuée séparément dans chaque langue, éliminer le besoin de traduction.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Simple simpleNLG",
+ "Description": "A simple implementation of natural language generation, generating briefings from The Daily data tables using the simpleNLG library which can be found here: https://github.com/simplenlg/simplenlg",
+ "RepositoryUrl": "https://github.com/schinniah/candev_demo/",
+ "Scores": [
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Vy",
+ "LastName": "Nguyen",
+ "AttendedPresentation": "false"
+ },
+ {
+ "FirstName": "Darren",
+ "LastName": "Pierre",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Suseela",
+ "LastName": "Chinniah",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Shamsuddin",
+ "LastName": "Ahmed",
+ "AttendedPresentation": ""
+ },
+ ]
+ },
+ {
+ "Name": "The Daily NLG",
+ "Description": "Takes in a 2 CSVs one for metadata and one for data, strips data by content, and defines a heading a category it belongs to. ",
+ "RepositoryUrl": "https://github.com/greggoryelton/StatsCan-Challenge",
+ "Scores": [
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Wsam",
+ "LastName": "Majeed",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Greggory",
+ "LastName": "Elton",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Alex",
+ "LastName": "Mushyirahamwe",
+ "AttendedPresentation": ""
+ },
+ {
+ "FirstName": "Joshua",
+ "LastName": "Buentiempo",
+ "AttendedPresentation": ""
+ },
+ ]
+ },
+ {
+ "Name": "Mechanical Language Generation (MLG)",
+ "Description": "We went mechanical over Language generation instead of using Neural Network or N-grams or skip-grams because of one of the requirements which stated that our result should be legible and perfect. Our goal is to generate report by gathering all forms of statistics related to a dataset and populate relevant ones to the report where report will have mechanical selection of words but metrics would be changable, depending on which metric makes more sense.",
+ "RepositoryUrl": "https://github.com/Amitsrma/CANDEV-2020-Natural-language-Generation",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "17"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Amit",
+ "LastName": "Sharma",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Khipro",
+ "LastName": "Basu",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Simardeep",
+ "LastName": "Singh",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ajay",
+ "LastName": "Modagi",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "SimpleGen",
+ "Description": "SimpleGen is a template-based natural language generator built for the purpose of automating the creation of human-sounding periodic reports for StatsCan.",
+ "RepositoryUrl": "https://github.com/efharkin/candev",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Xin",
+ "LastName": "Wang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Emerson",
+ "LastName": "Harkin",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Sophia",
+ "LastName": "Duong",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Astha",
+ "LastName": "Tiwari",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "Team 2571",
+ "Description": "Let the machine beat the analyst
+Members: Himanshu Garg, Prince Batra, Raj Mukherjee, Kaustubh Dutta",
+ "RepositoryUrl": "https://github.com/kaudutta/team_2571",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "21"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "20"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "21"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "22.8"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Kaustubh",
+ "LastName": "Dutta",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "RAJSHEKHAR",
+ "LastName": "MUKHERJEE",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Prince",
+ "LastName": "Batra",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Himanshu",
+ "LastName": "Garg",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "INFC"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "4rahtes02jxn0sc5r47e6756dn",
+ "Culture": "en"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Uncovering Canada's Smart City Potential"
+ },
+ "PotentialDatasets": {
+ "Html": "Data Resources to Consider
Open Governments Across Canada: https://open.canada.ca/en/maps/open-data-canada Open Government Portal: https://open.canada.ca/en CIHR Funding Decision Database: http://webapps.cihr-irsc.gc.ca/decisions/p/main.html?lang=en&sort=namesort%20asc&start=0&rows=20&wbdisable=true#sort=namesort%20asc&start=0&rows=20 SSHRC Awards Search Engine: https://www.sshrc-crsh.gc.ca/results-resultats/award_search-recherche_attributions/index-eng.aspx NSERC Awards Database: https://www.nserc-crsng.gc.ca/ase-oro/index_eng.asp Community Data Program: https://communitydata.ca/ OECD Key STI statistics, databases and publications: https://www.oecd.org/innovation/stistatistics.htm UrbanSim Data Science Tool Kit: https://urbansim.com/udst StatCan datasets: https://www144.statcan.gc.ca/sdg-odd/goal-objectif11-eng.htm Other Resources to Consider
OpenNorth: https://www.opennorth.ca/ Open Smart Cities Guide: https://www.opennorth.ca/publications/#open-smart-cities-guide State of Open Smart Cities in Canada: https://www.opennorth.ca/publications/#the-state-of-open-smart-communities-2019 Future Cities Canada: https://futurecitiescanada.ca/ How to be Smart[er] in Mid-Sized Cities in Ontario: https://futurecitiescanada.ca/downloads/2018/FCC_MSC_TechData_201807_REV.pdf OECD/Bloomberg Philanthropies: Enhancing Innovation Capacity in City Government: https://www.oecd.org/publications/enhancing-innovation-capacity-in-city-government-f10c96e5-en.htm OECD/Bloomberg City Innovation Map: https://cities-innovation-oecd.com/ OECD Going Digital Toolkit: https://goingdigital.oecd.org/en/ and https://www.oecd.org/going-digital/ World Council on City Data (WCCD): https://www.dataforcities.org/ McMaster University Smart City Technologies in Canada: https://mcmaster.maps.arcgis.com/apps/MapSeries/index.html?appid=e785bc894ee94ccebf31feda573b35e4 Canada’s Core Public Infrastructure Survey: https://www.infrastructure.gc.ca/plan/ccpi-ipec-eng.html\" "
+ },
+ "BackgroundInformation": {
+ "Html": "The digital landscape across Canada is evolving. As a result, municipalities are at the forefront of embracing this change—they are investing in new digital, technical, and data practices and adopting “smart city approaches” [1] to better the quality of life for their citizens. Moreover, municipal governments are improving their digital/data literacy and governance structures to adapt to the dynamics of public-private infrastructure projects in response to emerging technological movements. The Government of Canada is aware of this shift and is in need of establishing a method to better understand and identify
Municipalities that are engaging in smart cities approaches Factors that do/do not enable municipalities to have the capacity to innovate and implement smart technologies Knowledge gaps and limitations within federal and municipal governments, and third party organizations about Canada’s innovation sector (academic, public, private) It is unknown what makes certain communities more likely to adopt new technologies and innovate strategies to solve challenges faced by their citizens. Major city innovation hubs such as Vancouver and Surrey, British Columbia [2], Toronto, Ontario [3], and Montreal, Québec [4] are leaders in technological advancement and have long since, used digital strategies and plans for transforming their urban spaces to be more interconnected, efficient, and sustainable. On the other hand, much smaller communities such as Bridgewater, Nova Scotia [5], Innisfil, Ontario [6] and St. Albert, Alberta [7] have also taken progressive approaches to implement smart city technologies, while others have not.
Guiding Questions
What are factors that determine a municipality’s propensity to be an early adopter of smart technology and infrastructure? Are there interesting patterns that can be observed? For example: Geospatial? Partnerships? Citizen engagement? Could these factors be used to model whether a community has the capacity to implement smart city approaches? Or is it possible to model how a change in one factor would affect the outcome of another? Infrastructure Canada (INFC) - Smart Cities Challenge (SCC)
Under the Investing in Canada Plan, the Government of Canada has invested approximately $180 billion (over 12 years) on infrastructure to provide communities across the country with the tools they need to innovate. Accordingly, the INFC-SCC was implemented, investing $300 million over 10 years.
The SCC is an outcomes-based program—an approach that requires applicants to track their progress by specifying measurable performance indicators and the methods to be used to quantify performance outputs and outcomes. In 2017, the SCC received 130 eligible applications representing 225 communities, with 20 finalists chosen in June 2018. In early 2019, four winners representing three prize categories were announced. Further information about the SCC can be found on the INFC website: http://www.infrastructure.gc.ca/cities-villes/index-eng.html and on the Impact Canada Initiative platform: https://impact.canada.ca/en/challenges/smart-cities.
NOTES: [1] As defined by the INFC SCC Applicant Guide: “Smart cities approach aims to achieve meaningful outcomes for residents by leveraging the fundamental benefits that data and connected technology have to offer”. This includes concepts of openness, integration, transferability, and collaboration. For more information see: https://impact.canada.ca/en/challenges/smart-cities/applicant-guide [2] https://www.smartertogether.ca/ [3] https://www.sidewalktoronto.ca/ [4] https://www.makingmtl.ca/challenge [5] https://www.bridgewater.ca/town-services/planning/strategic-initiatives/bridgewater-smart-cities [6] https://innisfil.ca/ [7] https://access.stalbert.ca/dev/smart/
"
+ },
+ "OrganizationName": {
+ "Text": "Infrastructure Canada"
+ },
+ "MentorName": {
+ "Text": "Natalie Frank, Jacqueline Ha"
+ },
+ "Statement": {
+ "Html": "Assess the state of smart technology and infrastructure capacity of municipalities across Canada. Infrastructure Canada would like your team to develop a tool that characterizes and identifies common features of ‘smart city early adopters’ in Canada.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "Identifying smart city potential",
+ "Description": "Developed a model that can help cities identify their potential as smart cities. It could be implemented as a web application.",
+ "RepositoryUrl": "https://github.com/candev2565/smart_cities_2565",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "18"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "17"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Jie",
+ "LastName": "Song",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Jane Shaw",
+ "LastName": "MacDonald",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Jean Loic",
+ "LastName": "Kandikandi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Sébastien",
+ "LastName": "Girard",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Canadian Interactive Smart City Map",
+ "Description": "An interactive map that can be used to highlight 'smart cities' and potential smart cities based on user-selected parameters.",
+ "RepositoryUrl": "https://github.com/CornUkOpia/CANDEV",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "17"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "16"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Parth",
+ "LastName": "Sharma",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Alexander",
+ "LastName": "Cornish",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Standardization of Smart City Requirements",
+ "Description": "Comparing key features and goals of multiple cities across Canada. Using this data, creating a standardized functional requirements for city to be classified as smart city.",
+ "RepositoryUrl": "https://github.com/Jainil10/CANDEV-Smart_Cities",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "19"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "19"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Jainil",
+ "LastName": "Gandhi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Nouran",
+ "LastName": "Nouh",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Philip",
+ "LastName": "Mogbock",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Heemel",
+ "LastName": "Saha",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "Smart City Indicators (SCI's)",
+ "Description": "It's one thing to be able to identify a smart city. We set out to determine which characteristics indicate that a city has the potential to become a smart city.",
+ "RepositoryUrl": "https://github.com/Frank-F-A/CANDEV2020-2105",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "17"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "19"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Dan",
+ "LastName": "Li",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Farhang Frank",
+ "LastName": "Amini",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Bradley",
+ "LastName": "Audet",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Carter",
+ "LastName": "Macklin",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "AI Model for Enabling Smart Cities",
+ "Description": "Step 1: Analyse the most impactful smart technologies for smart cities around the world
+Step 2: Analyse the geographical data of Canadian cities that can support the most impactful smart technologies and find trends to help other developing Canadian cities.",
+ "RepositoryUrl": "https://github.com/ferna11i/SmartCities_Features",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "22"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "24"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Nima",
+ "LastName": "Taherifard",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Jichu",
+ "LastName": "Jiang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Johan",
+ "LastName": "Fernandes",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Ahmed",
+ "LastName": "Omara",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "SmartCity Analysis",
+ "Description": "This application defines and classifies a city's current 'smart' city potential, based on a statistical grading system.",
+ "RepositoryUrl": "https://github.com/Marco-Cen/Candev2020",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "23"
+ },
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "26"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "17"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "20.1"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Branko",
+ "LastName": "Malaver-Vojvodic",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "stephanie",
+ "LastName": "mcgraw",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Marco",
+ "LastName": "Cen",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Gabrielle",
+ "LastName": "Gravel",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "SCTC_2"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "47y1hyh5fj23j6wjam9whms9wj",
+ "Culture": "fr"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Exploiter les données pour une meilleure expérience utilisateur"
+ },
+ "PotentialDatasets": {
+ "Html": "Accédez à GCcollab, une plate-forme publique de collaboration et de réseautage du gouvernement: https://gccollab.ca/splash (note : pour vous inscrire sur GCCollab, vous devez utiliser le courriel de votre université)
\r\nGCcollab API: https://data.api.gccollab.ca/
Répertoire d'API: https://api.canada.ca/en/homepage
\r\n\r\nOutilsGC composantes et gabarits :
\r\n\r\n\r\nFeel free to use other APIs such as:
\r\nDonnées additionnelles
"
+ },
+ "BackgroundInformation": {
+ "Html": "Les OutilsGC permettent le partage interministériel des\r\nconnaissances et de l'information, et aident les fonctionnaires à bâtir et à\r\ndévelopper des communautés pour travailler ensemble afin de répondre aux\r\nbesoins des Canadiens dans un environnement ouvert et transparent. En mettant\r\nl'accent sur le développement agile et la conception centrée sur l'utilisateur,\r\nles OutilsGC fournissent des moyens de naviguer dans des écosystèmes qui relient\r\nplus de 160 000 fonctionnaires fédéraux (représentant plus de 60 % de la\r\nfonction publique fédérale) et, depuis 2016, avec des partenaires de diverses\r\nadministrations, des étudiants, des universitaires, des experts et tout citoyen\r\ncanadien sur invitation.
\r\n\r\n\r\n\r\nIls aident à créer des relations, à susciter\r\nl'expérimentation et l'innovation et à soutenir le partage des pratiques\r\nexemplaires. Ils ont été utilisés pour stimuler et soutenir les activités\r\npangouvernementales de mobilisation des employés (p. ex., au-delà de 2020), une\r\nréinitialisation du cadre de gestion des politiques du gouvernement du Canada,\r\ndes services de soutien de la TI entre pairs et de nombreuses autres\r\ninitiatives
\r\n\r\n\r\n\r\nLa vision EDW (Enterprise Digital Workspace) des solutions\r\nde collaboration d'entreprise repose sur un nouveau modèle de micro-service, un\r\nmodèle frontal et un système de conception qui peuvent être facilement mis à\r\ndisposition pour tout type d'expérimentation. Aidez à contribuer à cette nouvelle\r\nvision en trouvant des moyens nouveaux et créatifs d'utiliser ces composants\r\nopen source en utilisant des données pour créer un prototype qui fournit des\r\nfonctionnalités de pointe.
"
+ },
+ "OrganizationName": {
+ "Text": "Secrétariat du Conseil du Trésor du Canada"
+ },
+ "MentorName": {
+ "Text": "Nicolas Pietrantonio, Troy Lawson"
+ },
+ "Statement": {
+ "Html": "Tirer parti des données disponibles sur la plateforme publique de réseautage et de collaboration du gouvernement, GCcollab, pour créer de nouvelles fonctionnalités ou améliorées les gabarits des OutilsGC. Par exemple, vous pourriez utiliser les données de profil et l'apprentissage machine de GCcollab pour recommander des articles de blog. N'hésitez pas à relier d'autres ensembles de données publiques à l'aide d'API.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "FireDex",
+ "Description": "An application that, through drawing data from several meteorological sources, infrared readings, altitude levels etc. can provide a percentage indicating risk of a large scale fire.",
+ "RepositoryUrl": "https://github.com/SeanLemoine/CANDEV_2020_Submission",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "22"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "19"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Staffan",
+ "LastName": "Al-Kadhimi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Sean",
+ "LastName": "Lemoine",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Robert",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hussam",
+ "LastName": "Shah",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "GCcarpool",
+ "Description": "GCcarpool est un service qui permet aux utilisateurs de GCcollab de trouver rapidement et facilement des personnes avec qui covoiturer. ",
+ "RepositoryUrl": "https://github.com/ks-abel/candev_demo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "25"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "23"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Gratias",
+ "LastName": "Midzrato",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hervé",
+ "LastName": "Dogboevi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Adama",
+ "LastName": "Nouboukpo",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Komlan",
+ "LastName": "Sessofia",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Melissa",
+ "LastName": "Wu",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "GCTravel",
+ "Description": "GCTravel is a proposed tool that would be part of the GCTools family. It's main functionality would be as a travel management system with some automated elements. ",
+ "RepositoryUrl": "https://github.com/Nitro5176/candev_demo",
+ "Scores": [
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Stephen",
+ "LastName": "To",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Martin",
+ "LastName": "Weaver",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mohammad Hossein",
+ "LastName": "Namjoo",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "GC Mission Critical",
+ "Description": "A project management tool designed with government employees in mind.",
+ "RepositoryUrl": "https://github.com/robinwakeman/gc-mission-critical",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "27"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "28"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "22.4"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "24.1"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Robin",
+ "LastName": "Wakeman",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Aden Darar",
+ "LastName": "Feisal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Abdoulaye",
+ "LastName": "Ndiaye",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mohamed",
+ "LastName": "Abdelazez",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+
+{
+ "Case": {
+ "TitlePart": {
+ "Title": "TBS_2"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": "47y1hyh5fj23j6wjam9whms9wj",
+ "Culture": "en"
+ },
+ "Case": {
+ "Hackathon": {
+ "LocalizationSets": [
+ "415dfp059fgt1sr9zsh9hbdpcr"
+ ]
+ },
+ "Name": {
+ "Text": "Unlocking Data for a Better User Experience"
+ },
+ "PotentialDatasets": {
+ "Html": "GCcollab , a\r\nGovernment public collaboration and networking platform (note: in order to register on GCcollab, you must use your university email)
\r\nGCcollab API: https://data.api.gccollab.ca/
\r\nAPIs repo: https://api.canada.ca/en/homepage
\r\nGCTools components & templates:
\r\n\r\n\r\n\r\n\r\n\r\n\r\nFeel free to use other APIs such as:
\r\nAdditional datasets:
"
+ },
+ "BackgroundInformation": {
+ "Html": "The GCTools enable interdepartmental sharing of knowledge and information, and help public servants build and grow communities to work together to meet the needs of Canadians in an open and transparent environment. With a focus on agile development and user-centric design, the GCTools provide channels to navigate ecosystems that connect more than 160,000 federal public servants (representing over 60% of the federal public service), and since 2016, with cross-jurisdictional partners, students, academics, experts and any Canadian citizen by invitation.
They help to create relationships, spark experimentation and innovation, and support the sharing of best practices. They have been used to drive and sustain whole-of-government employee engagement activities (e.g., Beyond 2020), a reset of the Government of Canada's policy management framework, peer-to-peer IT support services and many other initiatives.
The EDW (Enterprise Digital Workspace) vision for enterprise collaboration solutions have their foundations in a new micro service template, a front-end template and a design system that can be made available easily for any type of experimentation. Help contribute to this new vision by finding new and creative ways to use these open source components using available data to create scalable prototypes that provides state of the art functionality.
"
+ },
+ "OrganizationName": {
+ "Text": "Treasury Board Secretariat of Canada"
+ },
+ "MentorName": {
+ "Text": "Nicolas Pietrantonio, Troy Lawson"
+ },
+ "Statement": {
+ "Html": "Leverage the data available on the Government's public facing networking and collaboration platform, GCcollab, to create new or enhanced functionality using new GCTools templates. For example, you could use GCcollab profile data and machine learning to recommend blog posts. Feel free to link other public datasets using APIs.
"
+ }
+ }
+},
+ "Teams" : [
+ {
+ "Name": "FireDex",
+ "Description": "An application that, through drawing data from several meteorological sources, infrared readings, altitude levels etc. can provide a percentage indicating risk of a large scale fire.",
+ "RepositoryUrl": "https://github.com/SeanLemoine/CANDEV_2020_Submission",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "22"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "19"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Staffan",
+ "LastName": "Al-Kadhimi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Sean",
+ "LastName": "Lemoine",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Robert",
+ "LastName": "Zhang",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hussam",
+ "LastName": "Shah",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "GCcarpool",
+ "Description": "GCcarpool est un service qui permet aux utilisateurs de GCcollab de trouver rapidement et facilement des personnes avec qui covoiturer. ",
+ "RepositoryUrl": "https://github.com/ks-abel/candev_demo",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "25"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "23"
+ },
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Gratias",
+ "LastName": "Midzrato",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Hervé",
+ "LastName": "Dogboevi",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Adama",
+ "LastName": "Nouboukpo",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Komlan",
+ "LastName": "Sessofia",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Melissa",
+ "LastName": "Wu",
+ "AttendedPresentation": "false"
+ },
+ ]
+ },
+ {
+ "Name": "GCTravel",
+ "Description": "GCTravel is a proposed tool that would be part of the GCTools family. It's main functionality would be as a travel management system with some automated elements. ",
+ "RepositoryUrl": "https://github.com/Nitro5176/candev_demo",
+ "Scores": [
+ ],
+ "Winner": "false",
+ "TeamMembers": [
+ {
+ "FirstName": "Stephen",
+ "LastName": "To",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Martin",
+ "LastName": "Weaver",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mohammad Hossein",
+ "LastName": "Namjoo",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ {
+ "Name": "GC Mission Critical",
+ "Description": "A project management tool designed with government employees in mind.",
+ "RepositoryUrl": "https://github.com/robinwakeman/gc-mission-critical",
+ "Scores": [
+ {
+ "Round" : "1",
+ "Type" : "SubjectMatter",
+ "Score" : "27"
+ },
+ {
+ "Round" : "1",
+ "Type" : "Technical",
+ "Score" : "28"
+ },
+ {
+ "Round" : "2",
+ "Type" : "Technical",
+ "Score" : "22.4"
+ },
+ {
+ "Round" : "2",
+ "Type" : "SubjectMatter",
+ "Score" : "24.1"
+ },
+ ],
+ "Winner": "true",
+ "TeamMembers": [
+ {
+ "FirstName": "Robin",
+ "LastName": "Wakeman",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Aden Darar",
+ "LastName": "Feisal",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Abdoulaye",
+ "LastName": "Ndiaye",
+ "AttendedPresentation": "true"
+ },
+ {
+ "FirstName": "Mohamed",
+ "LastName": "Abdelazez",
+ "AttendedPresentation": "true"
+ },
+ ]
+ },
+ ]
+},
+]
+{% endcapture %}
+
+{% assign jsonVar = jsonData | jsonparse %}
+
+
+ {% for case in jsonVar %}
+ {% if case.Case.LocalizationPart.Culture == Culture.Name %}
+ {{ case.Case.TitlePart.Title }}
+ {% endif %}
+ {% endfor %}
+ {% for case in jsonVar %}
+ {% if case.Case.LocalizationPart.Culture == Culture.Name %}
+
+
+
+ {{ "Challenge" | t }}
+
+ {{ case.Case.Case.Name.Text }}
+
+ {{ "Statement" | t }}
+ {{ case.Case.Case.Statement.Html | raw }}
+ {{ "Potential Datasets" | t }}
+ {{ case.Case.Case.PotentialDatasets.Html | raw }}
+ {{ "Background Information" | t }}
+ {{ case.Case.Case.BackgroundInformation.Html | raw }}
+ {{ "Organization" | t }}
+ {{ case.Case.Case.OrganizationName.Text }}
+ {{ "Mentors" | t }}
+ {{ case.Case.Case.MentorName.Text }}
+
+
+ {{ "Solutions" | t }}
+ {% for team in case.Teams %}
+ {% if team.Winner == "true" %}
+
+ {{ team.Name }}mdi-trophy
+
+
+
+ {{ team.Description }}
+
+
+ {% assign round = 0 %}
+ {% for score in team.Scores %}
+ {% if round != score.Round %}
+ {{ "Round" | t }} {{score.Round}}
+ {% capture round %}{{ score.Round }}{% endcapture %}
+ {% endif %}
+
+ {{ score.Type }}
+ {{ score.Score }}
+
+ {% endfor %}
+
+
+
+
+ {% for member in team.TeamMembers %}
+
+ {{ member.FirstName }} {{ member.LastName }}
+ {% if member.AttendedPresentation == "true" %}
+
+ {{ "Presented" | t }}
+ mdi-check
+
+ {% endif %}
+
+ {% endfor %}
+
+
+
+ mdi-source-branch
+ {{ "View repo" | t }}
+
+
+
+
+
+ {% endif %}
+ {% endfor %}
+ {% for team in case.Teams %}
+ {% if team.Winner != "true" %}
+
+ {{ team.Name }}
+
+
+
+ {{ team.Description }}
+
+
+ {% assign round = 0 %}
+ {% for score in team.Scores %}
+ {% if round != score.Round %}
+ {{ "Round" | t }} {{score.Round}}
+ {% capture round %}{{ score.Round }}{% endcapture %}
+ {% endif %}
+
+ {{ score.Type }}
+ {{ score.Score }}
+
+ {% endfor %}
+
+
+
+
+ {% for member in team.TeamMembers %}
+
+ {{ member.FirstName }} {{ member.LastName }}
+ {% if member.AttendedPresentation == "true" %}
+
+ {{ "Prensented" | t }}
+ mdi-check
+
+ {% endif %}
+
+ {% endfor %}
+
+
+
+ mdi-source-branch
+ {{ "View repo" | t }}
+
+
+
+
+
+ {% endif %}
+ {% endfor %}
+
+
+
+ {% endif %}
+ {% endfor %}
+
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-ChallengeListWidget.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-ChallengeListWidget.liquid
new file mode 100644
index 000000000..d62e93764
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-ChallengeListWidget.liquid
@@ -0,0 +1,23 @@
+{% assign challenges = Queries.GetItemsForHackathon | query: type: "Challenge" %}
+
+
+
+ {% for challenge in challenges %}
+ {% assign cShape = challenge.ContentItem | shape_build_display %}
+ {% if challenge.Published == true %}
+
+
+ {{ challenge.ContentItem.Content.Challenge.Name.Text | shortcode }} -
+ {{ challenge.ContentItem.Content.Challenge.ShortDescription.Text | shortcode }}
+
+
+ {{ cShape.Content.MarkdownBodyPart | shape_render }}
+
+
+
+ {% endif %}
+ {% endfor %}
+
+
+
+
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-ChallengeSubmission.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-ChallengeSubmission.liquid
new file mode 100644
index 000000000..59c00134b
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-ChallengeSubmission.liquid
@@ -0,0 +1,108 @@
+{% assign userId = User | user_id %}
+{% assign user = User | user_id | users_by_id %}
+{% assign challenges = Queries.GetChallengeSubmissionsForOwner | query: owner: userId %}
+
+
+ {% if user.Properties.Judge.Judge.Challenge.ContentItemIds.first != null %}
+ {% assign challengeSelected = user.Properties.Judge.Judge.Challenge.ContentItemIds | content_item_id | first %}
+
+
+ {% if Culture.Name == "fr" %}
+ {% assign challengeSelected = challengeSelected.ContentItem.Content.LocalizationPart.LocalizationSet | localization_set: "fr" %}
+ {% endif %}
+ {{ "Your challenge" | t}}: {{ challengeSelected.ContentItem.Content.Challenge.Title.Text | shortcode }}
+
+
+ {{ "Statement" | t }}
+ {{ challengeSelected.ContentItem.Content.Challenge.Statement.Text | shortcode }}
+ {{ "Background Information & Potential Datasets" | t }}
+ {{ challengeSelected.ContentItem.Content.MarkdownBodyPart.Markdown | markdownify | raw }}
+ {{ "Organization" | t }}
+ {{ challengeSelected.ContentItem.Content.Challenge.OrganizationNameEn.Text | shortcode }}
+ {{ "Mentors" | t }}
+ {{ challengeSelected.ContentItem.Content.Challenge.TechnicalMentorName.Text | shortcode }}
+ {% for dataset in challengeSelected.ContentItem.Content.Challenge.DatasetsFiles.Paths %}
+ {{ dataset }}
+ {% endfor %}
+
+
+
+ {% else %}
+
+
+
+ {% for challenge in challenges %}
+ {% if challenge.Published == true %}
+
+
+
+ {{ challenge.ContentItem.Content.Challenge.Title.Text | shortcode }}
+ {{ "Submission accepted" | t }}
+
+
+
+ {{ challenge.ContentItem.Content.Challenge.Statement.Text | shortcode }}
+
+
+ {{ challenge.ContentItem.Content.Challenge.BackgroundInformation.Text | shortcode }}
+
+
+ {{ challenge.ContentItem.Content.Challenge.Datasets.Text | shortcode }}
+
+
+
+
+ {% endif %}
+ {% endfor %}
+
+ {% for challenge in challenges %}
+ {% if challenge.Published == false %}
+
+
+
+ {{ challenge.ContentItem.Content.Challenge.Title.Text | shortcode }}
+ {% if challenge.ContentItem.Content.Challenge.BackgroundInformation.Text == blank or
+ challenge.ContentItem.Content.Challenge.ContactPersonName.Text == blank or
+ challenge.ContentItem.Content.Challenge.ContactPersonEmail.Text == blank or
+ challenge.ContentItem.Content.Challenge.TechnicalMentorName.Text == blank or
+ challenge.ContentItem.Content.Challenge.TechnicalMentorEmail.Text == blank or
+ challenge.ContentItem.Content.Challenge.CaseSpecialistName.Text == blank or
+ challenge.ContentItem.Content.Challenge.CaseSpecialistEmail.Text == blank or
+ challenge.ContentItem.Content.Challenge.Statement.Text == blank or
+ challenge.ContentItem.Content.Challenge.Datasets.Text == blank or
+ challenge.ContentItem.Content.Challenge.OrganizationNameEn.Text == blank or
+ challenge.ContentItem.Content.Challenge.OrganizationAcronymEn.Text == blank or
+ challenge.ContentItem.Content.Challenge.Keywords.Text == blank
+ %}
+ {{ "Incomplete" | t }}
+ {% else %}
+ {{ "Complete" | t }}
+ {% endif %}
+
+
+
+ {{ challenge.ContentItem.Content.Challenge.Statement.Text | shortcode }}
+
+
+ {{ challenge.ContentItem.Content.Challenge.BackgroundInformation.Text | shortcode }}
+
+
+ {{ challenge.ContentItem.Content.Challenge.Datasets.Text | shortcode }}
+
+
+
+
+
+
+
+
+
+ {% endif %}
+ {% endfor %}
+ {% endif %}
+
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-HackathonCalendar.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-HackathonCalendar.liquid
new file mode 100644
index 000000000..2c1fb81f5
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-HackathonCalendar.liquid
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+ {{ Site.Properties.HackathonCustomSettings.HackathonCustomSettings.StartDate.Value | local | date:"%Y" }}
+
+
+
+
+
+
+
+
+ {{ Site.Properties.HackathonCustomSettings.HackathonCustomSettings.EndDate.Value | local | date:"%Y" }}
+
+
+
+
+ {{Model.Hackathon.Content.Hackathon.Where.Text}}
+
+
+
\ No newline at end of file
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-JudgingListWidget.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-JudgingListWidget.liquid
new file mode 100644
index 000000000..e28631eed
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-JudgingListWidget.liquid
@@ -0,0 +1,68 @@
+{% assign userInRole = User | is_in_role: "Judge"%}
+{% assign user = User | user_id | users_by_id %}
+{% assign userId = User | user_id %}
+
+{% if userInRole %}
+ {% if Site.Properties.HackathonCustomSettings.JudgingCustomSettings.JudgingInProgress.Value != true %}
+ {{"No active judging round" | t}}
+ {%else%}
+
+ {% assign teams = Queries.GetItemsForHackathon | query: type: "Team" %}
+
+ {% if Site.Properties.HackathonCustomSettings.JudgingCustomSettings.IsFinalRound.Value != true %}
+
+
+
Team List
+ {% if teams == blank %}
+ {{ "There are no teams." | t }}
+ {% else %}
+ {% for team in teams %}
+ {% assign score = Queries.GetScoreEntry | query: teamContentItemId: team.ContentItemId, owner: userId %}
+ {% if team.ContentItem.Content.Team.Challenge.ContentItemIds.first == user.Properties.Judge.Judge.Challenge.ContentItemIds.first
+ and score.size < 1 %}
+
+
+ Score
+ {{ "Team" | t }} {{ team.DisplayText }}
+
+
+ {% elsif team.ContentItem.Content.Team.Challenge.ContentItemIds.first == user.Properties.Judge.Judge.Challenge.ContentItemIds.first
+ and score.size == 1 %}
+
+
+ {{ "Score: " | t }} {{ score.first.ContentItem.Content.Score.Score.Value }}
+ {{ "Team" | t }} {{ team.DisplayText }}
+
+
+ {% endif %}
+ {% endfor %}
+ {% endif %}
+
+
+ {% else %}
+
+
+
Team List
+ {% for team in teams %}
+ {% if team.ContentItem.Content.Team.InTheRunning.Value %}
+ {% assign score = Queries.GetScoreEntry | query: teamContentItemId: team.ContentItemId, owner: userId %}
+
+
+ {% if team.ContentItem.Content.Team.Challenge.ContentItemIds.first != user.Properties.Judge.Judge.Challenge.ContentItemIds.first
+ and score.size < 1 %}
+ Score
+ {{ "Team" | t }} {{ team.DisplayText }}
+ {% elsif team.ContentItem.Content.Team.Challenge.ContentItemIds.first != user.Properties.Judge.Judge.Challenge.ContentItemIds.first
+ and score.size == 1 %}
+ {{ "Score: " | t }} {{ score.first.ContentItem.Content.Score.Score.Value }}
+ {{ "Team" | t }} {{ team.DisplayText }}
+ {% endif %}
+
+
+ {% endif %}
+ {% endfor %}
+
+
+ {% endif %}
+ {% endif %}
+{% endif %}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-JudgingResults.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-JudgingResults.liquid
new file mode 100644
index 000000000..52be0105a
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-JudgingResults.liquid
@@ -0,0 +1,179 @@
+{% assign challenges = Queries.GetItemsForHackathon | query: type: "Challenge" %}
+{% assign teams = Queries.GetItemsForHackathon | query: type: "Team" %}
+
+
+ {% for challenge in challenges %}
+ {% if challenge.ContentItem.Content.LocalizationPart.Culture == Culture.Name %}
+ {% if Culture.Name == "fr" %}
+ {{ challenge.ContentItem.Content.Challenge.OrganizationAcronymFr.Text }}
+ {% else %}
+ {{ challenge.ContentItem.Content.Challenge.OrganizationAcronymEn.Text }}
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+ {% assign challenges = Queries.GetItemsForHackathon | query: type: "Challenge" %}
+
+ {% for challenge in challenges %}
+ {% if challenge.ContentItem.Content.LocalizationPart.Culture == Culture.Name %}
+
+
+
+ {{ "Challenge" | t }}
+
+ {{ challenge.ContentItem.Content.TitlePart.Title }}
+
+ {{ "Statement" | t }}
+ {{ challenge.ContentItem.Content.Challenge.Statement.Text | raw }}
+
+ {{ challenge.ContentItem.Content.MarkdownBodyPart.Markdown | markdownify | raw }}
+ {{ "Organization" | t }}
+ {% if Culture.Name == "fr" %}
+ {{ challenge.ContentItem.Content.Challenge.OrganizationNameFr.Text | raw }}
+ {% else %}
+ {{ challenge.ContentItem.Content.Challenge.OrganizationNameEn.Text | raw }}
+ {% endif %}
+ {{ "Technical mentor" | t }}
+ {{ challenge.ContentItem.Content.Challenge.TechnicalMentorName.Text | raw }}
+ {{ "Case specialist" | t }}
+ {{ challenge.ContentItem.Content.Challenge.CaseSpecialistName.Text | raw }}
+
+
+
+ {{ "Solutions" | t }}
+ {% assign challengeSelected = challenge.ContentItem.Content.LocalizationPart.LocalizationSet | localization_set: "en" %}
+ {% capture highestScore %}
+ {
+ "teamContentId": "",
+ "score": 0
+ }
+ {% endcapture %}
+ {% for team in teams %}
+ {% if team.ContentItem.Content.Team.Challenge.ContentItemIds.first == challengeSelected.ContentItemId %}
+ {% assign scores = Queries.GetScoresForTeam | query: teamContentItemId: team.ContentItemId %}
+ {% assign highestScorejson = highestScore | jsonparse %}
+ {% capture total %}{{scores[0].ContentItem.Content.Score.Score.Value | plus: scores[1].ContentItem.Content.Score.Score.Value}}{% endcapture %}
+ {% if highestScorejson.score < total %}
+ {% capture highestScore %}
+ {
+ "teamContentId": "{{team.ContentItemId}}",
+ "score": {{scores[0].ContentItem.Content.Score.Score.Value | plus: scores[1].ContentItem.Content.Score.Score.Value}}
+ }
+ {% endcapture %}
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+ {% assign highestScorejson = highestScore | jsonparse %}
+ {% for team in teams %}
+ {% if team.ContentItem.Content.Team.Challenge.ContentItemIds.first == challengeSelected.ContentItemId %}
+ {% if highestScorejson.teamContentId == team.ContentItemId %}
+
+ {{ team.ContentItem.Content.Team.Name.Text }}mdi-trophy
+
+
+
+ {{ team.ContentItem.Content.Team.Description.Text }}
+ {{ team.ContentItem.Content.TeamSolutionPart.Name.Text }}
+ {{ team.ContentItem.Content.TeamSolutionPart.Description.Text | raw }}
+
+
+ {% assign scores = Queries.GetScoresForTeam | query: teamContentItemId: team.ContentItemId %}
+ {% assign teamContentItemId = team.ContentItemId | slice: 0, 25 %}
+ {% assign scoreAvgTech = Queries.GetAvgScoresForTeam | query: scoreIndexId: teamContentItemId, type: "T" | first %}
+ {% assign scoreAvgSubMat = Queries.GetAvgScoresForTeam | query: scoreIndexId: teamContentItemId, type: "S" | first %}
+ {% if scoreAvgTech != null and scoreAvgSubMat != null %}
+ {% assign scoreAvgTechCount = scoreAvgTech.Count | times: 1.0 %}
+ {% assign scoreAvgSubMatCount = scoreAvgSubMat.Count | times: 1.0 %}
+ {{ "Round 2" | t }}
+
+ {{ "Technical" | t }}
+ {{ scoreAvgTech.Score | divided_by: scoreAvgTechCount | round: 2 }}
+
+
+ {{ "Subject Matter" | t }}
+ {{ scoreAvgSubMat.Score | divided_by: scoreAvgSubMatCount | round: 2 }}
+
+ {% endif %}
+ {{ "Round 1" | t }}
+ {% for score in scores %}
+ {% if score.ContentItem.Content.Score.Round.Value == "1" %}
+
+ {{ score.ContentItem.Content.JudgeType.Type.Values.first }}
+ {{ score.ContentItem.Content.Score.Score.Value }}
+
+ {% endif %}
+ {% endfor %}
+
+
+
+
+ {% assign teamMembers = Queries.GetHackersForTeam | query: teamContentItemId: team.ContentItemId %}
+ {% for member in teamMembers %}
+
+ {{ member.FirstName }} {{ member.LastName }}
+
+ {% endfor %}
+
+
+
+ mdi-source-branch
+ {{ "View repo" | t }}
+
+
+
+
+
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+ {% for team in teams %}
+ {% if team.ContentItem.Content.Team.Challenge.ContentItemIds.first == challengeSelected.ContentItemId %}
+ {% if highestScorejson.teamContentId != team.ContentItemId %}
+
+ {{ team.ContentItem.Content.Team.Name.Text }}
+
+
+
+ {{ team.ContentItem.Content.Team.Description.Text }}
+ {{ team.ContentItem.Content.TeamSolutionPart.Name.Text }}
+ {{ team.ContentItem.Content.TeamSolutionPart.Description.Text | raw }}
+
+
+ {% assign scores = Queries.GetScoresForTeam | query: teamContentItemId: team.ContentItemId %}
+ {{ "Round 1" | t }}
+ {% for score in scores %}
+ {% if score.ContentItem.Content.Score.Round.Value == "1" %}
+
+ {{ score.ContentItem.Content.JudgeType.Type.Values.first }}
+ {{ score.ContentItem.Content.Score.Score.Value }}
+
+ {% endif %}
+ {% endfor %}
+
+
+
+
+ {% assign teamMembers = Queries.GetHackersForTeam | query: teamContentItemId: team.ContentItemId %}
+ {% for member in teamMembers %}
+
+ {{ member.FirstName }} {{ member.LastName }}
+
+ {% endfor %}
+
+
+
+ mdi-source-branch
+ {{ "View repo" | t }}
+
+
+
+
+
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+
+
+
+ {% endif %}
+ {% endfor %}
+
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-TeamDashboardWidget.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-TeamDashboardWidget.liquid
new file mode 100644
index 000000000..60a9281b3
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-TeamDashboardWidget.liquid
@@ -0,0 +1,200 @@
+{% script src:'~/OrchardCore.Workflows/Scripts/crossbrowserclipboardcopy.min.js', debug_src:'~/OrchardCore.Workflows/Scripts/crossbrowserclipboardcopy.js', at:"Foot" %}
+
+{% assign userInRole = User | is_in_role: "Hacker"%}
+{% if userInRole %}
+
+ {% assign user = User | user_id | users_by_id %}
+ {% assign teamContentItemId = user.Properties.Hacker.Hacker.Team.ContentItemIds | first %}
+ {% assign teamMembers = Queries.GetHackersForTeam | query: teamContentItemId: teamContentItemId %}
+ {% assign team = Content.ContentItemId[teamContentItemId] %}
+ {% assign isTeamCaptain = team.ContentItem.Content.Team.TeamCaptain.UserIds.first != null and team.ContentItem.Content.Team.TeamCaptain.UserIds.first == user.UserId %}
+ {% assign isTeamEditable = Site.Properties.HackathonCustomSettings.TeamCustomSettings.TeamEditable.Value == true %}
+ {% assign challengeSelected = team.ContentItem.Content.Team.Challenge.ContentItemIds | content_item_id | first %}
+ {% assign topicList = Queries.GetItemsForHackathon | query: type: "Topic" %}
+ {% assign teamCaptain = team.ContentItem.Content.Team.TeamCaptain.UserIds.first %}
+
+ {% if user.Properties.Hacker.Hacker.Team.ContentItemIds.first != null %}
+
+
+
+
+ {{team.DisplayText}}
+
+ {{team.ContentItem.Content.Team.Description.Text}}
+
+ {{ "ID" | t }}:
+
+
+
+ {{ user.Properties.Hacker.Hacker.Team.ContentItemIds | first }}
+
+
+ {{ "Click to copy. Share your team identifier to invite members" | t }}
+
+
+ {% if isTeamCaptain and isTeamEditable %}
+
+
+ {{ "You are the team captain." | t }}
+
+
+ {{ "Order topics, edit your team name and description using the form at the bottom of this page." | t }}
+
+ {% endif %}
+
+
+
+
+ {% if challengeSelected != null %}
+
+
+ {% if Culture.Name == "fr" %}
+ {% assign challengeSelected = challengeSelected.ContentItem.Content.LocalizationPart.LocalizationSet | localization_set: "fr" %}
+ {% endif %}
+ {{"Challenge" | t}}: {{ challengeSelected.ContentItem.Content.Challenge.Title.Text | shortcode }}
+
+
+ {{ "Statement" | t }}
+ {{ challengeSelected.ContentItem.Content.Challenge.Statement.Text | shortcode }}
+ {% if Site.Properties.HackathonCustomSettings.TeamCustomSettings.PartialChallenge.Value == false %}
+
+ {{ challengeSelected.ContentItem.Content.MarkdownBodyPart.Markdown | markdownify | raw }}
+ {% endif %}
+ {{ "Organization" | t }}
+ {% if Culture.Name == "fr" %}
+ {{ challenge.ContentItem.Content.Challenge.OrganizationAcronymFr.Text }}
+ {% else %}
+ {{ challenge.ContentItem.Content.Challenge.OrganizationAcronymEn.Text }}
+ {% endif %}
+ {{ "Technical mentor" | t }}
+ {{ challengeSelected.ContentItem.Content.Challenge.TechnicalMentorName.Text | shortcode }}
+ {{ "Case specialist" | t }}
+ {{ challengeSelected.ContentItem.Content.Challenge.CaseSpecialistName.Text | shortcode }}
+
+
+
+ {% endif %}
+
+
+
+ {{ "Team Members" | t }}
+
+
+ {% for teamMember in teamMembers %}
+
+ {% if isTeamCaptain and isTeamEditable %}
+
+ {% endif %}
+ {{ teamMember.FirstName }} {{ teamMember.LastName }} - {{teamMember.ContactEmail}}
+ {% if teamMember.UserId == teamCaptain %}
+ mdi-account-hard-hat
+ {% endif %}
+ {% endfor %}
+
+
+
+
+ {{ "Leave team" | t }}
+
+
+
+ {{ "Warning" | t }}
+
+
+ {% if isTeamCaptain and isTeamEditable %}
+ {{ "You are the team captain. Leaving the team will assign another member as the team captain." | t }}
+ {% else %}
+ {{ "Are you sure you want to leave {0}?" | t: team.ContentItem.Content.Team.Name.Text }}
+ {% endif %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% if isTeamCaptain %}
+ {% assign teamEditForm = Content.ContentItemId["4466xex4gkry42s4n9x4ksyywd"] %}
+ {{ teamEditForm | shape_build_display | shape_render }}
+ {% elsif challengeSelected == null %}
+
+
+ {{ "Topics in your order of interest (only the team captain can reorder)" | t }}
+
+
+ {% if team.Content.Team.Topics.ContentItemIds != null %}
+ {% for topicId in team.Content.Team.Topics.ContentItemIds %}
+ {% assign topic = topicId | content_item_id %}
+ {% if Culture.Name == "en" %}
+ {{topic.Content.Topic.NameEn.Text}}
+ {% else %}
+ {{topic.Content.Topic.NameFr.Text}}
+ {% endif %}
+ {% endfor %}
+ {% else %}
+ {% for topic in topicList %}
+ {% if Culture.Name == "en" %}
+ {{topic.Content.Topic.NameEn.Text}}
+ {% else %}
+ {{topic.Content.Topic.NameFr.Text}}
+ {% endif %}
+ {% endfor %}
+ {% endif %}
+
+
+ {% endif %}
+
+ {% else %}
+
+
+
+
+ {{ "Please create or join an existing team" | t }}
+
+
+
+
+ {{ "Or" | t }}
+
+
+
+
+
+
+
+
+
+ {% endif %}
+{% endif %}
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-UserProfile.liquid b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-UserProfile.liquid
new file mode 100644
index 000000000..6e252c601
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/Widget-UserProfile.liquid
@@ -0,0 +1,101 @@
+{% assign user = User | user_id | users_by_id %}
+{% capture translations %}
+{% if Culture.Name == "en" %}
+{
+"Profile":"Profile",
+"Email":"Email:",
+"Language":"Prefered Language:",
+"Edit":"Edit",
+"Url": "~/profile/edit",
+"Mentor":"Mentor",
+"Judge":"Judge",
+"AgencyRep":"Agency representative",
+"WorkshopPre":"Workshop presenter",
+"TechnicalAdv":"Technical advisor",
+"Observer":"Observer",
+"KeynoteSpe":"Keynote speaker",
+"Organizer":"Organizer / Volunteer",
+"Roles":"Roles:"
+}
+{% else %}
+{
+"Profile":"Profil",
+"Email":"Courriel",
+"Language":"Langue de préférence",
+"Edit":"Modifier",
+"Url": "~/profil/editer",
+"Mentor":"Mentor",
+"Judge":"Juge",
+"AgencyRep":"Représentant",
+"WorkshopPre":"Présenteur d'atelier",
+"TechnicalAdv":"Conseiller technique",
+"Observer":"Observateur",
+"KeynoteSpe":"Conférencier",
+"Organizer":"Organisateur / bénévole",
+"Roles":"Rôles:"
+}
+{% endif %}
+{% endcapture %}
+
+{% capture language %}
+{% if Culture.Name == "en" %}
+{% if user.Properties.ParticipantProfile.ParticipantProfile.Language.Text == "en" %}
+English
+{% elsif user.Properties.ParticipantProfile.ParticipantProfile.Language.Text == "fr" %}
+French
+{% else %}
+Billingual
+{% endif %}
+{% else %}
+{% if user.Properties.ParticipantProfile.ParticipantProfile.Language.Text == "en" %}
+Anglais
+{% elsif user.Properties.ParticipantProfile.ParticipantProfile.Language.Text == "fr" %}
+Français
+{% else %}
+Bilingue
+{% endif %}
+{% endif %}
+{% endcapture %}
+
+{% assign translationJson = translations | jsonparse %}
+
+
+
+ {{ "Profile" | t }}
+
+ {{user.Properties.ParticipantProfile.ParticipantProfile.FirstName.Text}} {{user.Properties.ParticipantProfile.ParticipantProfile.LastName.Text}}
+
+ {{ "Email" | t }} {{ user.Properties.ParticipantProfile.ParticipantProfile.Email.Text }}
+ {{ "Prefered Language" | t }} {{language}}
+ {% assign isInRole = User | is_in_role: "Volunteer" %}
+ {% if isInRole %}
+
+ {{ "Roles" | t }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% endif %}
+
+
+
+ {{ "Edit" | t }}
+
+
+
+
+
diff --git a/src/Apps/StatCan.OrchardCore.Candev/Views/_ViewImports.cshtml b/src/Apps/StatCan.OrchardCore.Candev/Views/_ViewImports.cshtml
new file mode 100644
index 000000000..32a2e830b
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/Views/_ViewImports.cshtml
@@ -0,0 +1,8 @@
+@*
+ For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
+*@
+
+@inherits OrchardCore.DisplayManagement.Razor.RazorPage
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+@addTagHelper *, OrchardCore.ResourceManagement
+@addTagHelper *, OrchardCore.Users
diff --git a/src/Apps/StatCan.OrchardCore.Candev/placement.json b/src/Apps/StatCan.OrchardCore.Candev/placement.json
new file mode 100644
index 000000000..d5dba5245
--- /dev/null
+++ b/src/Apps/StatCan.OrchardCore.Candev/placement.json
@@ -0,0 +1,41 @@
+{
+ "NumericField_Edit" : [
+ {
+ "differentiator": "TeamCustomSettings-TeamSize",
+ "place" : "Parts:0#Team;1",
+ "contentType": [
+ "HackathonCustomSettings"
+ ]
+ }
+ ],
+ "BooleanField_Edit" : [
+ {
+ "differentiator": "TeamCustomSettings-TeamEditable",
+ "place" : "Parts:1#Team;1",
+ "contentType": [
+ "HackathonCustomSettings"
+ ]
+ },
+ {
+ "differentiator": "JudgingCustomSettings-JudgingInProgress",
+ "place" : "Parts:0#Judging;2",
+ "contentType": [
+ "HackathonCustomSettings"
+ ]
+ },
+ {
+ "differentiator": "JudgingCustomSettings-IsFinalRound",
+ "place" : "Parts:1#Judging;3",
+ "contentType": [
+ "HackathonCustomSettings"
+ ]
+ },
+ {
+ "differentiator": "TeamCustomSettings-PartialChallenge",
+ "place" : "Parts:2#Team;4",
+ "contentType": [
+ "HackathonCustomSettings"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/Lib/StatCan.OrchardCore.Application.Targets/StatCan.OrchardCore.Application.Targets.csproj b/src/Lib/StatCan.OrchardCore.Application.Targets/StatCan.OrchardCore.Application.Targets.csproj
index d054430f8..71be06538 100644
--- a/src/Lib/StatCan.OrchardCore.Application.Targets/StatCan.OrchardCore.Application.Targets.csproj
+++ b/src/Lib/StatCan.OrchardCore.Application.Targets/StatCan.OrchardCore.Application.Targets.csproj
@@ -10,6 +10,7 @@
-->
+
diff --git a/src/Modules/StatCan.OrchardCore.Hackathon/Indexes/Migrations.cs b/src/Modules/StatCan.OrchardCore.Hackathon/Indexes/Migrations.cs
index d4c70bb88..1ca58ce69 100644
--- a/src/Modules/StatCan.OrchardCore.Hackathon/Indexes/Migrations.cs
+++ b/src/Modules/StatCan.OrchardCore.Hackathon/Indexes/Migrations.cs
@@ -13,7 +13,7 @@ public class IndexMigrations : DataMigration
public int Create()
{
CreateHackathonItemsIndex();
- CreateHackathonUsersIndex();
+ CreateHackathonUsersIndex();
return 1;
}
diff --git a/src/Modules/StatCan.OrchardCore.Hackathon/Views/Widget-JudgingListWidget.liquid b/src/Modules/StatCan.OrchardCore.Hackathon/Views/Widget-JudgingListWidget.liquid
index 020ce1f67..04b45eccd 100644
--- a/src/Modules/StatCan.OrchardCore.Hackathon/Views/Widget-JudgingListWidget.liquid
+++ b/src/Modules/StatCan.OrchardCore.Hackathon/Views/Widget-JudgingListWidget.liquid
@@ -23,4 +23,4 @@
{% endif %}
-{% endif %}
+{% endif %}
\ No newline at end of file
diff --git a/src/Modules/StatCan.OrchardCore.VueForms/StatCan.OrchardCore.VueForms.csproj b/src/Modules/StatCan.OrchardCore.VueForms/StatCan.OrchardCore.VueForms.csproj
index 1b674aeb0..fa0ad513c 100644
--- a/src/Modules/StatCan.OrchardCore.VueForms/StatCan.OrchardCore.VueForms.csproj
+++ b/src/Modules/StatCan.OrchardCore.VueForms/StatCan.OrchardCore.VueForms.csproj
@@ -8,6 +8,8 @@
+
+
@@ -22,7 +24,7 @@
-
+
diff --git a/src/StatCan.OrchardCore.Cms.Web/Localization/fr/StatCan.OrchardCore.Candev.po b/src/StatCan.OrchardCore.Cms.Web/Localization/fr/StatCan.OrchardCore.Candev.po
new file mode 100644
index 000000000..6ace2b9b7
--- /dev/null
+++ b/src/StatCan.OrchardCore.Cms.Web/Localization/fr/StatCan.OrchardCore.Candev.po
@@ -0,0 +1,541 @@
+msgid ""
+msgstr "Content-Type: text/plain\n"
+
+#: StatCan.OrchardCore.Candev\Controllers\AdminController.cs:69
+#. _notifier.Success(H["Cases have been assigned."]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.AdminController"
+msgid "Cases have been assigned."
+msgstr "Les cas ont été assignés."
+
+#: StatCan.OrchardCore.Candev\Controllers\AdminController.cs:92
+#. _notifier.Success(H["Teams have been matched."]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.AdminController"
+msgid "Teams have been matched."
+msgstr "Les équipes ont été assorties"
+
+#: StatCan.OrchardCore.Candev\Controllers\AdminController.cs:106
+#. _notifier.Success(H["Participants have been selected."]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.AdminController"
+msgid "_notifier.Success(H["Checked-In participants have been selected."]);"
+msgstr "Les participants 'Checked-In' ont été sélectionnés"
+
+#: StatCan.OrchardCore.Candev\Controllers\AdminController.cs:120
+#. _notifier.Success(H["Participants have been selected."]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.AdminController"
+msgid "Participants have been selected."
+msgstr "Les participants ont été sélectionnés"
+
+#: StatCan.OrchardCore.Candev\Controllers\AdminController.cs:134
+#. _notifier.Success(H["Teams have been eliminated (In the running set to false)"]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.AdminController"
+msgid "Teams have been eliminated (In the running set to false)"
+msgstr "Les équipes ont été éliminées"
+
+#: StatCan.OrchardCore.Candev\Controllers\CandevController.cs:57
+#. _notifier.Error(H["You cannot create, join or leave teams at this time"]);;
+msgctxt "StatCan.OrchardCore.Candev.Controllers.CandevController"
+msgid "You cannot create, join or leave teams at this time"
+msgstr "Vous ne pouvez pas créer, rejoindre ou quitter une équipe présentement"
+
+#: StatCan.OrchardCore.Candev\Controllers\CandevController.cs:64
+#. _notifier.Success(H["Successfully created team"]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.CandevController"
+msgid "Successfully created team"
+msgstr "Équipe créée avec succès"
+
+#: StatCan.OrchardCore.Candev\Controllers\CandevController.cs:81
+#. _notifier.Error(H["Enter a team ID"]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.CandevController"
+msgid "Enter a team ID"
+msgstr "Saisissez un identifiant d'équipe"
+
+#: StatCan.OrchardCore.Candev\Controllers\CandevController.cs:96
+#. _notifier.Success(H["Successfully joined team"]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.CandevController"
+msgid "Successfully joined team"
+msgstr "A rejoint l'équipe avec succès"
+
+#: StatCan.OrchardCore.Candev\Controllers\CandevController.cs:98
+#. _notifier.Error(H["Team could not be found"]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.CandevController"
+msgid "Team could not be found"
+msgstr "L'équipe n'a pas pu être trouvée"
+
+#: StatCan.OrchardCore.Candev\Controllers\CandevController.cs:125
+#. _notifier.Success(H["Successfully left team"]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.CandevController"
+msgid "Successfully left team"
+msgstr "À quitté l'équipe avec succès"
+
+#: StatCan.OrchardCore.Candev\Controllers\CandevController.cs:151
+#. _notifier.Success(H["Member successfully removed from the team"]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.CandevController"
+msgid "Member successfully removed from the team"
+msgstr "Membre supprimé de l'équipe avec succès"
+
+#: StatCan.OrchardCore.Candev\Controllers\CandevController.cs:177
+#. _notifier.Success(H["Team info successfully updated"]);
+msgctxt "StatCan.OrchardCore.Candev.Controllers.CandevController"
+msgid "Team info successfully updated"
+msgstr "Informations sur l'équipe mises à jour avec succès"
+
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:94
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:131
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:164
+#. modelState.AddModelError("error", T["You are not a hacker"].Value);
+#. modelState.AddModelError("error", T["You are not a hacker"].Value);
+#. modelState.AddModelError("error", T["You are not a hacker"].Value);
+msgctxt "StatCan.OrchardCore.Candev.Services.CandevService"
+msgid "You are not a hacker"
+msgstr "Tu n'es pas un hacker"
+
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:100
+#. modelState.AddModelError("error", T["Already have a team"].Value);
+msgctxt "StatCan.OrchardCore.Candev.Services.CandevService"
+msgid "Already have a team"
+msgstr "Vous avez déjà une équipe"
+
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:107
+#. modelState.AddModelError("error", T["Team does not exist"].Value);
+msgctxt "StatCan.OrchardCore.Candev.Services.CandevService"
+msgid "Team does not exist"
+msgstr "L'équipe n'existe pas"
+
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:113
+#. modelState.AddModelError("error", T["Team is full"]);
+msgctxt "StatCan.OrchardCore.Candev.Services.CandevService"
+msgid "Team is full"
+msgstr "L'équipe est complète"
+
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:137
+#. modelState.AddModelError("error", T["Already on a team"].Value);
+msgctxt "StatCan.OrchardCore.Candev.Services.CandevService"
+msgid "Already on a team"
+msgstr "Déjà dans une équipe"
+
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:170
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:395
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:427
+#. modelState.AddModelError("error", T["You are not part of a team"].Value);
+#. modelState.AddModelError("error", T["You are not part of a team"].Value);
+#. modelState.AddModelError("error", T["You are not part of a team"].Value);
+msgctxt "StatCan.OrchardCore.Candev.Services.CandevService"
+msgid "You are not part of a team"
+msgstr "Vous ne faites pas partie d'une équipe"
+
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:401
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:433
+#. modelState.AddModelError("error", T["You are not the team captain. Only the team captain can perform this action"].Value);
+#. modelState.AddModelError("error", T["You are not the team captain. Only the team captain can perform this action"].Value);
+msgctxt "StatCan.OrchardCore.Candev.Services.CandevService"
+msgid "You are not the team captain. Only the team captain can perform this action"
+msgstr ""
+"Vous n'êtes pas le capitaine de l'équipe. Seul le capitaine de l'équipe "
+"peut effectuer cette action"
+
+#: StatCan.OrchardCore.Candev\Services\CandevService.cs:421
+#. modelState.AddModelError("error", T["Team doesn't exist"].Value);
+msgctxt "StatCan.OrchardCore.Candev.Services.CandevService"
+msgid "Team doesn't exist"
+msgstr "L'équipe n'existe pas"
+
+#: StatCan.OrchardCore.Candev\Views\UserFields.cshtml:11
+#.
+msgctxt "StatCan.OrchardCore.Candev.Views.UserFields"
+msgid "Role"
+msgstr "Rôle"
+
+#: StatCan.OrchardCore.Candev\Views\UserFields.cshtml:18
+#: StatCan.OrchardCore.Candev\Views\UserFields.cshtml:19
+#.
+#. @T["Disabled"]
+msgctxt "StatCan.OrchardCore.Candev.Views.UserFields"
+msgid "Disabled"
+msgstr "Désactivée"
+
+#: StatCan.OrchardCore.Candev\Views\Content-Team.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Content-Team"
+msgid "Description"
+msgstr "Description"
+
+#: StatCan.OrchardCore.Candev\Views\Content-Team.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Content-Team"
+msgid "Challenge"
+msgstr "Défi"
+
+#: StatCan.OrchardCore.Candev\Views\Content-Team.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Content-Team"
+msgid "Save"
+msgstr "Sauvegarder"
+
+#: StatCan.OrchardCore.Candev\Views\Content-Team.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Content-Team"
+msgid "Team Members"
+msgstr "Membres de l'équipe"
+
+#: StatCan.OrchardCore.Candev\Views\Content-Team.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Content-Team"
+msgid "Remove"
+msgstr "Supprimer"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ArchivedSolutions"
+msgid "Challenge"
+msgstr "Défi"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ArchivedSolutions"
+msgid "Statement"
+msgstr "Énoncé"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ArchivedSolutions"
+msgid "Potential Datasets"
+msgstr "Ensembles de données potentiels"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ArchivedSolutions"
+msgid "Background Information"
+msgstr "Informations de référence"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ArchivedSolutions"
+msgid "Organization"
+msgstr "Organisation"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ArchivedSolutions"
+msgid "Mentors"
+msgstr "Mentors"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ArchivedSolutions"
+msgid "Solutions"
+msgstr "Solutions"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ArchivedSolutions"
+msgid "Round"
+msgstr "Ronde"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ArchivedSolutions"
+msgid "Presented"
+msgstr "Présenté"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ArchivedSolutions"
+msgid "View repo"
+msgstr "Voir le dépôt"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ArchivedSolutions.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ArchivedSolutions"
+msgid "Prensented"
+msgstr "Présenté"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ChallengeSubmission.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ChallengeSubmission"
+msgid "Your challenge"
+msgstr "Votre défi"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ChallengeSubmission.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ChallengeSubmission"
+msgid "Statement"
+msgstr "Énoncé"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ChallengeSubmission.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ChallengeSubmission"
+msgid "Background Information & Potential Datasets"
+msgstr "Informations de référence & ensembles de données potentiels"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ChallengeSubmission.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ChallengeSubmission"
+msgid "Organization"
+msgstr "Organisation"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ChallengeSubmission.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ChallengeSubmission"
+msgid "Mentors"
+msgstr "Mentors"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ChallengeSubmission.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ChallengeSubmission"
+msgid "Create a new challenge"
+msgstr "Créer un nouveau défi"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ChallengeSubmission.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ChallengeSubmission"
+msgid "Submission accepted"
+msgstr "Soumission acceptée"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ChallengeSubmission.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ChallengeSubmission"
+msgid "Incomplete"
+msgstr "Incomplet"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ChallengeSubmission.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ChallengeSubmission"
+msgid "Complete"
+msgstr "Complet"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-ChallengeSubmission.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-ChallengeSubmission"
+msgid "Edit"
+msgstr "Modifier"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingListWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingListWidget"
+msgid "No active Judging round"
+msgstr "Pas de ronde de jugement actif"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingListWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingListWidget"
+msgid "There are no teams."
+msgstr "Il n'y a pas 'équipe."
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingListWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingListWidget"
+msgid "Team"
+msgstr "Équipe"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingListWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingListWidget"
+msgid "Score: "
+msgstr "Note: "
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Profile"
+msgstr "Profil"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Email"
+msgstr "E-mail"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Prefered Language"
+msgstr "Langue de préférence"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Roles"
+msgstr "Rôles"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Mentor"
+msgstr "Mentor"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Judge"
+msgstr "Juge"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Agency representative"
+msgstr "Représentant"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Workshop presenter"
+msgstr "Présenteur d'atelier"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Technical advisor"
+msgstr "Conseiller technique"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Keynote speaker"
+msgstr "Conférencier"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Observer"
+msgstr "Observateur"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Organizer / Volunteer"
+msgstr "Organisateur / Bénévole"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-UserProfile.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-UserProfile"
+msgid "Edit"
+msgstr "Modifier"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "Challenge"
+msgstr "Défi"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "Statement"
+msgstr "Énoncé"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "Background Information & Potential Datasets"
+msgstr "Informations de référence & ensembles de données potentiels"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "Organization"
+msgstr "Organisation"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "Technical mentor"
+msgstr "Mentor technique"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "Case specialist"
+msgstr "Spécialiste de cas"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "Solutions"
+msgstr "Solutions"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "Round 1"
+msgstr "Ronde 1"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "Round 2"
+msgstr "Ronde 2"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "Technical"
+msgstr "Technique"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "Subject Matter"
+msgstr "Sujet matière"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-JudgingResults.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-JudgingResults"
+msgid "View repo"
+msgstr "Voir le dépôt"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "ID"
+msgstr "ID"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Click to copy. Share your team identifier to invite members"
+msgstr "Cliquez pour copier. Partagez votre identifiant d'équipe pour inviter d'autres membres d'équipe"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "You are the team captain."
+msgstr "Vous êtes le capitaine d'équipe."
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Order topics, edit your team name and description using the form at the bottom of this page."
+msgstr "Classez les sujets, modifiez le nom et la description de votre équipe à l'aide du formulaire."
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Challenge"
+msgstr "Défi"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Statement"
+msgstr "Énoncé"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Background Information & Potential Datasets"
+msgstr "Informations de référence & ensembles de données potentiels"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Organization"
+msgstr "Organisation"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Technical mentor"
+msgstr "Mentor technique"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Case specialist"
+msgstr "Spécialiste de cas"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Team Members"
+msgstr "Membres d'équipe"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Warning"
+msgstr "Attention"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "You are the team captain. Leaving the team will assign another member as the team captain."
+msgstr "Vous êtes le capitaine de l'équipe. Quitter l'équipe désignera un autre membre comme capitaine de l'équipe."
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Are you sure you want to leave {0}?"
+msgstr "Êtes-vous sûr de vouloir quitter {0}?"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Remove"
+msgstr "Renvoyer"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Leave team"
+msgstr "Quitter l'équipe"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Topics in your order of interest (only the team captain can reorder)"
+msgstr "Sujets dans votre ordre d'intérêt (seul le capitaine de l'équipe peut les classer)"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Please create or join an existing team"
+msgstr "Veuillez créer ou rejoindre une équipe existante"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Create team"
+msgstr "Créer une équipe"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Or"
+msgstr "Ou"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Team Identifier"
+msgstr "Identifiant d'équipe"
+
+#: StatCan.OrchardCore.Candev\Views\Widget-TeamDashboardWidget.liquid:0
+msgctxt "StatCan.OrchardCore.Candev.Views.Widget-TeamDashboardWidget"
+msgid "Join team"
+msgstr "Rejoindre une équipe"
\ No newline at end of file
diff --git a/src/Themes/HackathonTheme/HackathonTheme.csproj b/src/Themes/HackathonTheme/HackathonTheme.csproj
index ac81dee61..6626920b8 100644
--- a/src/Themes/HackathonTheme/HackathonTheme.csproj
+++ b/src/Themes/HackathonTheme/HackathonTheme.csproj
@@ -8,6 +8,7 @@
+
diff --git a/src/Themes/HackathonTheme/Migrations.cs b/src/Themes/HackathonTheme/Migrations.cs
index a2bcb2f96..86d1cfc31 100644
--- a/src/Themes/HackathonTheme/Migrations.cs
+++ b/src/Themes/HackathonTheme/Migrations.cs
@@ -4,6 +4,8 @@
using OrchardCore.Environment.Extensions;
using OrchardCore.Environment.Shell;
using OrchardCore.Themes.Services;
+using StatCan.OrchardCore.Vuetify;
+
namespace StatCan.Themes.HackathonTheme
{
public class Migrations : DataMigration
@@ -64,9 +66,23 @@ public async Task UpdateFrom7()
private async Task MigrateToVuetifyTheme()
{
- var vuetify = _extensionManager.GetFeatures(new []{"VuetifyTheme"});
- await _shellFeaturesManager.EnableFeaturesAsync(vuetify);
-
+ var vuetifyModule = _extensionManager.GetFeatures(new []{
+ "VuetifyTheme",
+ "OrchardCore.ContentTypes",
+ "StatCan.OrchardCore.DisplayHelpers",
+ "StatCan.OrchardCore.Menu",
+ Constants.Features.Vuetify,
+ Constants.Features.Alert,
+ Constants.Features .Card,
+ Constants.Features .ExpansionPanel,
+ Constants.Features.Grid,
+ Constants.Features.Image,
+ Constants.Features.List,
+ Constants.Features.Schedule,
+ Constants.Features.Tabs,
+ Constants.Features.Timeline,
+ });
+ await _shellFeaturesManager.EnableFeaturesAsync(vuetifyModule, true);
await _siteThemeService.SetSiteThemeAsync("VuetifyTheme");
}
}
diff --git a/src/Themes/HackathonTheme/Views/Layout.cshtml b/src/Themes/HackathonTheme/Views/Layout.cshtml
new file mode 100644
index 000000000..36561c386
--- /dev/null
+++ b/src/Themes/HackathonTheme/Views/Layout.cshtml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ @ViewBag.Title - Orchard Core
+
+
+ @T["SAFE MODE"]
+ @await RenderSectionAsync("Header", required: false)
+ @await RenderBodyAsync()
+
+
+
+ @await RenderSectionAsync("Footer", required: false)
+
+
+
\ No newline at end of file
diff --git a/src/Themes/HackathonTheme/Views/_ViewImports.cshtml b/src/Themes/HackathonTheme/Views/_ViewImports.cshtml
new file mode 100644
index 000000000..88c4f01cb
--- /dev/null
+++ b/src/Themes/HackathonTheme/Views/_ViewImports.cshtml
@@ -0,0 +1,5 @@
+@*
+ For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
+*@
+
+@inherits OrchardCore.DisplayManagement.Razor.RazorPage
diff --git a/test/cypress/fixtures/recipes/candev-content.json b/test/cypress/fixtures/recipes/candev-content.json
new file mode 100644
index 000000000..c3b3dbc2f
--- /dev/null
+++ b/test/cypress/fixtures/recipes/candev-content.json
@@ -0,0 +1,191 @@
+{
+ "steps": [
+ {
+ "name": "Content",
+ "data": [
+ {
+ "ContentItemId": "46n9jb7h67hcys32ss5ysjy4w4",
+ "ContentItemVersionId": "44mga3db0br3v49c42vtra5056",
+ "ContentType": "Page",
+ "DisplayText": "Test Page",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-02-22T19:38:26.7148744Z",
+ "PublishedUtc": "2021-02-22T19:38:26.8521496Z",
+ "CreatedUtc": "2021-02-22T19:38:26.7148744Z",
+ "Owner": "4c4wz1jfm8zrazv5076exf4q4p",
+ "Author": "admin",
+ "LocalizationPart": {
+ "LocalizationSet": "46xe65mh39sps451mysrsshewf",
+ "Culture": "en"
+ },
+ "TitlePart": {
+ "Title": "Test Page"
+ },
+ "AutoroutePart": {
+ "Path": "test-page",
+ "SetHomepage": false,
+ "Disabled": false,
+ "RouteContainedItems": false,
+ "Absolute": false
+ },
+ "FlowPart": {
+ "Widgets": [
+ {
+ "ContentItemId": "4r6xrcddchk3nydmrymzpchem6",
+ "ContentItemVersionId": null,
+ "ContentType": "TeamDashboardWidget",
+ "DisplayText": null,
+ "Latest": false,
+ "Published": false,
+ "ModifiedUtc": "2021-02-22T19:38:26.1970799Z",
+ "PublishedUtc": null,
+ "CreatedUtc": null,
+ "Owner": null,
+ "Author": "admin",
+ "TeamDashboardWidget": {
+ "SoloMessage": {
+ "Html": ""
+ },
+ "TeamMessage": {
+ "Html": ""
+ }
+ },
+ "FlowMetadata": {
+ "Alignment": 3,
+ "Size": 100
+ }
+ }
+ ]
+ }
+ },
+ {
+ "ContentItemId": "4yv4zws4z3pkq5tsf8pzv02vx8",
+ "ContentType": "Challenge",
+ "DisplayText": " Team Management Test Challenge",
+ "Latest": true,
+ "Published": true,
+ "Owner": "[js: parameters('AdminUserId')]",
+ "Author": "[js: parameters('AdminUsername')]",
+ "TitlePart": {
+ "Title": " Team Management Test Challenge"
+ },
+ "Challenge": {
+ "Name": {
+ "Text": " Team Management Test Challenge"
+ },
+ "ShortDescription": {
+ "Text": "Lorem ipsum dolor sit amet, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
+ }
+ },
+ "MarkdownBodyPart": {
+ "Markdown": "Lorem ipsum dolor sit amet, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
+ }
+ },
+ {
+ "ContentItemId": "46p8s03jb80m037f96frfhs9mv",
+ "ContentItemVersionId": "4xtk7tnv39zf1vrfsxq1f8tgcg",
+ "ContentType": "Team",
+ "DisplayText": "-Awesome Team-0",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-13T13:43:55.003077Z",
+ "PublishedUtc": "2021-10-13T13:43:55.0459006Z",
+ "CreatedUtc": "2021-10-13T13:43:55.003077Z",
+ "Owner": "[js: parameters('AdminUserId')]",
+ "Author": "[js: parameters('AdminUsername')]",
+ "TitlePart": {
+ "Title": "-Awesome Team-0"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Awesome Team"
+ },
+ "Description": {
+ "Text": "awesome Team"
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": [],
+ "UserNames": []
+ },
+ "Topics": {
+ "ContentItemIds": []
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ }
+ ]
+ },
+ {
+ "name": "custom-settings",
+ "HackathonThemeSettings": {
+ "ContentItemId": "4epf2qpg89kzzrsktbbzrgrs5a",
+ "ContentItemVersionId": null,
+ "ContentType": "HackathonThemeSettings",
+ "DisplayText": null,
+ "Latest": false,
+ "Published": false,
+ "ModifiedUtc": null,
+ "PublishedUtc": null,
+ "CreatedUtc": null,
+ "Owner": null,
+ "Author": null,
+ "HackathonThemeSettings": {}
+ },
+ "HackathonCustomSettings": {
+ "ContentItemId": "4y7vgze86q92d79wd14ddenhna",
+ "ContentItemVersionId": null,
+ "ContentType": "HackathonCustomSettings",
+ "DisplayText": "",
+ "Latest": false,
+ "Published": false,
+ "ModifiedUtc": null,
+ "PublishedUtc": null,
+ "CreatedUtc": null,
+ "Owner": "",
+ "Author": "admin",
+ "HackathonCustomSettings": {
+ "StartDate": {
+ "Value": null
+ },
+ "EndDate": {
+ "Value": null
+ },
+ "Capacity": {
+ "Value": 0.0
+ }
+ },
+ "TeamCustomSettings": {
+ "TeamSize": {
+ "Value": 4
+ },
+ "TeamEditable": {
+ "Value": true
+ },
+ "PartialChallenge": {
+ "Value": true
+ }
+ },
+ "JudgingCustomSettings": {
+ "JudgingInProgress": {
+ "Value": false
+ }
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test/cypress/fixtures/recipes/candev-test-data.json b/test/cypress/fixtures/recipes/candev-test-data.json
new file mode 100644
index 000000000..d9b78aaa6
--- /dev/null
+++ b/test/cypress/fixtures/recipes/candev-test-data.json
@@ -0,0 +1,3259 @@
+{
+ "steps": [
+ {
+ "name": "content",
+ "data": [
+ {
+ "ContentItemId": "4p6jdx5nx1y4mr1z831p5g4zdj",
+ "ContentItemVersionId": "4g0z43tewwnnpw7tk5qpj2mnnf",
+ "ContentType": "Challenge",
+ "DisplayText": "Challenge1",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:30:06.3805153Z",
+ "PublishedUtc": "2021-10-21T15:30:06.3591404Z",
+ "CreatedUtc": "2021-10-21T15:30:06.1947015Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "Challenge1"
+ },
+ "Challenge": {
+ "Title": {
+ "Text": "Challenge1"
+ },
+ "DatasetsFiles": {
+ "Paths": null,
+ "MediaTexts": null
+ },
+ "BackgroundInformation": {
+ "Text": null
+ },
+ "ContactPersonName": {
+ "Text": null
+ },
+ "ContactPersonEmail": {
+ "Text": null
+ },
+ "TechnicalMentorName": {
+ "Text": null
+ },
+ "TechnicalMentorEmail": {
+ "Text": null
+ },
+ "CaseSpecialistName": {
+ "Text": null
+ },
+ "CaseSpecialistEmail": {
+ "Text": null
+ },
+ "Comments": {
+ "Text": null
+ },
+ "Statement": {
+ "Text": null
+ },
+ "Datasets": {
+ "Text": null
+ },
+ "OrganizationNameEn": {
+ "Text": null
+ },
+ "OrganizationAcronymEn": {
+ "Text": null
+ },
+ "Keywords": {
+ "Text": null
+ },
+ "OrganizationNameFr": {
+ "Text": null
+ },
+ "OrganizationAcronymFr": {
+ "Text": null
+ }
+ },
+ "MarkdownBodyPart": {
+ "Markdown": null
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4stwa9hcvpd52y4xz79x8cegnv",
+ "ContentItemVersionId": "4bqgf8cwh6y9a2n2aakkrdvexw",
+ "ContentType": "Challenge",
+ "DisplayText": "Challenge2",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:30:06.4090565Z",
+ "PublishedUtc": "2021-10-21T15:30:06.407127Z",
+ "CreatedUtc": "2021-10-21T15:30:06.404021Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "Challenge2"
+ },
+ "Challenge": {
+ "Title": {
+ "Text": "Challenge2"
+ },
+ "DatasetsFiles": {
+ "Paths": null,
+ "MediaTexts": null
+ },
+ "BackgroundInformation": {
+ "Text": null
+ },
+ "ContactPersonName": {
+ "Text": null
+ },
+ "ContactPersonEmail": {
+ "Text": null
+ },
+ "TechnicalMentorName": {
+ "Text": null
+ },
+ "TechnicalMentorEmail": {
+ "Text": null
+ },
+ "CaseSpecialistName": {
+ "Text": null
+ },
+ "CaseSpecialistEmail": {
+ "Text": null
+ },
+ "Comments": {
+ "Text": null
+ },
+ "Statement": {
+ "Text": null
+ },
+ "Datasets": {
+ "Text": null
+ },
+ "OrganizationNameEn": {
+ "Text": null
+ },
+ "OrganizationAcronymEn": {
+ "Text": null
+ },
+ "Keywords": {
+ "Text": null
+ },
+ "OrganizationNameFr": {
+ "Text": null
+ },
+ "OrganizationAcronymFr": {
+ "Text": null
+ }
+ },
+ "MarkdownBodyPart": {
+ "Markdown": null
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4jvmgr423kkj96c4tr3smhywmq",
+ "ContentItemVersionId": "4b0tdf0zdtcnhwscy4f4ja2zn8",
+ "ContentType": "Challenge",
+ "DisplayText": "Challenge3",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:30:06.416663Z",
+ "PublishedUtc": "2021-10-21T15:30:06.4148588Z",
+ "CreatedUtc": "2021-10-21T15:30:06.412025Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "Challenge3"
+ },
+ "Challenge": {
+ "Title": {
+ "Text": "Challenge3"
+ },
+ "DatasetsFiles": {
+ "Paths": null,
+ "MediaTexts": null
+ },
+ "BackgroundInformation": {
+ "Text": null
+ },
+ "ContactPersonName": {
+ "Text": null
+ },
+ "ContactPersonEmail": {
+ "Text": null
+ },
+ "TechnicalMentorName": {
+ "Text": null
+ },
+ "TechnicalMentorEmail": {
+ "Text": null
+ },
+ "CaseSpecialistName": {
+ "Text": null
+ },
+ "CaseSpecialistEmail": {
+ "Text": null
+ },
+ "Comments": {
+ "Text": null
+ },
+ "Statement": {
+ "Text": null
+ },
+ "Datasets": {
+ "Text": null
+ },
+ "OrganizationNameEn": {
+ "Text": null
+ },
+ "OrganizationAcronymEn": {
+ "Text": null
+ },
+ "Keywords": {
+ "Text": null
+ },
+ "OrganizationNameFr": {
+ "Text": null
+ },
+ "OrganizationAcronymFr": {
+ "Text": null
+ }
+ },
+ "MarkdownBodyPart": {
+ "Markdown": null
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4d49qa0j7tt0xzqbc5dxfq2hmm",
+ "ContentItemVersionId": "49re6skqfgq67yvwdmy08t6kmy",
+ "ContentType": "Challenge",
+ "DisplayText": "Challenge4",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:30:06.4234831Z",
+ "PublishedUtc": "2021-10-21T15:30:06.4215789Z",
+ "CreatedUtc": "2021-10-21T15:30:06.4187432Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "Challenge4"
+ },
+ "Challenge": {
+ "Title": {
+ "Text": "Challenge4"
+ },
+ "DatasetsFiles": {
+ "Paths": null,
+ "MediaTexts": null
+ },
+ "BackgroundInformation": {
+ "Text": null
+ },
+ "ContactPersonName": {
+ "Text": null
+ },
+ "ContactPersonEmail": {
+ "Text": null
+ },
+ "TechnicalMentorName": {
+ "Text": null
+ },
+ "TechnicalMentorEmail": {
+ "Text": null
+ },
+ "CaseSpecialistName": {
+ "Text": null
+ },
+ "CaseSpecialistEmail": {
+ "Text": null
+ },
+ "Comments": {
+ "Text": null
+ },
+ "Statement": {
+ "Text": null
+ },
+ "Datasets": {
+ "Text": null
+ },
+ "OrganizationNameEn": {
+ "Text": null
+ },
+ "OrganizationAcronymEn": {
+ "Text": null
+ },
+ "Keywords": {
+ "Text": null
+ },
+ "OrganizationNameFr": {
+ "Text": null
+ },
+ "OrganizationAcronymFr": {
+ "Text": null
+ }
+ },
+ "MarkdownBodyPart": {
+ "Markdown": null
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4bckqmrg4bkrxtgq1806q7adn2",
+ "ContentItemVersionId": "4213nt18syyvd2yvqcessrxywx",
+ "ContentType": "Challenge",
+ "DisplayText": "Challenge5",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:30:06.4309305Z",
+ "PublishedUtc": "2021-10-21T15:30:06.4287216Z",
+ "CreatedUtc": "2021-10-21T15:30:06.4257055Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "Challenge5"
+ },
+ "Challenge": {
+ "Title": {
+ "Text": "Challenge5"
+ },
+ "DatasetsFiles": {
+ "Paths": null,
+ "MediaTexts": null
+ },
+ "BackgroundInformation": {
+ "Text": null
+ },
+ "ContactPersonName": {
+ "Text": null
+ },
+ "ContactPersonEmail": {
+ "Text": null
+ },
+ "TechnicalMentorName": {
+ "Text": null
+ },
+ "TechnicalMentorEmail": {
+ "Text": null
+ },
+ "CaseSpecialistName": {
+ "Text": null
+ },
+ "CaseSpecialistEmail": {
+ "Text": null
+ },
+ "Comments": {
+ "Text": null
+ },
+ "Statement": {
+ "Text": null
+ },
+ "Datasets": {
+ "Text": null
+ },
+ "OrganizationNameEn": {
+ "Text": null
+ },
+ "OrganizationAcronymEn": {
+ "Text": null
+ },
+ "Keywords": {
+ "Text": null
+ },
+ "OrganizationNameFr": {
+ "Text": null
+ },
+ "OrganizationAcronymFr": {
+ "Text": null
+ }
+ },
+ "MarkdownBodyPart": {
+ "Markdown": null
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "45jtfk5axxae8yjf2dcgchr85a",
+ "ContentItemVersionId": "4vjmhmgsmj2m7627998s585tw3",
+ "ContentType": "Challenge",
+ "DisplayText": "Challenge6",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:30:06.4388534Z",
+ "PublishedUtc": "2021-10-21T15:30:06.4367767Z",
+ "CreatedUtc": "2021-10-21T15:30:06.4336107Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "Challenge6"
+ },
+ "Challenge": {
+ "Title": {
+ "Text": "Challenge6"
+ },
+ "DatasetsFiles": {
+ "Paths": null,
+ "MediaTexts": null
+ },
+ "BackgroundInformation": {
+ "Text": null
+ },
+ "ContactPersonName": {
+ "Text": null
+ },
+ "ContactPersonEmail": {
+ "Text": null
+ },
+ "TechnicalMentorName": {
+ "Text": null
+ },
+ "TechnicalMentorEmail": {
+ "Text": null
+ },
+ "CaseSpecialistName": {
+ "Text": null
+ },
+ "CaseSpecialistEmail": {
+ "Text": null
+ },
+ "Comments": {
+ "Text": null
+ },
+ "Statement": {
+ "Text": null
+ },
+ "Datasets": {
+ "Text": null
+ },
+ "OrganizationNameEn": {
+ "Text": null
+ },
+ "OrganizationAcronymEn": {
+ "Text": null
+ },
+ "Keywords": {
+ "Text": null
+ },
+ "OrganizationNameFr": {
+ "Text": null
+ },
+ "OrganizationAcronymFr": {
+ "Text": null
+ }
+ },
+ "MarkdownBodyPart": {
+ "Markdown": null
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4f2kkmjm2pqrcsearft6vjf747",
+ "ContentItemVersionId": "48pa082t9rcgq45evx6hz6cvnb",
+ "ContentType": "Challenge",
+ "DisplayText": "Challenge7",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:30:06.44685Z",
+ "PublishedUtc": "2021-10-21T15:30:06.444567Z",
+ "CreatedUtc": "2021-10-21T15:30:06.4412644Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "Challenge7"
+ },
+ "Challenge": {
+ "Title": {
+ "Text": "Challenge7"
+ },
+ "DatasetsFiles": {
+ "Paths": null,
+ "MediaTexts": null
+ },
+ "BackgroundInformation": {
+ "Text": null
+ },
+ "ContactPersonName": {
+ "Text": null
+ },
+ "ContactPersonEmail": {
+ "Text": null
+ },
+ "TechnicalMentorName": {
+ "Text": null
+ },
+ "TechnicalMentorEmail": {
+ "Text": null
+ },
+ "CaseSpecialistName": {
+ "Text": null
+ },
+ "CaseSpecialistEmail": {
+ "Text": null
+ },
+ "Comments": {
+ "Text": null
+ },
+ "Statement": {
+ "Text": null
+ },
+ "Datasets": {
+ "Text": null
+ },
+ "OrganizationNameEn": {
+ "Text": null
+ },
+ "OrganizationAcronymEn": {
+ "Text": null
+ },
+ "Keywords": {
+ "Text": null
+ },
+ "OrganizationNameFr": {
+ "Text": null
+ },
+ "OrganizationAcronymFr": {
+ "Text": null
+ }
+ },
+ "MarkdownBodyPart": {
+ "Markdown": null
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4kk6w9ah2b5fwytvwhtmjvayd4",
+ "ContentItemVersionId": "4xg1yhedq4de1z2mzf3v9g095v",
+ "ContentType": "Challenge",
+ "DisplayText": "Challenge8",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:30:06.4550212Z",
+ "PublishedUtc": "2021-10-21T15:30:06.452587Z",
+ "CreatedUtc": "2021-10-21T15:30:06.4493538Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "Challenge8"
+ },
+ "Challenge": {
+ "Title": {
+ "Text": "Challenge8"
+ },
+ "DatasetsFiles": {
+ "Paths": null,
+ "MediaTexts": null
+ },
+ "BackgroundInformation": {
+ "Text": null
+ },
+ "ContactPersonName": {
+ "Text": null
+ },
+ "ContactPersonEmail": {
+ "Text": null
+ },
+ "TechnicalMentorName": {
+ "Text": null
+ },
+ "TechnicalMentorEmail": {
+ "Text": null
+ },
+ "CaseSpecialistName": {
+ "Text": null
+ },
+ "CaseSpecialistEmail": {
+ "Text": null
+ },
+ "Comments": {
+ "Text": null
+ },
+ "Statement": {
+ "Text": null
+ },
+ "Datasets": {
+ "Text": null
+ },
+ "OrganizationNameEn": {
+ "Text": null
+ },
+ "OrganizationAcronymEn": {
+ "Text": null
+ },
+ "Keywords": {
+ "Text": null
+ },
+ "OrganizationNameFr": {
+ "Text": null
+ },
+ "OrganizationAcronymFr": {
+ "Text": null
+ }
+ },
+ "MarkdownBodyPart": {
+ "Markdown": null
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4g4mqcmks72th6xx0db96n5pwp",
+ "ContentItemVersionId": "4vegq9v2xa5asz4y1d7ecb8c5v",
+ "ContentType": "Challenge",
+ "DisplayText": "Challenge9",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:30:06.4634951Z",
+ "PublishedUtc": "2021-10-21T15:30:06.461083Z",
+ "CreatedUtc": "2021-10-21T15:30:06.4577564Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "Challenge9"
+ },
+ "Challenge": {
+ "Title": {
+ "Text": "Challenge9"
+ },
+ "DatasetsFiles": {
+ "Paths": null,
+ "MediaTexts": null
+ },
+ "BackgroundInformation": {
+ "Text": null
+ },
+ "ContactPersonName": {
+ "Text": null
+ },
+ "ContactPersonEmail": {
+ "Text": null
+ },
+ "TechnicalMentorName": {
+ "Text": null
+ },
+ "TechnicalMentorEmail": {
+ "Text": null
+ },
+ "CaseSpecialistName": {
+ "Text": null
+ },
+ "CaseSpecialistEmail": {
+ "Text": null
+ },
+ "Comments": {
+ "Text": null
+ },
+ "Statement": {
+ "Text": null
+ },
+ "Datasets": {
+ "Text": null
+ },
+ "OrganizationNameEn": {
+ "Text": null
+ },
+ "OrganizationAcronymEn": {
+ "Text": null
+ },
+ "Keywords": {
+ "Text": null
+ },
+ "OrganizationNameFr": {
+ "Text": null
+ },
+ "OrganizationAcronymFr": {
+ "Text": null
+ }
+ },
+ "MarkdownBodyPart": {
+ "Markdown": null
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "41a86p526nm73t794dw2mq72x0",
+ "ContentItemVersionId": "4ge59ghkn8fbz0gw9r893v8vma",
+ "ContentType": "Challenge",
+ "DisplayText": "Challenge10",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:30:06.4724781Z",
+ "PublishedUtc": "2021-10-21T15:30:06.4699613Z",
+ "CreatedUtc": "2021-10-21T15:30:06.4665329Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "Challenge10"
+ },
+ "Challenge": {
+ "Title": {
+ "Text": "Challenge10"
+ },
+ "DatasetsFiles": {
+ "Paths": null,
+ "MediaTexts": null
+ },
+ "BackgroundInformation": {
+ "Text": null
+ },
+ "ContactPersonName": {
+ "Text": null
+ },
+ "ContactPersonEmail": {
+ "Text": null
+ },
+ "TechnicalMentorName": {
+ "Text": null
+ },
+ "TechnicalMentorEmail": {
+ "Text": null
+ },
+ "CaseSpecialistName": {
+ "Text": null
+ },
+ "CaseSpecialistEmail": {
+ "Text": null
+ },
+ "Comments": {
+ "Text": null
+ },
+ "Statement": {
+ "Text": null
+ },
+ "Datasets": {
+ "Text": null
+ },
+ "OrganizationNameEn": {
+ "Text": null
+ },
+ "OrganizationAcronymEn": {
+ "Text": null
+ },
+ "Keywords": {
+ "Text": null
+ },
+ "OrganizationNameFr": {
+ "Text": null
+ },
+ "OrganizationAcronymFr": {
+ "Text": null
+ }
+ },
+ "MarkdownBodyPart": {
+ "Markdown": null
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4jp9g2g3a6n4862th955831n44",
+ "ContentItemVersionId": "4dvqb3azkdk4tvd69vqk6mqbd1",
+ "ContentType": "Topic",
+ "DisplayText": "Topic1",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:42:24.0446058Z",
+ "PublishedUtc": "2021-10-21T15:42:24.0429053Z",
+ "CreatedUtc": "2021-10-21T15:42:24.0271029Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "Topic": {
+ "Name": {
+ "Text": "Topic1"
+ },
+ "Challenge": {
+ "ContentItemIds": [
+ "4p6jdx5nx1y4mr1z831p5g4zdj"
+ ]
+ }
+ },
+ "TitlePart": {
+ "Title": "Topic1"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "45v0dxmfz1jy669pnhxvzdpqm5",
+ "ContentItemVersionId": "4zypsm3hhsj90rwkksr5zaj8nh",
+ "ContentType": "Topic",
+ "DisplayText": "Topic2",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:42:24.0517189Z",
+ "PublishedUtc": "2021-10-21T15:42:24.0501737Z",
+ "CreatedUtc": "2021-10-21T15:42:24.0474561Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "Topic": {
+ "Name": {
+ "Text": "Topic2"
+ },
+ "Challenge": {
+ "ContentItemIds": [
+ "4stwa9hcvpd52y4xz79x8cegnv"
+ ]
+ }
+ },
+ "TitlePart": {
+ "Title": "Topic2"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "ContentItemVersionId": "4zmw4370yc7tssbmvshh4yw9cs",
+ "ContentType": "Topic",
+ "DisplayText": "Topic3",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:42:24.0580275Z",
+ "PublishedUtc": "2021-10-21T15:42:24.0562818Z",
+ "CreatedUtc": "2021-10-21T15:42:24.0534941Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "Topic": {
+ "Name": {
+ "Text": "Topic3"
+ },
+ "Challenge": {
+ "ContentItemIds": [
+ "4jvmgr423kkj96c4tr3smhywmq"
+ ]
+ }
+ },
+ "TitlePart": {
+ "Title": "Topic3"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "ContentItemVersionId": "40ms2035ehkay5k8dgn4m1efw8",
+ "ContentType": "Topic",
+ "DisplayText": "Topic4",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:42:24.0643189Z",
+ "PublishedUtc": "2021-10-21T15:42:24.0625778Z",
+ "CreatedUtc": "2021-10-21T15:42:24.0597743Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "Topic": {
+ "Name": {
+ "Text": "Topic4"
+ },
+ "Challenge": {
+ "ContentItemIds": [
+ "4d49qa0j7tt0xzqbc5dxfq2hmm"
+ ]
+ }
+ },
+ "TitlePart": {
+ "Title": "Topic4"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4ewe95s5xjw3833n87b727e7mk",
+ "ContentItemVersionId": "4v4xhymy8d9yjtxfw6k8h83m4m",
+ "ContentType": "Topic",
+ "DisplayText": "Topic5",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:42:24.0712618Z",
+ "PublishedUtc": "2021-10-21T15:42:24.0694105Z",
+ "CreatedUtc": "2021-10-21T15:42:24.0663899Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "Topic": {
+ "Name": {
+ "Text": "Topic5"
+ },
+ "Challenge": {
+ "ContentItemIds": [
+ "4bckqmrg4bkrxtgq1806q7adn2"
+ ]
+ }
+ },
+ "TitlePart": {
+ "Title": "Topic5"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4ehecaczh1bq30kekdsktcdtx3",
+ "ContentItemVersionId": "4yyzseragvtjg3yygcr30ta2ws",
+ "ContentType": "Topic",
+ "DisplayText": "Topic6",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:42:24.0779737Z",
+ "PublishedUtc": "2021-10-21T15:42:24.0760386Z",
+ "CreatedUtc": "2021-10-21T15:42:24.0731933Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "Topic": {
+ "Name": {
+ "Text": "Topic6"
+ },
+ "Challenge": {
+ "ContentItemIds": [
+ "45jtfk5axxae8yjf2dcgchr85a"
+ ]
+ }
+ },
+ "TitlePart": {
+ "Title": "Topic6"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "44ps0jjrch4p4wjw7v04p0brcg",
+ "ContentItemVersionId": "4ezg34kn1eggj5007cay28z04g",
+ "ContentType": "Topic",
+ "DisplayText": "Topic7",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:42:24.0848003Z",
+ "PublishedUtc": "2021-10-21T15:42:24.0827178Z",
+ "CreatedUtc": "2021-10-21T15:42:24.0798665Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "Topic": {
+ "Name": {
+ "Text": "Topic7"
+ },
+ "Challenge": {
+ "ContentItemIds": [
+ "4f2kkmjm2pqrcsearft6vjf747"
+ ]
+ }
+ },
+ "TitlePart": {
+ "Title": "Topic7"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "44madvxy128gv3c5mw1jed8g4x",
+ "ContentItemVersionId": "4ascxz7hftryt205kbsrz86r5v",
+ "ContentType": "Topic",
+ "DisplayText": "Topic8",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:42:24.0917194Z",
+ "PublishedUtc": "2021-10-21T15:42:24.089826Z",
+ "CreatedUtc": "2021-10-21T15:42:24.0869111Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "Topic": {
+ "Name": {
+ "Text": "Topic8"
+ },
+ "Challenge": {
+ "ContentItemIds": [
+ "4kk6w9ah2b5fwytvwhtmjvayd4"
+ ]
+ }
+ },
+ "TitlePart": {
+ "Title": "Topic8"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4hz2pdn40vb97rdxway647kgc5",
+ "ContentItemVersionId": "4j2hdcaeqkz3br0pjskqgbp24r",
+ "ContentType": "Topic",
+ "DisplayText": "Topic9",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:42:24.0989799Z",
+ "PublishedUtc": "2021-10-21T15:42:24.0968732Z",
+ "CreatedUtc": "2021-10-21T15:42:24.0937265Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "Topic": {
+ "Name": {
+ "Text": "Topic9"
+ },
+ "Challenge": {
+ "ContentItemIds": [
+ "4g4mqcmks72th6xx0db96n5pwp"
+ ]
+ }
+ },
+ "TitlePart": {
+ "Title": "Topic9"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4khrvx85z6ycmxmpepsmwpzvd8",
+ "ContentItemVersionId": "4dtkh5z2v4dcwsryyc27b47jw6",
+ "ContentType": "Topic",
+ "DisplayText": "Topic10",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T15:42:24.1061918Z",
+ "PublishedUtc": "2021-10-21T15:42:24.1041611Z",
+ "CreatedUtc": "2021-10-21T15:42:24.1011855Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "Topic": {
+ "Name": {
+ "Text": "Topic10"
+ },
+ "Challenge": {
+ "ContentItemIds": [
+ "41a86p526nm73t794dw2mq72x0"
+ ]
+ }
+ },
+ "TitlePart": {
+ "Title": "Topic10"
+ },
+ "LocalizationPart": {
+ "LocalizationSet": null,
+ "Culture": null
+ }
+ },
+ {
+ "ContentItemId": "4mymz378sjf18z7sez23sz104b",
+ "ContentItemVersionId": "4e46h3fgwd07b7qmxt6ay2bnc7",
+ "ContentType": "Team",
+ "DisplayText": "-Team1-66",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:24.9132273Z",
+ "PublishedUtc": "2021-10-21T18:37:24.8928262Z",
+ "CreatedUtc": "2021-10-21T18:37:24.7025554Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team1-66"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team1"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4200r6gjyeckdvj0tm8evsvjcn",
+ "ContentItemVersionId": "40a3f3awgcet909h9djryxxgnz",
+ "ContentType": "Team",
+ "DisplayText": "-Team2-67",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.3026756Z",
+ "PublishedUtc": "2021-10-21T18:37:25.3006166Z",
+ "CreatedUtc": "2021-10-21T18:37:25.2972121Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team2-67"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team2"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "41hyc453ztmww21epqh4kgjf51",
+ "ContentItemVersionId": "4r1ab5qf3ktr6xccxgxjtzx2ne",
+ "ContentType": "Team",
+ "DisplayText": "-Team3-68",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.3124561Z",
+ "PublishedUtc": "2021-10-21T18:37:25.3103029Z",
+ "CreatedUtc": "2021-10-21T18:37:25.3069214Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team3-68"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team3"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "44vavsmgqzjprztexzvefb6hm3",
+ "ContentItemVersionId": "4qqydbk8939aeyc1g06t1t32n2",
+ "ContentType": "Team",
+ "DisplayText": "-Team4-69",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.3228924Z",
+ "PublishedUtc": "2021-10-21T18:37:25.320637Z",
+ "CreatedUtc": "2021-10-21T18:37:25.3172503Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team4-69"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team4"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4rd0rtsrvev046bfer1h1n6t4j",
+ "ContentItemVersionId": "4ft1sykcz7t5byh1041yysq8cc",
+ "ContentType": "Team",
+ "DisplayText": "-Team5-70",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.3326799Z",
+ "PublishedUtc": "2021-10-21T18:37:25.3298195Z",
+ "CreatedUtc": "2021-10-21T18:37:25.3259866Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team5-70"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team5"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4vgbq5221vh8ns6bepk62p5153",
+ "ContentItemVersionId": "4vcntt2cej30avbv3benjc3s4n",
+ "ContentType": "Team",
+ "DisplayText": "-Team6-71",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.343107Z",
+ "PublishedUtc": "2021-10-21T18:37:25.3403116Z",
+ "CreatedUtc": "2021-10-21T18:37:25.3364147Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team6-71"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team6"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "49s5y4x1apf9f56p8fqxgywbn8",
+ "ContentItemVersionId": "4r6ry6cz3rm8v6j6a60gcgkxn4",
+ "ContentType": "Team",
+ "DisplayText": "-Team7-72",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.353487Z",
+ "PublishedUtc": "2021-10-21T18:37:25.350864Z",
+ "CreatedUtc": "2021-10-21T18:37:25.3470139Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team7-72"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team7"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4a5ze9f46320htr5d8cm61hwms",
+ "ContentItemVersionId": "4ha6ppvy1rmqx7y85csj1wbmcw",
+ "ContentType": "Team",
+ "DisplayText": "-Team8-73",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.3641428Z",
+ "PublishedUtc": "2021-10-21T18:37:25.3611174Z",
+ "CreatedUtc": "2021-10-21T18:37:25.3571909Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team8-73"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team8"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4a1812vwc04xxvny3z54hr48mh",
+ "ContentItemVersionId": "4byk9yzqahb9ywv7jy2basaw44",
+ "ContentType": "Team",
+ "DisplayText": "-Team9-74",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.3745975Z",
+ "PublishedUtc": "2021-10-21T18:37:25.3719637Z",
+ "CreatedUtc": "2021-10-21T18:37:25.368019Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team9-74"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team9"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4538yje3mx8cw3ejtpjvjxrxcd",
+ "ContentItemVersionId": "4me67me326erb08ac1dz131eng",
+ "ContentType": "Team",
+ "DisplayText": "-Team10-75",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.3864065Z",
+ "PublishedUtc": "2021-10-21T18:37:25.3835349Z",
+ "CreatedUtc": "2021-10-21T18:37:25.3792856Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team10-75"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team10"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4b9v4fb0ghm6t2xh3h4wna9nmp",
+ "ContentItemVersionId": "40xn25y0av301sqsmwt6ppgz56",
+ "ContentType": "Team",
+ "DisplayText": "-Team11-76",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.3974495Z",
+ "PublishedUtc": "2021-10-21T18:37:25.3942306Z",
+ "CreatedUtc": "2021-10-21T18:37:25.3902346Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team11-76"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team11"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4cq0hbbww5k2g6yc70x1q8trct",
+ "ContentItemVersionId": "40p8tesk3h9dwwtpwq2p16gsmt",
+ "ContentType": "Team",
+ "DisplayText": "-Team12-77",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.4096076Z",
+ "PublishedUtc": "2021-10-21T18:37:25.406281Z",
+ "CreatedUtc": "2021-10-21T18:37:25.4016797Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team12-77"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team12"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4v69hr9pzxf1rssv725bad32wt",
+ "ContentItemVersionId": "4h70gp4q4segk606b3x6k00rny",
+ "ContentType": "Team",
+ "DisplayText": "-Team13-78",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.4417861Z",
+ "PublishedUtc": "2021-10-21T18:37:25.4381798Z",
+ "CreatedUtc": "2021-10-21T18:37:25.4140931Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team13-78"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team13"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4833pshjc7tfe7d1e9bbkm7n55",
+ "ContentItemVersionId": "4jf83yhd0wa5d0krvf5ss8214p",
+ "ContentType": "Team",
+ "DisplayText": "-Team14-79",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.45674Z",
+ "PublishedUtc": "2021-10-21T18:37:25.452596Z",
+ "CreatedUtc": "2021-10-21T18:37:25.4475384Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team14-79"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team14"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4p012dwvgs3m7r9spvtyqamwwq",
+ "ContentItemVersionId": "44x6ynypnrvpa4hd9nym6gb1nm",
+ "ContentType": "Team",
+ "DisplayText": "-Team15-80",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.4740166Z",
+ "PublishedUtc": "2021-10-21T18:37:25.4703131Z",
+ "CreatedUtc": "2021-10-21T18:37:25.4642886Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team15-80"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team15"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "40bqpm6a7cae4rvck5vz7jk5dz",
+ "ContentItemVersionId": "45dr4ezq5x25519gpmn2ym4qn7",
+ "ContentType": "Team",
+ "DisplayText": "-Team16-81",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.4873833Z",
+ "PublishedUtc": "2021-10-21T18:37:25.4837495Z",
+ "CreatedUtc": "2021-10-21T18:37:25.478943Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team16-81"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team16"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4h97rqdwc5me50j6myqhb8y8cr",
+ "ContentItemVersionId": "4pe0ks49z1jgc1chs19dbdp54r",
+ "ContentType": "Team",
+ "DisplayText": "-Team17-82",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.5008958Z",
+ "PublishedUtc": "2021-10-21T18:37:25.4970377Z",
+ "CreatedUtc": "2021-10-21T18:37:25.4923378Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team17-82"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team17"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4s5hz6mc5wmsr05j92t2m5xxwr",
+ "ContentItemVersionId": "4mr6hh2s1s1h4zr5dhz2zy19x2",
+ "ContentType": "Team",
+ "DisplayText": "-Team18-83",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.5154696Z",
+ "PublishedUtc": "2021-10-21T18:37:25.5114311Z",
+ "CreatedUtc": "2021-10-21T18:37:25.5063306Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team18-83"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team18"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4w71kf91rfy5w727m6x17cvjd3",
+ "ContentItemVersionId": "4rgbcbx5rm5xgwfz4y28tqhgd5",
+ "ContentType": "Team",
+ "DisplayText": "-Team19-84",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.5297821Z",
+ "PublishedUtc": "2021-10-21T18:37:25.5259596Z",
+ "CreatedUtc": "2021-10-21T18:37:25.5211389Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team19-84"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team19"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "45wcq41m0w5fhxe1e2p6yh6wdw",
+ "ContentItemVersionId": "4mr8gpw189b3dzq21pztb8rxde",
+ "ContentType": "Team",
+ "DisplayText": "-Team20-85",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.5441735Z",
+ "PublishedUtc": "2021-10-21T18:37:25.5402126Z",
+ "CreatedUtc": "2021-10-21T18:37:25.5352341Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team20-85"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team20"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "49w79reqpvm3r6xmsvykh99hcj",
+ "ContentItemVersionId": "42kayg230h86ntmmyb5b3mahnc",
+ "ContentType": "Team",
+ "DisplayText": "-Team21-86",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.5590257Z",
+ "PublishedUtc": "2021-10-21T18:37:25.5550465Z",
+ "CreatedUtc": "2021-10-21T18:37:25.5499846Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team21-86"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team21"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "402d3hdscyp6tssw0wahrsm6d4",
+ "ContentItemVersionId": "48w8m9mbrdkat1ytrjdrm1rt5y",
+ "ContentType": "Team",
+ "DisplayText": "-Team22-87",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.5848587Z",
+ "PublishedUtc": "2021-10-21T18:37:25.5701342Z",
+ "CreatedUtc": "2021-10-21T18:37:25.5648264Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team22-87"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team22"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4kjyw1jadh3vtt730ax62t4dcb",
+ "ContentItemVersionId": "4vnzh9yshrhzvvw91xx74c6rce",
+ "ContentType": "Team",
+ "DisplayText": "-Team23-88",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.6006478Z",
+ "PublishedUtc": "2021-10-21T18:37:25.5964236Z",
+ "CreatedUtc": "2021-10-21T18:37:25.5911269Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team23-88"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team23"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4gqsda7jpf9704pka7e9659adb",
+ "ContentItemVersionId": "4s7gvk3vfxdx1y3q5y7kj5vsnp",
+ "ContentType": "Team",
+ "DisplayText": "-Team24-89",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.61673Z",
+ "PublishedUtc": "2021-10-21T18:37:25.6125185Z",
+ "CreatedUtc": "2021-10-21T18:37:25.6069879Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team24-89"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team24"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4jrsej6aw1q9z69cv1kqbe9pm9",
+ "ContentItemVersionId": "4gwmh3rfh9n9m6snfkdzzd9kww",
+ "ContentType": "Team",
+ "DisplayText": "-Team25-90",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.633411Z",
+ "PublishedUtc": "2021-10-21T18:37:25.6287826Z",
+ "CreatedUtc": "2021-10-21T18:37:25.623119Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team25-90"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team25"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "433mdtw5k7n1h7k2nn8zgbp8cj",
+ "ContentItemVersionId": "47y7fp74xbgp1v8mthyywntkwc",
+ "ContentType": "Team",
+ "DisplayText": "-Team26-91",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.6503183Z",
+ "PublishedUtc": "2021-10-21T18:37:25.6458058Z",
+ "CreatedUtc": "2021-10-21T18:37:25.6400497Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team26-91"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team26"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4k17dz1xeghd8ta082pnpw2mmx",
+ "ContentItemVersionId": "4t42vgsn8h60w78n7pte3mrdxm",
+ "ContentType": "Team",
+ "DisplayText": "-Team27-92",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.6692691Z",
+ "PublishedUtc": "2021-10-21T18:37:25.6640481Z",
+ "CreatedUtc": "2021-10-21T18:37:25.6578179Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team27-92"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team27"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4zw8rdekc51vk69grrtxj9rvxh",
+ "ContentItemVersionId": "47ksn49rczcwh4m40cjd8q3q5z",
+ "ContentType": "Team",
+ "DisplayText": "-Team28-93",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.6875277Z",
+ "PublishedUtc": "2021-10-21T18:37:25.6825987Z",
+ "CreatedUtc": "2021-10-21T18:37:25.6764342Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team28-93"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team28"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "45n64tp72n3pav8r0196hzt2x6",
+ "ContentItemVersionId": "48r43y8wn9ema58bxh1gcr4vd0",
+ "ContentType": "Team",
+ "DisplayText": "-Team29-94",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.7067954Z",
+ "PublishedUtc": "2021-10-21T18:37:25.7016558Z",
+ "CreatedUtc": "2021-10-21T18:37:25.694673Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team29-94"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team29"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "44tfvpbbepq3v3hbrsf7wys1cj",
+ "ContentItemVersionId": "424ayhkac3wyawr40cd2y39fm4",
+ "ContentType": "Team",
+ "DisplayText": "-Team30-95",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.726982Z",
+ "PublishedUtc": "2021-10-21T18:37:25.7215568Z",
+ "CreatedUtc": "2021-10-21T18:37:25.7146913Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team30-95"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team30"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4n2675er3pfrs40dbks9573g5d",
+ "ContentItemVersionId": "4180x2r5qb8kw3sjtwq471h6m8",
+ "ContentType": "Team",
+ "DisplayText": "-Team31-96",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.7491701Z",
+ "PublishedUtc": "2021-10-21T18:37:25.743453Z",
+ "CreatedUtc": "2021-10-21T18:37:25.7363766Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team31-96"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team31"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4khrvx85z6ycmxmpepsmwpzvd8",
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4sxrc9pf1qnte5fphtjejebsda",
+ "ContentItemVersionId": "4fhhvwdvy7zhv20e4fnq0pae4s",
+ "ContentType": "Team",
+ "DisplayText": "-Team32-97",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.7695817Z",
+ "PublishedUtc": "2021-10-21T18:37:25.7641458Z",
+ "CreatedUtc": "2021-10-21T18:37:25.7573225Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team32-97"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team32"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4vjcr7tmg07rn2dhmmrwnmwpcy",
+ "ContentItemVersionId": "4t9vecvcv7hmzwdqrkgb8rqx4j",
+ "ContentType": "Team",
+ "DisplayText": "-Team33-98",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.789894Z",
+ "PublishedUtc": "2021-10-21T18:37:25.7843054Z",
+ "CreatedUtc": "2021-10-21T18:37:25.7777085Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team33-98"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team33"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "4c5m4p00yn0at3ck9xagg6j05t",
+ "ContentItemVersionId": "4da4zhj7gwke2wmkjb7xx2w9nz",
+ "ContentType": "Team",
+ "DisplayText": "-Team34-99",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.8105838Z",
+ "PublishedUtc": "2021-10-21T18:37:25.8050185Z",
+ "CreatedUtc": "2021-10-21T18:37:25.798321Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team34-99"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team34"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ },
+ {
+ "ContentItemId": "414frp9eh6dy21v7vwkmyh6s5g",
+ "ContentItemVersionId": "4s6b6s7yvc0bv05y9xjf962b5p",
+ "ContentType": "Team",
+ "DisplayText": "-Team35-100",
+ "Latest": true,
+ "Published": true,
+ "ModifiedUtc": "2021-10-21T18:37:25.8310198Z",
+ "PublishedUtc": "2021-10-21T18:37:25.8257655Z",
+ "CreatedUtc": "2021-10-21T18:37:25.818836Z",
+ "Owner": "4jpw2vft07187ysmsnrpysfqwr",
+ "Author": "admin",
+ "TitlePart": {
+ "Title": "-Team35-100"
+ },
+ "Team": {
+ "Name": {
+ "Text": "Team35"
+ },
+ "Description": {
+ "Text": null
+ },
+ "Challenge": {
+ "ContentItemIds": []
+ },
+ "TeamCaptain": {
+ "UserIds": []
+ },
+ "Topics": {
+ "ContentItemIds": [
+ "4jp9g2g3a6n4862th955831n44",
+ "45v0dxmfz1jy669pnhxvzdpqm5",
+ "4dgsh0rqpcq1dx6f4sf56anjm5",
+ "4yxkfx9wv2kcfs2m4t8t2g7bmr",
+ "4ewe95s5xjw3833n87b727e7mk",
+ "4ehecaczh1bq30kekdsktcdtx3",
+ "44ps0jjrch4p4wjw7v04p0brcg",
+ "44madvxy128gv3c5mw1jed8g4x",
+ "4hz2pdn40vb97rdxway647kgc5",
+ "4khrvx85z6ycmxmpepsmwpzvd8"
+ ]
+ }
+ },
+ "TeamSolutionPart": {
+ "Name": {
+ "Text": null
+ },
+ "Description": {
+ "Text": null
+ },
+ "RepositoryUrl": {
+ "Text": null
+ }
+ },
+ "EmailTemplatePart": {}
+ }
+ ]
+ },
+ {
+ "name": "command",
+ "Commands": [
+ "createUser /UserName:User1 /Password:Inno111! /Email:User1@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User2 /Password:Inno111! /Email:User2@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User3 /Password:Inno111! /Email:User3@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User4 /Password:Inno111! /Email:User4@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User5 /Password:Inno111! /Email:User5@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User6 /Password:Inno111! /Email:User6@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User7 /Password:Inno111! /Email:User7@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User8 /Password:Inno111! /Email:User8@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User9 /Password:Inno111! /Email:User9@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User10 /Password:Inno111! /Email:User10@inno.com /Roles:Authenticated,Hacker",
+
+ "createUser /UserName:User11 /Password:Inno111! /Email:User11@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User12 /Password:Inno111! /Email:User12@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User13 /Password:Inno111! /Email:User13@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User14 /Password:Inno111! /Email:User14@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User15 /Password:Inno111! /Email:User15@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User16 /Password:Inno111! /Email:User16@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User17 /Password:Inno111! /Email:User17@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User18 /Password:Inno111! /Email:User18@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User19 /Password:Inno111! /Email:User19@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User20 /Password:Inno111! /Email:User20@inno.com /Roles:Authenticated,Hacker",
+
+ "createUser /UserName:User21 /Password:Inno111! /Email:User21@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User22 /Password:Inno111! /Email:User22@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User23 /Password:Inno111! /Email:User23@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User24 /Password:Inno111! /Email:User24@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User25 /Password:Inno111! /Email:User25@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User26 /Password:Inno111! /Email:User26@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User27 /Password:Inno111! /Email:User27@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User28 /Password:Inno111! /Email:User28@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User29 /Password:Inno111! /Email:User29@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User30 /Password:Inno111! /Email:User30@inno.com /Roles:Authenticated,Hacker",
+
+ "createUser /UserName:User31 /Password:Inno111! /Email:User31@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User32 /Password:Inno111! /Email:User32@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User33 /Password:Inno111! /Email:User33@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User34 /Password:Inno111! /Email:User34@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User35 /Password:Inno111! /Email:User35@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User36 /Password:Inno111! /Email:User36@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User37 /Password:Inno111! /Email:User37@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User38 /Password:Inno111! /Email:User38@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User39 /Password:Inno111! /Email:User39@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User40 /Password:Inno111! /Email:User40@inno.com /Roles:Authenticated,Hacker",
+
+ "createUser /UserName:User41 /Password:Inno111! /Email:User41@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User42 /Password:Inno111! /Email:User42@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User43 /Password:Inno111! /Email:User43@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User44 /Password:Inno111! /Email:User44@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User45 /Password:Inno111! /Email:User45@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User46 /Password:Inno111! /Email:User46@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User47 /Password:Inno111! /Email:User47@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User48 /Password:Inno111! /Email:User48@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User49 /Password:Inno111! /Email:User49@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User50 /Password:Inno111! /Email:User50@inno.com /Roles:Authenticated,Hacker",
+
+ "createUser /UserName:User51 /Password:Inno111! /Email:User51@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User52 /Password:Inno111! /Email:User52@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User53 /Password:Inno111! /Email:User53@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User54 /Password:Inno111! /Email:User54@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User55 /Password:Inno111! /Email:User55@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User56 /Password:Inno111! /Email:User56@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User57 /Password:Inno111! /Email:User57@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User58 /Password:Inno111! /Email:User58@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User59 /Password:Inno111! /Email:User59@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User60 /Password:Inno111! /Email:User60@inno.com /Roles:Authenticated,Hacker",
+
+ "createUser /UserName:User61 /Password:Inno111! /Email:User61@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User62 /Password:Inno111! /Email:User62@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User63 /Password:Inno111! /Email:User63@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User64 /Password:Inno111! /Email:User64@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User65 /Password:Inno111! /Email:User65@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User66 /Password:Inno111! /Email:User66@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User67 /Password:Inno111! /Email:User67@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User68 /Password:Inno111! /Email:User68@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User69 /Password:Inno111! /Email:User69@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User70 /Password:Inno111! /Email:User70@inno.com /Roles:Authenticated,Hacker",
+
+ "createUser /UserName:User71 /Password:Inno111! /Email:User71@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User72 /Password:Inno111! /Email:User72@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User73 /Password:Inno111! /Email:User73@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User74 /Password:Inno111! /Email:User74@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User75 /Password:Inno111! /Email:User75@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User76 /Password:Inno111! /Email:User76@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User77 /Password:Inno111! /Email:User77@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User78 /Password:Inno111! /Email:User78@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User79 /Password:Inno111! /Email:User79@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User80 /Password:Inno111! /Email:User80@inno.com /Roles:Authenticated,Hacker",
+
+ "createUser /UserName:User81 /Password:Inno111! /Email:User81@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User82 /Password:Inno111! /Email:User82@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User83 /Password:Inno111! /Email:User83@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User84 /Password:Inno111! /Email:User84@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User85 /Password:Inno111! /Email:User85@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User86 /Password:Inno111! /Email:User86@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User87 /Password:Inno111! /Email:User87@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User88 /Password:Inno111! /Email:User88@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User89 /Password:Inno111! /Email:User89@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User90 /Password:Inno111! /Email:User90@inno.com /Roles:Authenticated,Hacker",
+
+ "createUser /UserName:User91 /Password:Inno111! /Email:User91@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User92 /Password:Inno111! /Email:User92@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User93 /Password:Inno111! /Email:User93@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User94 /Password:Inno111! /Email:User94@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User95 /Password:Inno111! /Email:User95@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User96 /Password:Inno111! /Email:User96@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User97 /Password:Inno111! /Email:User97@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User98 /Password:Inno111! /Email:User98@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User99 /Password:Inno111! /Email:User99@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:User100 /Password:Inno111! /Email:User100@inno.com /Roles:Authenticated,Hacker",
+
+ "joinTeam /TeamId:4mymz378sjf18z7sez23sz104b /UserName:User1",
+ "joinTeam /TeamId:4mymz378sjf18z7sez23sz104b /UserName:User2",
+ "joinTeam /TeamId:4mymz378sjf18z7sez23sz104b /UserName:User3",
+ "joinTeam /TeamId:4mymz378sjf18z7sez23sz104b /UserName:User4",
+
+ "joinTeam /TeamId:4200r6gjyeckdvj0tm8evsvjcn /UserName:User5",
+ "joinTeam /TeamId:4200r6gjyeckdvj0tm8evsvjcn /UserName:User6",
+ "joinTeam /TeamId:4200r6gjyeckdvj0tm8evsvjcn /UserName:User7",
+ "joinTeam /TeamId:4200r6gjyeckdvj0tm8evsvjcn /UserName:User8",
+
+ "joinTeam /TeamId:41hyc453ztmww21epqh4kgjf51 /UserName:User9",
+ "joinTeam /TeamId:41hyc453ztmww21epqh4kgjf51 /UserName:User10",
+ "joinTeam /TeamId:41hyc453ztmww21epqh4kgjf51 /UserName:User11",
+ "joinTeam /TeamId:41hyc453ztmww21epqh4kgjf51 /UserName:User12",
+
+ "joinTeam /TeamId:44vavsmgqzjprztexzvefb6hm3 /UserName:User13",
+ "joinTeam /TeamId:44vavsmgqzjprztexzvefb6hm3 /UserName:User14",
+ "joinTeam /TeamId:44vavsmgqzjprztexzvefb6hm3 /UserName:User15",
+ "joinTeam /TeamId:44vavsmgqzjprztexzvefb6hm3 /UserName:User16",
+
+ "joinTeam /TeamId:4rd0rtsrvev046bfer1h1n6t4j /UserName:User17",
+ "joinTeam /TeamId:4rd0rtsrvev046bfer1h1n6t4j /UserName:User18",
+ "joinTeam /TeamId:4rd0rtsrvev046bfer1h1n6t4j /UserName:User19",
+ "joinTeam /TeamId:4rd0rtsrvev046bfer1h1n6t4j /UserName:User20",
+
+ "joinTeam /TeamId:4vgbq5221vh8ns6bepk62p5153 /UserName:User21",
+ "joinTeam /TeamId:4vgbq5221vh8ns6bepk62p5153 /UserName:User22",
+ "joinTeam /TeamId:4vgbq5221vh8ns6bepk62p5153 /UserName:User23",
+
+ "joinTeam /TeamId:49s5y4x1apf9f56p8fqxgywbn8 /UserName:User24",
+ "joinTeam /TeamId:49s5y4x1apf9f56p8fqxgywbn8 /UserName:User25",
+ "joinTeam /TeamId:49s5y4x1apf9f56p8fqxgywbn8 /UserName:User26",
+
+ "joinTeam /TeamId:4a5ze9f46320htr5d8cm61hwms /UserName:User27",
+ "joinTeam /TeamId:4a5ze9f46320htr5d8cm61hwms /UserName:User28",
+ "joinTeam /TeamId:4a5ze9f46320htr5d8cm61hwms /UserName:User29",
+
+ "joinTeam /TeamId:4a1812vwc04xxvny3z54hr48mh /UserName:User30",
+ "joinTeam /TeamId:4a1812vwc04xxvny3z54hr48mh /UserName:User31",
+ "joinTeam /TeamId:4a1812vwc04xxvny3z54hr48mh /UserName:User32",
+
+ "joinTeam /TeamId:4538yje3mx8cw3ejtpjvjxrxcd /UserName:User33",
+ "joinTeam /TeamId:4538yje3mx8cw3ejtpjvjxrxcd /UserName:User34",
+ "joinTeam /TeamId:4538yje3mx8cw3ejtpjvjxrxcd /UserName:User35",
+
+ "joinTeam /TeamId:4b9v4fb0ghm6t2xh3h4wna9nmp /UserName:User36",
+ "joinTeam /TeamId:4b9v4fb0ghm6t2xh3h4wna9nmp /UserName:User37",
+ "joinTeam /TeamId:4b9v4fb0ghm6t2xh3h4wna9nmp /UserName:User38",
+
+ "joinTeam /TeamId:4cq0hbbww5k2g6yc70x1q8trct /UserName:User39",
+ "joinTeam /TeamId:4cq0hbbww5k2g6yc70x1q8trct /UserName:User40",
+ "joinTeam /TeamId:4cq0hbbww5k2g6yc70x1q8trct /UserName:User41",
+
+ "joinTeam /TeamId:4v69hr9pzxf1rssv725bad32wt /UserName:User42",
+ "joinTeam /TeamId:4v69hr9pzxf1rssv725bad32wt /UserName:User43",
+ "joinTeam /TeamId:4v69hr9pzxf1rssv725bad32wt /UserName:User44",
+
+ "joinTeam /TeamId:4833pshjc7tfe7d1e9bbkm7n55 /UserName:User45",
+ "joinTeam /TeamId:4833pshjc7tfe7d1e9bbkm7n55 /UserName:User46",
+ "joinTeam /TeamId:4833pshjc7tfe7d1e9bbkm7n55 /UserName:User47",
+
+ "joinTeam /TeamId:4p012dwvgs3m7r9spvtyqamwwq /UserName:User48",
+ "joinTeam /TeamId:4p012dwvgs3m7r9spvtyqamwwq /UserName:User49",
+ "joinTeam /TeamId:4p012dwvgs3m7r9spvtyqamwwq /UserName:User50",
+
+ "joinTeam /TeamId:40bqpm6a7cae4rvck5vz7jk5dz /UserName:User51",
+ "joinTeam /TeamId:40bqpm6a7cae4rvck5vz7jk5dz /UserName:User52",
+
+ "joinTeam /TeamId:4h97rqdwc5me50j6myqhb8y8cr /UserName:User53",
+ "joinTeam /TeamId:4h97rqdwc5me50j6myqhb8y8cr /UserName:User54",
+
+ "joinTeam /TeamId:4s5hz6mc5wmsr05j92t2m5xxwr /UserName:User55",
+ "joinTeam /TeamId:4s5hz6mc5wmsr05j92t2m5xxwr /UserName:User56",
+
+ "joinTeam /TeamId:4w71kf91rfy5w727m6x17cvjd3 /UserName:User57",
+ "joinTeam /TeamId:4w71kf91rfy5w727m6x17cvjd3 /UserName:User58",
+
+ "joinTeam /TeamId:45wcq41m0w5fhxe1e2p6yh6wdw /UserName:User59",
+ "joinTeam /TeamId:45wcq41m0w5fhxe1e2p6yh6wdw /UserName:User60",
+
+ "joinTeam /TeamId:49w79reqpvm3r6xmsvykh99hcj /UserName:User61",
+ "joinTeam /TeamId:49w79reqpvm3r6xmsvykh99hcj /UserName:User62",
+
+ "joinTeam /TeamId:402d3hdscyp6tssw0wahrsm6d4 /UserName:User63",
+ "joinTeam /TeamId:402d3hdscyp6tssw0wahrsm6d4 /UserName:User64",
+
+ "joinTeam /TeamId:4kjyw1jadh3vtt730ax62t4dcb /UserName:User65",
+ "joinTeam /TeamId:4kjyw1jadh3vtt730ax62t4dcb /UserName:User66",
+
+ "joinTeam /TeamId:4gqsda7jpf9704pka7e9659adb /UserName:User67",
+ "joinTeam /TeamId:4gqsda7jpf9704pka7e9659adb /UserName:User68",
+
+ "joinTeam /TeamId:4jrsej6aw1q9z69cv1kqbe9pm9 /UserName:User69",
+ "joinTeam /TeamId:4jrsej6aw1q9z69cv1kqbe9pm9 /UserName:User70",
+
+ "joinTeam /TeamId:433mdtw5k7n1h7k2nn8zgbp8cj /UserName:User71",
+ "joinTeam /TeamId:4k17dz1xeghd8ta082pnpw2mmx /UserName:User72",
+ "joinTeam /TeamId:4zw8rdekc51vk69grrtxj9rvxh /UserName:User73",
+ "joinTeam /TeamId:45n64tp72n3pav8r0196hzt2x6 /UserName:User74",
+ "joinTeam /TeamId:44tfvpbbepq3v3hbrsf7wys1cj /UserName:User75",
+ "joinTeam /TeamId:4n2675er3pfrs40dbks9573g5d /UserName:User76",
+ "joinTeam /TeamId:4sxrc9pf1qnte5fphtjejebsda /UserName:User77",
+ "joinTeam /TeamId:4vjcr7tmg07rn2dhmmrwnmwpcy /UserName:User78",
+ "joinTeam /TeamId:4c5m4p00yn0at3ck9xagg6j05t /UserName:User79",
+ "joinTeam /TeamId:414frp9eh6dy21v7vwkmyh6s5g /UserName:User80"
+ ]
+ }
+ ]
+}
diff --git a/test/cypress/fixtures/recipes/team-management.json b/test/cypress/fixtures/recipes/team-management.json
index a29a62296..4e376067f 100644
--- a/test/cypress/fixtures/recipes/team-management.json
+++ b/test/cypress/fixtures/recipes/team-management.json
@@ -129,6 +129,9 @@
},
"TeamEditable": {
"Value": true
+ },
+ "PartialChallenge": {
+ "Value": true
}
},
"JudgingCustomSettings": {
diff --git a/test/cypress/fixtures/recipes/users.json b/test/cypress/fixtures/recipes/users.json
index 50ec473d5..a12c6837e 100644
--- a/test/cypress/fixtures/recipes/users.json
+++ b/test/cypress/fixtures/recipes/users.json
@@ -9,6 +9,7 @@
"createUser /UserName:Laura /Password:Inno111! /Email:Laura@inno.com /Roles:Authenticated,Hacker",
"createUser /UserName:Mike /Password:Inno111! /Email:Mike@inno.com /Roles:Authenticated,Hacker",
"createUser /UserName:Frank /Password:Inno111! /Email:Frank@inno.com /Roles:Authenticated,Hacker",
+ "createUser /UserName:Adam /Password:Inno111! /Email:adam@inno.com /Roles:Authenticated,Volunteer",
"createUser /UserName:Challenger /Password:Inno111! /Email:Challenger@inno.com /Roles:Authenticated",
"createUser /UserName:Hacker /Password:Inno111! /Email:hacker@inno.com /Roles:Authenticated",
"createUser /UserName:Volunteer /Password:Inno111! /Email:volunteer@inno.com /Roles:Authenticated"
diff --git a/test/cypress/integration/candev.js b/test/cypress/integration/candev.js
new file mode 100644
index 000000000..644c3dcd7
--- /dev/null
+++ b/test/cypress/integration/candev.js
@@ -0,0 +1,370 @@
+///
+import { generateTenantInfo } from 'cypress-orchardcore/dist/utils';
+
+const contentIdChallengeSubmissionForm = "4kpgcnkaydrkb5hfxy10261qmb";
+const contentIdHackerRegistrationForm = "4dj03mdaztzf8wg12gw56xkg43";
+const contentIdVolunteerRegistrationForm = "4jjje1q162zaay11nbf3w2634h";
+const contentIdConfirmPresenceForm = "4qxg2sr9b4ywatnhjkeq90qbcv";
+const contentIdNewsletterForm = "4ty56s2p8vfhmxp76p4f37b1c3";
+const contentIdScoringForm = "423fn7nvrwcdv2ksy8hww9qwdn";
+const contentIdSolutionSubmissionForm = "4fy9a011te6qx5611jv1hhtwwh";
+const contentIdUserProfileForm = "4pbmvhq49bwy1yatrapasxctnk";
+const scoringTeamId = "46p8s03jb80m037f96frfhs9mv";
+const TeamManagementPagePath = "test-page";
+const draggableContentId = "45a6j8rkq9z56xfhvxwm5hvgc7";
+const password = 'Inno111!';
+
+describe("Candev Tests", function() {
+ let tenant;
+ let ContentIdTeam;
+
+ before(() => {
+ tenant = generateTenantInfo("candev-app")
+ cy.newTenant(tenant);
+ cy.login(tenant);
+ cy.uploadRecipeJson(tenant, "recipes/users.json");
+ })
+
+ it("Can login to Candev site", function() {
+ cy.visit(`${tenant.prefix}/login`)
+ cy.login(tenant);
+ cy.uploadRecipeJson(tenant, "recipes/candev-content.json");
+ })
+
+ it("Can run Candev recipes", function() {
+ cy.visit(`${tenant.prefix}/login`)
+ cy.login(tenant);
+ cy.runRecipe(tenant, 'Candev_ChallengeSubmissionForm');
+ cy.runRecipe(tenant, 'Candev_HackerRegistrationForm');
+ cy.runRecipe(tenant, 'Candev_VolunteerRegistrationForm');
+ cy.runRecipe(tenant, 'Candev_TeamEdit');
+ cy.runRecipe(tenant, 'Candev_ConfirmPresenceForm');
+ cy.runRecipe(tenant, 'Candev_Newsletter');
+ cy.runRecipe(tenant, 'Candev_ScoringPage');
+ cy.runRecipe(tenant, 'Candev_SolutionForm');
+ cy.runRecipe(tenant, 'Candev_UserProfile');
+ })
+
+ //#region Challenge Submissiion form
+ it("Challenge Submission: Client side validation prevents submit", function() {
+ cy.login(tenant);
+ cy.visitContentPage(tenant, contentIdChallengeSubmissionForm);
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('input[name=title]').closest('.v-input').find('.v-messages__message').should('contain', 'The title field is required');
+ })
+
+ it("Challenge Submission: Submit works and displays success message", function() {
+ cy.login(tenant);
+ cy.visitContentPage(tenant, contentIdChallengeSubmissionForm);
+
+ cy.get('input[name=title]').type('Title', {force:true});
+ cy.get('button[type=button]').eq(2).click({force:true});
+ cy.get('textarea[name=statement]').type('Statement', {force:true});
+ cy.get('button[type=button]').eq(3).click({force:true});
+ cy.get('textarea[name=datasets]').type('Datasets', {force:true});
+ cy.get('button[type=button]').eq(4).click({force:true});
+ cy.get('textarea[name=backgroundInfo]').type('Background Info', {force:true});
+ cy.get('button[type=button]').eq(5).click({force:true});
+ cy.get('input[name=keywords]').type('Keywords', {force:true});
+ cy.get('button[type=button]').eq(6).click({force:true});
+ cy.get('input[name=organizationNameEn]').type('Organization Name', {force:true});
+ cy.get('input[name=organizationAcronymEn]').type('Organization Acronym', {force:true});
+ cy.get('button[type=button]').eq(7).click({force:true});
+ cy.get('input[name=contactPersonName]').type('Contact Person Name', {force:true});
+ cy.get('input[name=contactPersonEmail]').type('test@testing.com', {force:true});
+ cy.get('input[name=technicalMentorName]').type('Technical Mentor Name', {force:true});
+ cy.get('input[name=technicalMentorEmail]').type('test@testing.com', {force:true});
+ cy.get('input[name=caseSpecialistMentorName]').type('Case Specialist Name', {force:true});
+ cy.get('input[name=caseSpecialistMentorEmail]').type('test@testing.com', {force:true});
+ cy.get('button[type=button]').eq(8).click({force:true});
+ cy.get('textarea[name=comments]').type('Comments', {force:true});
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Your challenge was submitted successfully');
+ })
+ //#endregion
+
+ //#region Hacker Registration Form
+ it("Hacker Registration: Requires login", function() {
+ cy.visitContentPage(tenant, contentIdHackerRegistrationForm);
+ cy.get("#main").contains("Please login before registering to this event");
+ })
+
+ it("Hacker Registration: Client side validation prevents submit", function() {
+ cy.loginAs(tenant.prefix, 'Hacker', password);
+ cy.visitContentPage(tenant, contentIdHackerRegistrationForm);
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('input[name=firstName]').closest('.v-input').find('.v-messages__message').should('contain', 'The First name field is required');
+ cy.get('input[name=lastName]').closest('.v-input').find('.v-messages__message').should('contain', 'The Last name field is required');
+ cy.get('input[name=email]').closest('.v-input').find('.v-messages__message').should('contain', 'The Contact email address field is required');
+ cy.get('input[name=school]').closest('.v-input').find('.v-messages__message').should('contain', 'The University or college name field is required');
+ cy.get('input[name=fieldOfStudy]').closest('.v-input').find('.v-messages__message').should('contain', 'The Field of study field is required');
+ cy.get('input[name=programName]').closest('.v-input').find('.v-messages__message').should('contain', 'The Program name field is required');
+ cy.get('input[name=programLevel]').closest('.v-input').find('.v-messages__message').should('contain', 'The Program level field is required');
+ cy.get('input[name=programYears]').closest('.v-input').find('.v-messages__message').should('contain', 'The Number of years completed in your program field is required');
+ cy.get('input[name=adult]').closest('.v-input').find('.v-messages__message').should('contain', 'The I am 18 years or older field is required');
+ cy.get('input[name=termsAndConditions]').closest('.v-input').find('.v-messages__message').should('contain', 'The I have read and I agree to the terms and conditions field is required');
+ })
+
+ it("Hacker Registration: Submit works and displays success message", function() {
+ cy.loginAs(tenant.prefix, 'James', password);
+ cy.visitContentPage(tenant, contentIdHackerRegistrationForm);
+
+ cy.get('input[name=firstName]').type('Tester', {force:true});
+ cy.get('input[name=lastName]').type('McTest', {force:true});
+ cy.get('input[name=email]').type('test@testing.com', {force:true});
+ cy.get('input[value=en]').click({force:true});
+ cy.get('input[name=school]').type('school name', {force:true});
+ cy.get('input[name=fieldOfStudy]').type('field of study', {force:true});
+ cy.get('input[name=programName]').type('program name', {force:true});
+ cy.get('input[name=programLevel]').click({force:true}).get('div[id=list-item-92-0]').click({force:true});
+ cy.get('input[name=programYears]').click({force:true}).get('div[id=list-item-104-0]').click({force:true});
+ cy.get('input[name=adult]').click({force:true});
+ cy.get('input[name=termsAndConditions]').click({force:true});
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'You have successfully registered!');
+ })
+ //#endregion
+
+ //#region Volunteer Registration Form
+ it("Volunteer Registration: Client side validation prevents submit", function() {
+ cy.loginAs(tenant.prefix, 'Volunteer', password);
+ cy.visitContentPage(tenant, contentIdVolunteerRegistrationForm);
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('input[name=firstName]').closest('.v-input').find('.v-messages__message').should('contain', 'The First name field is required');
+ cy.get('input[name=lastName]').closest('.v-input').find('.v-messages__message').should('contain', 'The Last name field is required');
+ cy.get('input[name=email]').closest('.v-input').find('.v-messages__message').should('contain', 'The Email address field is required');
+ cy.get('input[name=department]').closest('.v-input').find('.v-messages__message').should('contain', 'The Department/Agency field is required');
+ cy.get('input[name=termsAndConditions]').closest('.v-input').find('.v-messages__message').should('contain', 'The I have read and I agree to the terms and conditions. field is required');
+ })
+
+ it("Volunteer Registration: Submit works and displays success message", function() {
+ cy.loginAs(tenant.prefix, 'Alan', password);
+ cy.visitContentPage(tenant, contentIdVolunteerRegistrationForm);
+
+ cy.get('input[name=firstName]').type('Tester', {force:true});
+ cy.get('input[name=lastName]').type('McTest', {force:true});
+ cy.get('input[name=email]').type('test@testing.com', {force:true});
+ cy.get('input[name=mentor]').click({force:true});
+ cy.get('input[value=en]').click({force:true});
+ cy.get('input[name=department]').type('Department', {force:true});
+ cy.get('input[name=termsAndConditions]').click({force:true});
+ cy.get('input[name=comments]').type('Comments', {force:true});
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'You have successfully registered!');
+ })
+ //#endregion
+
+ //#region Team Dashboard
+ it("Team Dashboard: Create Team", function() {
+ cy.loginAs(tenant.prefix, 'Laura', password);
+ cy.visit(`${tenant.prefix}/${TeamManagementPagePath}`)
+
+ cy.get('button[name=btnCreate]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Successfully created team');
+ cy.get('span[id=team-id]').should(($span) => ContentIdTeam = $span.text());
+ })
+
+ it("Team Dashboard: Join Team", function() {
+ // Mike joins the team then gets removed by the captain
+ cy.loginAs(tenant.prefix, 'Mike', password);
+ cy.visit(`${tenant.prefix}/${TeamManagementPagePath}`)
+
+ cy.get('input[name=teamContentItemId]').type(ContentIdTeam, {force:true})
+ cy.get('button[id=team-submit-addon]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Successfully joined team');
+
+ // Frank joins team then leaves it
+ cy.loginAs(tenant.prefix, 'Frank', password);
+ cy.visit(`${tenant.prefix}/${TeamManagementPagePath}`)
+
+ cy.get('input[name=teamContentItemId]').type(ContentIdTeam, {force:true})
+ cy.get('button[id=team-submit-addon]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Successfully joined team');
+ })
+
+ it("Team Dashboard: Leave Team", function() {
+ cy.loginAs(tenant.prefix, 'Frank', password);
+ cy.visit(`${tenant.prefix}/${TeamManagementPagePath}`)
+
+ cy.get('button[name=btnLeaveModal]').click();
+ cy.get('button[name=btnLeave]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Successfully left team');
+ })
+
+ it("Team Dashboard: Team Captain Removes Member", function() {
+ cy.loginAs(tenant.prefix, 'Laura', password);
+ cy.visit(`${tenant.prefix}/${TeamManagementPagePath}`)
+
+ cy.get('button[name=btnRemove]').last().click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Member successfully removed from the team');
+ })
+
+ it("Team Dashboard: Team Captain Edits Team", function() {
+ cy.loginAs(tenant.prefix, 'Laura', password);
+ cy.visit(`${tenant.prefix}/${TeamManagementPagePath}`)
+
+ cy.get('input[name=teamName]').type('Better Team', {force:true});
+ cy.get('input[name=teamDescription]').type('Lorem ipsum dolor sit amet, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', {force:true});
+
+ cy.get('button[name=btnSave]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Team updated successfully');
+ })
+ //#endregion
+
+ //#region Confirm Presence Form
+ it("Confirm Presence Form: Client side validation prevents submit", function() {
+ cy.login(tenant);
+ cy.visitContentPage(tenant, contentIdConfirmPresenceForm);
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'An error occurred during submission');
+ })
+
+ it("Confirm Presence Form: Submit works and displays success message", function() {
+ cy.login(tenant);
+ cy.visitContentPage(tenant, contentIdConfirmPresenceForm);
+
+ cy.get('input[value=true]').click({force:true});
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Your presence has been confirmed!');
+ })
+ //#endregion
+
+ //#region Newsletter Form
+ it("Newsletter Form: Client side validation prevents submit", function() {
+ cy.login(tenant);
+ cy.visitContentPage(tenant, contentIdNewsletterForm);
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('input[name=email]').closest('.v-input').find('.v-messages__message').should('contain', 'The email address field is required');
+ })
+
+ it("Newsletter Form: Submit works and displays success message", function() {
+ cy.login(tenant);
+ cy.visitContentPage(tenant, contentIdNewsletterForm);
+
+ cy.get('input[name=email]').type('test@testing.com', {force:true});
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Thank you, you will be kept up to date with news about the event!');
+ })
+ //#endregion
+
+ //#region Scoring Form
+ it("Scoring Form: Client side validation prevents submit", function() {
+ cy.loginAs(tenant.prefix, 'Adam', password);
+ cy.visit(`${tenant.prefix}/Contents/ContentItems/${contentIdScoringForm}?teamId=${scoringTeamId}`)
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'A score is required.');
+ })
+
+ it("Scoring Form: Submit works and displays success message", function() {
+ cy.loginAs(tenant.prefix, 'Adam', password);
+ cy.visit(`${tenant.prefix}/Contents/ContentItems/${contentIdScoringForm}?teamId=${scoringTeamId}`)
+
+ cy.get('input[value=4]').click({force:true, multiple:true});
+
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Your submission was successful');
+ })
+ //#endregion
+
+ //#region Solution Submission Form
+ it("Solution Submission Form: Client side validation prevents submit", function() {
+ cy.login(tenant);
+ cy.visitContentPage(tenant, contentIdSolutionSubmissionForm);
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('input[name=solutionName]').closest('.v-input').find('.v-messages__message').should('contain', 'The Solution Name field is required');
+ cy.get('textarea[name=solutionDescription]').closest('.v-input').find('.v-messages__message').should('contain', 'The Description field is required');
+ cy.get('input[name=repositoryUrl]').closest('.v-input').find('.v-messages__message').should('contain', 'The Solution repository URL field is required');
+ })
+
+ it("Solution Submission Form: Submit works and displays success message", function() {
+ cy.loginAs(tenant.prefix, 'Frank', password);
+ cy.visit(`${tenant.prefix}/${TeamManagementPagePath}`)
+
+ cy.get('button[name=btnCreate]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Successfully created team');
+
+ cy.visitContentPage(tenant, contentIdSolutionSubmissionForm);
+
+ cy.get('input[name=solutionName]').type('Solution Name', {force:true});
+ cy.get('textarea[name=solutionDescription]').type('Solution Description', {force:true});
+ cy.get('input[name=repositoryUrl]').type('www.soultionURL.com', {force:true});
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Your solution was submitted successfully!');
+ })
+ //#endregion
+
+ //#region User Profile Form
+ it("User Profile Form: Client side validation prevents submit", function() {
+ cy.login(tenant);
+ cy.visitContentPage(tenant, contentIdUserProfileForm);
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('input[name=firstName]').closest('.v-input').find('.v-messages__message').should('contain', 'The First name field is required');
+ cy.get('input[name=lastName]').closest('.v-input').find('.v-messages__message').should('contain', 'The Last name field is required');
+ cy.get('input[name=email]').closest('.v-input').find('.v-messages__message').should('contain', 'The email address field is required');
+ })
+
+ it("Solution Submission Form: Submit works and displays success message", function() {
+ cy.login(tenant);
+ cy.visitContentPage(tenant, contentIdUserProfileForm);
+
+ cy.get('input[name=firstName]').type('FirstName', {force:true});
+ cy.get('input[name=lastName]').type('LastName', {force:true});
+ cy.get('input[name=email]').type('email@email.com', {force:true});
+ cy.get('input[value=en]').click({force:true});
+
+ cy.get('button[type=submit]').click();
+
+ cy.get('div[class=v-alert__content]').should('contain', 'Your profile was updated.');
+ })
+ //#endregion
+
+ it("Vue Component: Draggable list", function() {
+ cy.login(tenant);
+ cy.uploadRecipeJson(tenant, "recipes/draggable.json");
+ cy.visitContentPage(tenant, draggableContentId);
+
+ cy.get('div[name=title1]').should('contain', 'Title 1');
+ cy.get('div[name=hint1]').should('contain', 'Hint 1');
+ cy.get('span[id=error]').should('contain', 'Please select at least 3 options');
+
+ cy.get('div[name=title').should('contain', 'Title 1');
+ cy.get('div[name=hint]').should('contain', 'Hint 1');
+ })
+});