// GET: Session/Topic
        public ActionResult Index(FilteredTopics filter, string viewPref)
        {
            ActiveSession session = GetSession();
            if (session == null)
                return RedirectToAction("Index", "Master");

            if (viewPref == "Table" || viewPref == "Panels")
                Session["DiscussionView"] = viewPref;

            PrepareTopics(filter, session);

            if ((Session["DiscussionView"] as string) == "Table")
                return View("IndexTable", filter);
            else
                return View("IndexPanels", filter); // Default
        }
        private void PrepareTopics(FilteredTopics filter, ActiveSession session)
        {
            // Zwecks Performance wäre hier eigentlich eine Query-Projektion angebracht
            IQueryable<Topic> query = db.Topics
                .Include(t => t.SessionType)
                .Include(t => t.TargetSessionType)
                .Include(t => t.Owner)
                .Include(t => t.Comments)
                .Include(t => t.Lock)
                .Include(t => t.Tags)
                .Include(t => t.Votes)
                .Include(t => t.UnreadBy)
                .Include(t => t.Assignments)
                .Where(t => t.Decision == null && !t.IsReadOnly)
                .Where(t =>
                    t.Lock.Session.ID == session.ID ||
                    (t.SessionTypeID == session.SessionType.ID && t.Created < session.Start && !(t.ResubmissionDate >= session.Start)));

            if (filter.ShowPriority >= 0)
                query = query.Where(t => t.Priority == (Priority)filter.ShowPriority);

            if (filter.Timespan != 0)
            {
                if (filter.Timespan > 0) // Nur die letzten x Tage anzeigen
                {
                    var cutoff = DateTime.Today.AddDays(-filter.Timespan);
                    query = query.Where(t => t.Created >= cutoff);
                }
                else // Alles VOR den letzten x Tagen anzeigen
                {
                    var cutoff = DateTime.Today.AddDays(filter.Timespan);
                    query = query.Where(t => t.Created < cutoff);
                }
            }

            if (filter.OwnerID != 0)
                query = query.Where(a => a.OwnerID == filter.OwnerID);

            filter.UserList = CreateUserSelectList();
            filter.PriorityList = TopicsController.PriorityChoices(filter.ShowPriority);
            filter.SessionTypeList = new SelectList(db.GetActiveSessionTypes(), "ID", "Name");

            filter.TimespanList = TopicsController.TimespanChoices(filter.Timespan);

            using (MiniProfiler.Current.Step("Sortierung der Themen"))
            {
                filter.Topics = query.ToList().OrderByDescending(t => t.IsUnreadBy(GetCurrentUserID())).ThenBy(t =>
                {
                    TimeSpan time;
                    return TimeSpan.TryParse(t.Time, out time) ? time : new TimeSpan(24, 0, 0);
                }).ThenByDescending(t => t.Priority).ThenBy(t => t.Created).ToList();
            }

            foreach (var topic in filter.Topics)
                topic.IsLocked = topic.Lock != null;
        }
예제 #3
0
        // GET: Topics
        /// <summary>
        ///    Liefert eine tabellarische Auflistung der Themen. Der Benutzer kann nun die Themen filtern, oder auf die Detailseite
        ///    wechseln. Das ViewModel <see cref="FilteredTopics" /> wird verwndet, um die Filterkriteriem zu transportieren.
        /// </summary>
        /// <param name="filter">Das ViewModel, dass die Filterkriterien angibt.</param>
        public ActionResult Index(FilteredTopics filter)
        {
            IQueryable<Topic> query = db.Topics
                .Include(t => t.SessionType)
                .Include(t => t.TargetSessionType)
                .Include(t => t.Creator);

            if (!filter.ShowReadonly)
                query = query.Where(t => !t.IsReadOnly);

            if (filter.ShowPriority >= 0)
                query = query.Where(t => t.Priority == (Priority)filter.ShowPriority);

            if (filter.SessionTypeID > 0)
                query = query.Where(t => t.SessionTypeID == filter.SessionTypeID || t.TargetSessionTypeID == filter.SessionTypeID);

            if (filter.Timespan != 0)
            {
                if (filter.Timespan > 0) // Nur die letzten x Tage anzeigen
                {
                    var cutoff = DateTime.Today.AddDays(-filter.Timespan);
                    query = query.Where(t => t.Created >= cutoff);
                }
                else // Alles VOR den letzten x Tagen anzeigen
                {
                    var cutoff = DateTime.Today.AddDays(filter.Timespan);
                    query = query.Where(t => t.Created < cutoff);
                }
            }

            if (filter.OwnerID != 0)
                query = query.Where(a => a.OwnerID == filter.OwnerID);

            if (filter.ShowTagsID.Count > 0)
            {
                var desired = filter.ShowTagsID.ToArray();
                query = query.Where(topic => topic.Tags.Any(tt => desired.Contains(tt.TagID)));
            }

            filter.UserList = CreateUserSelectList();
            filter.PriorityList = PriorityChoices(filter.ShowPriority);
            filter.SessionTypeList = new SelectList(db.GetActiveSessionTypes(), "ID", "Name");
            filter.TimespanList = TimespanChoices(filter.Timespan);
            filter.TagList = db.Tags.Select(tag => new SelectListItem
            {
                Text = tag.Name,
            // ReSharper disable once SpecifyACultureInStringConversionExplicitly
                Value = tag.ID.ToString()
            }).ToList();

            filter.Topics = query.OrderByDescending(t => t.Priority).ThenBy(t => t.Title).ToList();

            return View(filter);
        }