Error executing template "/Designs/rybners/Paragraph/rybners-course-overview.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_69595012eaec43359eac9d825f3d60c6.<>c.<Execute>b__1_2(Page c) in C:\inetpub\wwwroot\rybners_2022.espresso4.dk\Files\Templates\Designs\rybners\Paragraph\rybners-course-overview.cshtml:line 41
at System.Linq.EnumerableSorter`2.ComputeKeys(TElement[] elements, Int32 count)
at System.Linq.EnumerableSorter`1.Sort(TElement[] elements, Int32 count)
at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__1.MoveNext()
at System.Linq.Enumerable.<TakeIterator>d__25`1.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
at CompiledRazorTemplates.Dynamic.RazorEngine_69595012eaec43359eac9d825f3d60c6.Execute() in C:\inetpub\wwwroot\rybners_2022.espresso4.dk\Files\Templates\Designs\rybners\Paragraph\rybners-course-overview.cshtml:line 39
at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @using Co3.Espresso.Website.Services
2 @using Co3.Rybners.Website.Services
3 @using Dynamicweb.Content
4 @using Dynamicweb.Frontend
5 @using Page = Dynamicweb.Content.Page
6 @using PageService = Dynamicweb.Content.PageService
7 8 <div class="container-fluid">
9 <div class="row">
10 <div class="col-12">
11 12 @{
13 PageService ps = new PageService();
14 PageCollection courseItemCollection = ps.GetPagesForItems( new[] { "CourseItem" } );
15 16 object courseItemCategories = PageView.Current().Item[ "KursusKategorier" ];
17 string[] courseCategories = courseItemCategories.ToString().ToLower().Trim().Replace( " ", "" ).Split( ',' );
18 19 Dictionary< string, Page > matchingCourseCollection = new Dictionary< string, Page >();
20 IEnumerable< Page > pagesWithCategory = courseItemCollection.Where( hc => courseCategories.Contains( hc.Item[ "KategoriNavn" ]?.ToString().ToLower().Trim().Replace( " ", "" ) ) );
21 bool showAllCourses = false;
22 23 if (PageView.Current().Page.Item["ShowAllCourses"] != null )
24 {
25 showAllCourses = (bool) PageView.Current().Page.Item["ShowAllCourses"];
26 }
27 28 if ( showAllCourses == true )
29 {
30 pagesWithCategory = courseItemCollection.Where( p => p.Area.ID == PageView.Current().Area.ID );
31 }
32 33 List<Page> pagesWithCategoryWithoutHold = new List<Page>();
34 Dictionary<string, string> coursesNotMeetingRequirements = new Dictionary<string, string>();
35 36 37 foreach ( Page page in pagesWithCategory )
38 {
39 Page teamPage = RybnersItemService.Instance.GetTeamsForCourse( page.ID ).OrderByDescending( c =>
40 {
41 string courseDeadlineStr = c.Item["HoldTilmeldingsfrist"]?.ToString();
42 DateTime courseDeadlineDate = new DateTime();
43 DateTime.TryParse( courseDeadlineStr, out courseDeadlineDate );
44 return courseDeadlineDate;
45 }).Take(1).FirstOrDefault();
46 47 if ( teamPage != null )
48 {
49 string holdId = teamPage.Item["HoldAktiId"].ToString();
50 if (!matchingCourseCollection.ContainsKey( holdId ))
51 {
52 matchingCourseCollection.Add( holdId, teamPage );
53 }
54 }
55 else
56 {
57 pagesWithCategoryWithoutHold.Add(page);
58 }
59 }
60 }
61 62 63 @if ( matchingCourseCollection.Any() )
64 {
65 66 <ul class="rybners-course-overview">
67 @foreach ( KeyValuePair< string, Page > firstTeamInCourse in matchingCourseCollection.OrderBy( c => (DateTime)c.Value.Item[ "HoldStartDato" ]) )
68 {
69 string holdId = firstTeamInCourse.Value.Item[ "HoldAktiId" ]?.ToString();
70 71 72 73 var teams = RybnersItemService.Instance.GetTeamsForCourse( firstTeamInCourse.Value.Parent.ID );
74 var teamsSorted = teams.Where( t => ( DateTime ) t.Item[ "HoldStartDato" ] > DateTime.Now );
75 var severalTeams = teamsSorted.Count() > 1;
76 77 var fagByCourseItemList = RybnersItemService.Instance.GetSchoolSubjectsForCourse( firstTeamInCourse.Value.Parent.ID );
78 79 80 81 if ( firstTeamInCourse.Value != null && firstTeamInCourse.Value.Item != null && holdId != null )
82 {
83 string courseName = firstTeamInCourse.Value.Item[ "HoldAktivitetsnavn" ]?.ToString();
84 string courseType = firstTeamInCourse.Value.Parent.Item[ "AktivitetOfflineVisning" ]?.ToString();
85 86 string courseStartStr = firstTeamInCourse.Value.Item[ "HoldStartDato" ]?.ToString();
87 DateTime courseStartDate = new DateTime();
88 DateTime.TryParse( courseStartStr, out courseStartDate );
89 90 string courseEndStr = firstTeamInCourse.Value.Item[ "HoldSlutDato" ]?.ToString();
91 DateTime courseEndDate = new DateTime();
92 DateTime.TryParse( courseEndStr, out courseEndDate );
93 94 string courseDeadlineStr = firstTeamInCourse.Value.Item[ "HoldTilmeldingsfrist" ]?.ToString();
95 DateTime courseDeadlineDate = new DateTime();
96 DateTime.TryParse( courseDeadlineStr, out courseDeadlineDate );
97 98 var fagItem = fagByCourseItemList.FirstOrDefault();
99100 string courseDuration = null;
101 if ( fagItem != null )
102 {
103 courseDuration = fagItem[ "SkoleFagVarighed" ].ToString();
104 }
105 double courseDurationDouble;
106 double.TryParse( courseDuration, out courseDurationDouble );
107 string courseUrl = string.Format( "Default.aspx?ID={0}", firstTeamInCourse.Value.Parent.ID );
108109 courseUrl = SearchEngineFriendlyURLs.GetFriendlyUrl( courseUrl );
110111 bool hasDeadlineInFurture = (courseDeadlineDate.Date) >= DateTime.Now.Date;
112113 bool isOpenCourseOrGuaranteed = hasDeadlineInFurture && ( (bool) firstTeamInCourse.Value.Item["HoldErGarantikursus"] == true || (string) firstTeamInCourse.Value.Item["HoldType"] == "av") ;
114115 bool isFull = (string)firstTeamInCourse.Value.Item["HoldStatus"] == "Optaget";
116117118 bool isAllFull = true;
119120 foreach ( var d in teamsSorted )
121 {
122 if ( (string)d.Item["HoldStatus"] != "Optaget" )
123 {
124 isAllFull = false;
125 }
126 }
127128 if ( isAllFull )
129 {
130 if ( !coursesNotMeetingRequirements.ContainsKey( courseName ) )
131 {
132 coursesNotMeetingRequirements.Add( courseName, courseUrl );
133 }
134 continue;
135 }
136137138139140 if ((courseDeadlineDate.Date) >= DateTime.Now.Date && teamsSorted.Any( t => ((int) t.Item["HoldLedigePladser"]) > 0 ) || isOpenCourseOrGuaranteed == true )
141 {
142 <li class="align-self-center d-flex rybners-course-list w-100">
143 <div class="course-name">
144 <a href="@courseUrl">
145 @if ( showAllCourses )
146 {
147 <h5 class="mb-0 text-muted">
148 @firstTeamInCourse.Value.Parent.Item["KategoriNavn"]
149 </h5>
150 <h3 class="mt-0">@courseName</h3>
151 }
152 else
153 {
154 <h3>@courseName</h3>
155 }
156157 </a>
158 </div>
159160 @if ( fagByCourseItemList.Count() > 1 )
161 {
162 <div class="course-date small">Flere fag tilknyttet</div>
163 }
164 else
165 {
166 <div class="course-date small">
167 <table class="table">
168 @foreach (Page teamPage in teamsSorted.OrderBy( t => (DateTime)t.Item[ "HoldStartDato" ] ))
169 {
170 DateTime startDato = ( DateTime ) teamPage.Item[ "HoldStartDato" ];
171 DateTime slutDato = ( DateTime ) teamPage.Item[ "HoldSlutDato" ];
172 double freeSpots;
173 double.TryParse( teamPage.Item["HoldLedigePladser"]?.ToString(), out freeSpots );
174 <tr>
175 <td class="px-0">
176 @startDato.ToString("dd. MMM yyyy")- @slutDato.ToString("dd. MMM yyyy")
177 </td>
178 <td class=" px-0 text-right">
179 <span class="badge p-1 badge-pill badge-secondary">
180 @if ( freeSpots > 0)
181 {
182 <span>@freeSpots ledige pladser</span>
183 }
184 else
185 {
186 <span>Kontakt os</span>
187 }
188189 </span>
190 </td>
191 </tr>
192 }
193 </table>
194 </div>
195196 }
197 <div class="course-signup text-right">
198 <a class="btn btn-sm " href="@courseUrl">@Translate( "Rybners Course module - Signup DA - Button", "Se mere og tilmeld" )</a>
199 <br />
200 </div>
201 <div class="course-type text-left">
202203 @if ( courseType == "amu" )
204 {
205 <p class="mb-0 mr-2 float-left"><i class="material-icons">done</i> AMU-kursus</p>
206 }
207 else if ( courseType == "idv")
208 {
209 <p class="mb-0 mr-2 float-left"><i class="material-icons">done</i> IDV-kursus</p>
210 }
211 else
212 {
213 <p class="mb-0">@courseType</p>
214 }
215216 </div>
217 <div class="course-deadline text-right">
218 @if ( fagByCourseItemList.Count() == 1 && (courseDeadlineDate.Date) >= DateTime.Now.Date )
219 {
220 <small>@Translate( "Rybners Course module - Deadline DA - Text", "Tilmeldingsfrist:" )<br />@courseDeadlineDate.ToString( "dd. MMM yyyy" )</small>
221 }
222 </div>
223 </li>
224 }
225 else
226 {
227 @* Collect pages that don't meet requirements *@
228 @* Course deadline in future - has free spots *@
229 if ( !coursesNotMeetingRequirements.ContainsKey( courseName ) )
230 {
231 coursesNotMeetingRequirements.Add( courseName, courseUrl );
232 }
233 }
234 }
235236237 }
238 </ul>
239 }
240 else
241 {
242 <p>Der er pt. ingen hold oprettet - @Translate( "Rybners Course module - Inactive contact DA - Text", "Kontakt skolen" )</p>
243 }
244245 <h2>Vi tilbyder også kurser indenfor:</h2>
246247 <ul class="rybners-course-overview">
248249250 @if ( matchingCourseCollection.Any() )
251 {
252 foreach ( KeyValuePair<string, Page> coursePage in matchingCourseCollection )
253 {
254255 string holdId = coursePage.Value.Item["HoldAktiId"]?.ToString();
256 var fagByCourseItemList = RybnersItemService.Instance.GetSchoolSubjectsForCourse( coursePage.Value.Parent.ID );
257 var teams = RybnersItemService.Instance.GetTeamsForCourse( coursePage.Value.Parent.ID );
258 if ( coursePage.Value != null && coursePage.Value.Item != null && holdId != null )
259 {
260 string courseName = coursePage.Value.Item["HoldAktivitetsnavn"]?.ToString();
261 string courseType = coursePage.Value.Parent.Item["AktivitetOfflineVisning"]?.ToString();
262263 string courseStartStr = coursePage.Value.Item["HoldStartDato"]?.ToString();
264 DateTime courseStartDate = new DateTime();
265 DateTime.TryParse( courseStartStr, out courseStartDate );
266267 string courseEndStr = coursePage.Value.Item["HoldSlutDato"]?.ToString();
268 DateTime courseEndDate = new DateTime();
269 DateTime.TryParse( courseEndStr, out courseEndDate );
270271 string courseDeadlineStr = coursePage.Value.Item["HoldTilmeldingsfrist"]?.ToString();
272 DateTime courseDeadlineDate = new DateTime();
273 DateTime.TryParse( courseDeadlineStr, out courseDeadlineDate );
274275276 string courseUrl = string.Format( "Default.aspx?ID={0}", coursePage.Value.Parent.ID );
277278 courseUrl = SearchEngineFriendlyURLs.GetFriendlyUrl( courseUrl );
279280281 bool hasAnyFreeTeams = teams.Any( t => (DateTime) t.Item["HoldTilmeldingsfrist"] > DateTime.Now );
282 bool hasAnyFreeSpots = teams.Any(t => (int)t.Item["HoldLedigePladser"] > 0);
283 bool isFull = (string)coursePage.Value.Item["HoldStatus"] == "Optaget";
284285 bool isAllFull = true;
286287 foreach ( var d in teams )
288 {
289 if ( (string)d.Item["HoldStatus"] != "Optaget" )
290 {
291 isAllFull = false;
292 }
293 }
294295 if ( isAllFull )
296 {
297 continue;
298 }
299300301 bool isOpenCourseOrGuaranteed = teams.Any(t => (bool)t.Item["HoldErGarantikursus"] == true || (string)t.Item["HoldType"] == "av" ) && hasAnyFreeTeams;
302303 if ( isAllFull == true || isOpenCourseOrGuaranteed == false && (hasAnyFreeTeams == false || hasAnyFreeSpots == false) )
304 {
305 @* Collect pages that don't meet requirements *@
306 @* Is full - is not guaranteed and has no free spots *@
307 if ( !coursesNotMeetingRequirements.ContainsKey( courseName ) )
308 {
309 coursesNotMeetingRequirements.Add( courseName, courseUrl );
310 }
311 }
312 }
313 }
314 }
315316317318 @* Collect pages without any teams *@
319 @foreach ( Page fagsideWithoutHold in pagesWithCategoryWithoutHold )
320 {
321 bool showFag = bool.Parse(fagsideWithoutHold.Item["AktivitetVisesOffline"]?.ToString() ?? bool.FalseString);
322 bool activeFag = bool.Parse(fagsideWithoutHold.Item["AktivitetVisible"]?.ToString() ?? bool.FalseString);
323324 if ( activeFag == true && showFag == true )
325 {
326 string courseName = fagsideWithoutHold.Item["AktivitetNavn"]?.ToString();
327 string courseUrl = string.Format( "Default.aspx?ID={0}", fagsideWithoutHold.ID );
328 courseUrl = SearchEngineFriendlyURLs.GetFriendlyUrl( courseUrl );
329 if ( !coursesNotMeetingRequirements.ContainsKey( courseName ) )
330 {
331 coursesNotMeetingRequirements.Add( courseName, courseUrl );
332 }
333 }
334 }
335336 @* Render a list of courses in aloso offering *@
337 @foreach ( KeyValuePair<string, string> coursesNotMeetingRequirementsItem in coursesNotMeetingRequirements.OrderBy( a => a.Key ) )
338 {
339 <li class="align-self-center d-flex rybners-course-list rybners-course-list-others w-100">
340 <div class="course-name small">
341 <h3 class="small">
342 <a href="@coursesNotMeetingRequirementsItem.Value">
343 @coursesNotMeetingRequirementsItem.Key
344 </a>
345 </h3>
346 </div>
347348 <div class="text-right">@Translate( "Rybners Course module - Inactive contact DA - Text", "Kontakt skolen" )</div>
349 </li>
350 }
351 </ul>
352 </div>
353 </div>
354 </div>
355