From c6de48c8e2ec3c3412818708c26c0e070f1e72e7 Mon Sep 17 00:00:00 2001 From: Anders Bjerner Date: Sun, 4 Jun 2017 17:02:41 +0200 Subject: [PATCH] Added a new section to the "Community" page listing Umbraco events from Meetup.com --- OurUmbraco.Site/OurUmbraco.Site.csproj | 14 ++++ .../Views/Partials/Community/Home.cshtml | 24 ++++++ .../Views/Partials/Community/Scripts.cshtml | 9 +++ .../Views/Partials/Home/Meetups.cshtml | 51 ++++++++++++ .../config/MeetupUmbracoGroups.txt | 7 ++ OurUmbraco.Site/packages.config | 3 + .../Controllers/MeetupsController.cs | 77 +++++++++++++++++++ .../Community/Models/MeetupEventsModel.cs | 11 +++ OurUmbraco/OurUmbraco.csproj | 14 ++++ OurUmbraco/packages.config | 3 + 10 files changed, 213 insertions(+) create mode 100644 OurUmbraco.Site/Views/Partials/Home/Meetups.cshtml create mode 100644 OurUmbraco.Site/config/MeetupUmbracoGroups.txt create mode 100644 OurUmbraco/Community/Controllers/MeetupsController.cs create mode 100644 OurUmbraco/Community/Models/MeetupEventsModel.cs diff --git a/OurUmbraco.Site/OurUmbraco.Site.csproj b/OurUmbraco.Site/OurUmbraco.Site.csproj index fd2bbd28..c22ebb6a 100644 --- a/OurUmbraco.Site/OurUmbraco.Site.csproj +++ b/OurUmbraco.Site/OurUmbraco.Site.csproj @@ -224,6 +224,18 @@ ..\packages\semver.1.1.2\lib\net451\Semver.dll True + + ..\packages\Skybrud.Essentials.1.0.8\lib\net45\Skybrud.Essentials.dll + True + + + ..\packages\Skybrud.Social.Core.1.0.0-beta9\lib\net45\Skybrud.Social.Core.dll + True + + + ..\packages\Skybrud.Social.Meetup.1.0.0-beta001\lib\net45\Skybrud.Social.Meetup.dll + True + ..\packages\UmbracoCms.Core.7.5.11\lib\SQLCE4Umbraco.dll True @@ -485,6 +497,7 @@ + @@ -4330,6 +4343,7 @@ + web.config diff --git a/OurUmbraco.Site/Views/Partials/Community/Home.cshtml b/OurUmbraco.Site/Views/Partials/Community/Home.cshtml index a33f550c..10313f39 100644 --- a/OurUmbraco.Site/Views/Partials/Community/Home.cshtml +++ b/OurUmbraco.Site/Views/Partials/Community/Home.cshtml @@ -1,4 +1,5 @@ @using OurUmbraco.Our.Models +@using Skybrud.Social.Meetup.Models.Events @inherits OurUmbracoTemplatePage @{ var homeNotificationText = Model.Content.GetPropertyValue("homeOnlyBanner"); @@ -59,6 +60,7 @@ @if (Members.IsLoggedIn()) { @ForumActivity() + @Meetups() @TwitterSearch() @Html.Partial("home/documentation") } @@ -66,6 +68,7 @@ else { @Html.Partial("home/documentation") @ForumActivity() + @Meetups() @TwitterSearch() } @@ -125,4 +128,25 @@ else +} + +@helper Meetups() { +
+
+
+
+

Meetups

+

+ Upcoming meetups organized by the Umbraco community. +

+
+
+ Upcoming meetups +
+
+

Loading meetups...

+
+
+
+
} \ No newline at end of file diff --git a/OurUmbraco.Site/Views/Partials/Community/Scripts.cshtml b/OurUmbraco.Site/Views/Partials/Community/Scripts.cshtml index 91286fd5..b55f0fa0 100644 --- a/OurUmbraco.Site/Views/Partials/Community/Scripts.cshtml +++ b/OurUmbraco.Site/Views/Partials/Community/Scripts.cshtml @@ -7,6 +7,15 @@ console.log("Couldn't load Twitter feed", errTwitter.message); } + try { + console.log("@Url.Action("GetEvents", "Meetups")"); + $("#meetups").load("@Url.Action("GetEvents", "Meetups", new { numberOfResults = 6 })"); + console.log('yay'); + } + catch (errTwitter) { + console.log("Couldn't load meetups", errTwitter.message); + } + try { $("#forum-activity").load("@Url.Action("LatestActivity", "LatestActivity", new { numberOfTopics = 6 })"); } diff --git a/OurUmbraco.Site/Views/Partials/Home/Meetups.cshtml b/OurUmbraco.Site/Views/Partials/Home/Meetups.cshtml new file mode 100644 index 00000000..5c81530c --- /dev/null +++ b/OurUmbraco.Site/Views/Partials/Home/Meetups.cshtml @@ -0,0 +1,51 @@ +@using Skybrud.Essentials.Locations +@using Skybrud.Essentials.Locations.Extensions +@using Skybrud.Social.Meetup.Models.Events + +@inherits UmbracoViewPage + +@{ + + // Get a reference to the current member + IPublishedContent member = Members.GetCurrentMember(); + + // Get the location of the current member (if logged in and a location is present) + EssentialsLocation memberLocation = null; + if (member != null && member.HasValue("latitude") && member.HasValue("longitude")) { + memberLocation = new EssentialsLocation( + member.GetPropertyValue("latitude"), + member.GetPropertyValue("longitude") + ); + } + +} + +@foreach (MeetupEvent ev in Model.Events) { + + double distance = -1; + + if (memberLocation != null) { + if (ev.HasVenue) { + distance = memberLocation.GetDistance(ev.Venue); + } + } + + + @*
+ +
*@ +
+
+ @if (distance >= 0) { + @String.Format("~{0:N0}", distance / 1000) km + } +

@ev.Name

+

@ev.Time.DateTime.ToString("MMM d, yyyy") by @ev.Group.Name

+
+
+
+} + +@if (Model.Events.Any() == false) { +

Could not load recent meetups.

+} diff --git a/OurUmbraco.Site/config/MeetupUmbracoGroups.txt b/OurUmbraco.Site/config/MeetupUmbracoGroups.txt new file mode 100644 index 00000000..a7bc1b09 --- /dev/null +++ b/OurUmbraco.Site/config/MeetupUmbracoGroups.txt @@ -0,0 +1,7 @@ +umbracodk +Dutch-Umbraco-User-Group +Australian-Umbraco-Meetups +Kent-Umbraco-Meetup +Sydney-Umbraco-Meetup +Umbraco-Meetup-RheinMain +The-London-Umbraco-Meetup \ No newline at end of file diff --git a/OurUmbraco.Site/packages.config b/OurUmbraco.Site/packages.config index a2526ef8..40c06703 100644 --- a/OurUmbraco.Site/packages.config +++ b/OurUmbraco.Site/packages.config @@ -56,6 +56,9 @@ + + + diff --git a/OurUmbraco/Community/Controllers/MeetupsController.cs b/OurUmbraco/Community/Controllers/MeetupsController.cs new file mode 100644 index 00000000..a4d3452f --- /dev/null +++ b/OurUmbraco/Community/Controllers/MeetupsController.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web.Mvc; +using OurUmbraco.Community.Models; +using Skybrud.Social.Meetup; +using Skybrud.Social.Meetup.Models.Events; +using Skybrud.Social.Meetup.Responses.Events; +using Umbraco.Core.Logging; +using Umbraco.Web.Mvc; +using Umbraco.Core.Cache; + +namespace OurUmbraco.Community.Controllers { + + public class MeetupsController : SurfaceController { + + public ActionResult GetEvents() { + + MeetupEventsModel model = new MeetupEventsModel { + Events = new MeetupEvent[0] + }; + + try { + + string configPath = Server.MapPath("~/config/MeetupUmbracoGroups.txt"); + if (!System.IO.File.Exists(configPath)) { + LogHelper.Debug("Config file was not found: " + configPath); + return PartialView("~/Views/Partials/Home/Meetups.cshtml", model); + } + + // Get the alias (urlname) of each group from the config file + string[] aliases = System.IO.File.ReadAllLines(configPath); + + model.Events = + ApplicationContext.ApplicationCache.RuntimeCache.GetCacheItem("UmbracoSearchedMeetups", + () => { + + // Initialize a new service instance (we don't specify an API key since we're accessing public data) + MeetupService service = new MeetupService(); + + List aggregated = new List(); + + foreach (string alias in aliases) { + + try { + + // Make the call to the meetup.com API to get upcoming events + MeetupGetEventsResponse res = service.Events.GetEvents(alias); + + // TODO: We should probably have some pagination, as the API only returns the first 20 events for a group (none of the groups currently have that much) + + // Append the events from the reasponse to the aggregated list + aggregated.AddRange(res.Body); + + + } catch (Exception ex) { + LogHelper.Error("Could not get events from meetup.com for group with alias: " + alias, ex); + } + + } + + return aggregated.OrderBy(x => x.Time).ToArray(); + + }, TimeSpan.FromMinutes(30)); + + + } catch (Exception ex) { + LogHelper.Error("Could not get events from meetup.com", ex); + } + + return PartialView("~/Views/Partials/Home/Meetups.cshtml", model); + + } + + } + +} \ No newline at end of file diff --git a/OurUmbraco/Community/Models/MeetupEventsModel.cs b/OurUmbraco/Community/Models/MeetupEventsModel.cs new file mode 100644 index 00000000..1d5ad57f --- /dev/null +++ b/OurUmbraco/Community/Models/MeetupEventsModel.cs @@ -0,0 +1,11 @@ +using Skybrud.Social.Meetup.Models.Events; + +namespace OurUmbraco.Community.Models { + + public class MeetupEventsModel { + + public MeetupEvent[] Events { get; set; } + + } + +} \ No newline at end of file diff --git a/OurUmbraco/OurUmbraco.csproj b/OurUmbraco/OurUmbraco.csproj index 3250b40b..8a6ef83c 100644 --- a/OurUmbraco/OurUmbraco.csproj +++ b/OurUmbraco/OurUmbraco.csproj @@ -241,6 +241,18 @@ ..\packages\semver.1.1.2\lib\net451\Semver.dll True
+ + ..\packages\Skybrud.Essentials.1.0.8\lib\net45\Skybrud.Essentials.dll + True + + + ..\packages\Skybrud.Social.Core.1.0.0-beta9\lib\net45\Skybrud.Social.Core.dll + True + + + ..\packages\Skybrud.Social.Meetup.1.0.0-beta001\lib\net45\Skybrud.Social.Meetup.dll + True + ..\packages\UmbracoCms.Core.7.5.10\lib\SQLCE4Umbraco.dll True @@ -391,7 +403,9 @@ + + diff --git a/OurUmbraco/packages.config b/OurUmbraco/packages.config index 36f0e3a1..9bac4c67 100644 --- a/OurUmbraco/packages.config +++ b/OurUmbraco/packages.config @@ -55,6 +55,9 @@ + + +