public void LocalRefresh() { try { League.LocalRefresh(); var memberships = Memberships.Select(vm => vm.Membership).ToList(); var comparer = new MembershipComparer(); var toRemove = memberships.Except(League.Memberships, comparer).ToList(); var toAdd = League.Memberships.Except(memberships, comparer).ToList(); toRemove.ForEach(m => Memberships.Remove(Memberships.Single(vm => vm.Membership == m))); toAdd.ForEach(m => Memberships.Add(new MembershipViewModel { MembershipId = m.Id })); Memberships.Sort(new MembershipSortComparer()); Memberships.ToList().ForEach(vm => vm.NotifyPropertiesChanged()); if (Memberships.Count == 0) { Memberships.Add(new MembershipViewModel { EmptyMessage = "This league has no members yet" }); } } catch (Exception e) { InsightsManager.Report(e); } }
async public Task GetLeaderboard(bool forceRefresh = false) { using (new Busy(this)) { await AzureService.Instance.LeagueManager.GetItemAsync(League.Id, forceRefresh); _league = null; League.LocalRefresh(); Memberships.Clear(); League.Memberships.ForEach(i => Memberships.Add(new MembershipViewModel { Membership = i })); Memberships.Sort(new MembershipSortComparer()); if (Memberships.Count == 0) { Memberships.Add(new MembershipViewModel { EmptyMessage = "This league has no members yet" }); } } }
/// <summary> /// Returns most recent membership for each org wich is active or terminated within the grace period /// </summary> /// <param name="orgs">List of ids. If empty, all orgs</param> /// <param name="gracePeriod">For exired, number of days to add to allow it to be returned</param> /// <returns></returns> public Memberships GetRecentMemberships (List<int> orgs, int gracePeriod) { Memberships memberships = this.GetMemberships(true); Dictionary<int, Membership> collectMembers = new Dictionary<int, Membership>(); memberships.Sort(delegate(Membership ms1, Membership ms2) { return ms2.DateTerminated.CompareTo(ms1.DateTerminated); }); //Keep one for each org, the active one or the one with the highest Terminationdate foreach (Membership membership in memberships) { if (orgs.Count == 0 || orgs.Contains(membership.OrganizationId)) { if (membership.Active) { collectMembers[membership.OrganizationId] = membership; } else if (membership.DateTerminated.AddDays(gracePeriod) > DateTime.Today) { if (!collectMembers.ContainsKey(membership.OrganizationId) || collectMembers[membership.OrganizationId].Active == false) { collectMembers[membership.OrganizationId] = membership; } } } } Memberships collectedMS = new Memberships(); collectedMS.AddRange(collectMembers.Values); if (collectedMS.Count > 0) { //sort to get most recent first collectedMS.Sort(delegate(Membership ms1, Membership ms2) { if (ms1.Active && ms1.Active != ms2.Active) return -1; // active before terminated else if (ms1.Active != ms2.Active) return 1;// active before terminated else if (ms1.Active) return ms1.Expires.CompareTo(ms2.Expires); // active with lowest expiry else return ms2.DateTerminated.CompareTo(ms1.DateTerminated); // terminated with latest terminationdate }); } return collectedMS; }