Error executing template "/Designs/rybners/Paragraph/rybners-course-overview.cshtml"
Newtonsoft.Json.JsonSerializationException: Error getting value from 'UserPermissions' on 'Dynamicweb.Content.Area'. ---> System.NullReferenceException: Object reference not set to an instance of an object.
at Dynamicweb.Content.Area.get_UserPermissions()
at GetUserPermissions(Object )
at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)
--- End of inner exception stack trace ---
at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.Converters.KeyValuePairConverter.WriteJson(JsonWriter writer, Object value, JsonSerializer serializer)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeConvertable(JsonWriter writer, JsonConverter converter, Object value, JsonContract contract, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonConvert.SerializeObjectInternal(Object value, Type type, JsonSerializer jsonSerializer)
at Newtonsoft.Json.JsonConvert.SerializeObject(Object value, JsonSerializerSettings settings)
at CompiledRazorTemplates.Dynamic.RazorEngine_1dcd722b01f4458c98783b86f4f48046.Execute() in E:\Dynamicweb.NET\Solutions\Co3\staging.rybners.espresso4.dk\Files\Templates\Designs\rybners\Paragraph\rybners-course-overview.cshtml:line 70
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 Newtonsoft.Json
6 @using Page = Dynamicweb.Content.Page
7 @using PageService = Dynamicweb.Content.PageService
8 9 <div class="container-fluid">
10 <div class="row">
11 <div class="col-12">
12 13 @{
14 PageService ps = new PageService();
15 PageCollection courseItemCollection = ps.GetPagesForItems( new[] { "CourseItem" } );
16 17 object courseItemCategories = PageView.Current().Item[ "KursusKategorier" ];
18 string[] courseCategories = courseItemCategories.ToString().ToLower().Trim().Replace( " ", "" ).Split( ',' );
19 20 Dictionary< string, Page > matchingCourseCollection = new Dictionary< string, Page >();
21 IEnumerable< Page > pagesWithCategory = courseItemCollection.Where( hc => courseCategories.Contains( hc.Item[ "KategoriNavn" ]?.ToString().ToLower().Trim().Replace( " ", "" ) ) );
22 bool showAllCourses = false;
23 24 if (PageView.Current().Page.Item["ShowAllCourses"] != null )
25 {
26 showAllCourses = (bool) PageView.Current().Page.Item["ShowAllCourses"];
27 }
28 29 if ( showAllCourses == true )
30 {
31 pagesWithCategory = courseItemCollection.Where( p => p.Area.ID == PageView.Current().Area.ID );
32 }
33 34 List<Page> pagesWithCategoryWithoutHold = new List<Page>();
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 if ( teamPage != null )
47 {
48 string holdId = teamPage.Item["HoldAktiId"].ToString();
49 if (!matchingCourseCollection.ContainsKey( holdId ))
50 {
51 matchingCourseCollection.Add( holdId, teamPage );
52 }
53 }
54 else
55 {
56 pagesWithCategoryWithoutHold.Add(page);
57 }
58 }
59 }
60 61 62 @if ( matchingCourseCollection.Any() )
63 {
64 65 <ul class="rybners-course-overview">
66 @foreach ( KeyValuePair< string, Page > firstTeamInCourse in matchingCourseCollection.OrderBy( c => (DateTime)c.Value.Item[ "HoldStartDato" ]) )
67 {
68 string holdId = firstTeamInCourse.Value.Item[ "HoldAktiId" ]?.ToString();
69 70 <script>console.log("%cTEXT", "color:white;background:rebeccapurple;padding:5px;", @Newtonsoft.Json.JsonConvert.SerializeObject(firstTeamInCourse, new JsonSerializerSettings {ReferenceLoopHandling = ReferenceLoopHandling.Ignore, PreserveReferencesHandling = PreserveReferencesHandling.Objects}));</script>
71 72 73 74 75 var teams = RybnersItemService.Instance.GetTeamsForCourse( firstTeamInCourse.Value.Parent.ID );
76 var teamsSorted = teams.Where( t => ( DateTime ) t.Item[ "HoldStartDato" ] > DateTime.Now );
77 var severalTeams = teamsSorted.Count() > 1;
78 79 var fagByCourseItemList = RybnersItemService.Instance.GetSchoolSubjectsForCourse( firstTeamInCourse.Value.Parent.ID );
80 81 82 83 if ( firstTeamInCourse.Value != null && firstTeamInCourse.Value.Item != null && holdId != null )
84 {
85 string courseName = firstTeamInCourse.Value.Item[ "HoldAktivitetsnavn" ]?.ToString();
86 string courseType = firstTeamInCourse.Value.Parent.Item[ "AktivitetOfflineVisning" ]?.ToString();
87 88 string courseStartStr = firstTeamInCourse.Value.Item[ "HoldStartDato" ]?.ToString();
89 DateTime courseStartDate = new DateTime();
90 DateTime.TryParse( courseStartStr, out courseStartDate );
91 92 string courseEndStr = firstTeamInCourse.Value.Item[ "HoldSlutDato" ]?.ToString();
93 DateTime courseEndDate = new DateTime();
94 DateTime.TryParse( courseEndStr, out courseEndDate );
95 96 string courseDeadlineStr = firstTeamInCourse.Value.Item[ "HoldTilmeldingsfrist" ]?.ToString();
97 DateTime courseDeadlineDate = new DateTime();
98 DateTime.TryParse( courseDeadlineStr, out courseDeadlineDate );
99100 var fagItem = fagByCourseItemList.FirstOrDefault();
101102 string courseDuration = null;
103 if ( fagItem != null )
104 {
105 courseDuration = fagItem[ "SkoleFagVarighed" ].ToString();
106 }
107 double courseDurationDouble;
108 double.TryParse( courseDuration, out courseDurationDouble );
109 string courseUrl = string.Format( "Default.aspx?ID={0}", firstTeamInCourse.Value.Parent.ID );
110111 courseUrl = SearchEngineFriendlyURLs.GetFriendlyUrl( courseUrl );
112113 bool hasDeadlineInFurture = (courseDeadlineDate.Date) >= DateTime.Now.Date;
114115 bool isOpenCourseOrGuaranteed = hasDeadlineInFurture && ( (bool) firstTeamInCourse.Value.Item["HoldErGarantikursus"] == true || (string) firstTeamInCourse.Value.Item["HoldType"] == "av") ;
116117 bool isFull = (string)firstTeamInCourse.Value.Item["HoldStatus"] == "Optaget";
118119120 bool isAllFull = true;
121122 foreach ( var d in teamsSorted )
123 {
124 if ( (string)d.Item["HoldStatus"] != "Optaget" )
125 {
126 isAllFull = false;
127 }
128 }
129130 if ( isAllFull )
131 {
132 continue;
133 }
134135136137138 if ((courseDeadlineDate.Date) >= DateTime.Now.Date && teamsSorted.Any( t => ((int) t.Item["HoldLedigePladser"]) > 0 ) || isOpenCourseOrGuaranteed == true )
139 {
140 <li class="align-self-center d-flex rybners-course-list w-100">
141 <div class="course-name">
142 <a href="@courseUrl">
143 @if ( showAllCourses )
144 {
145 <h5 class="mb-0 text-muted">
146 @firstTeamInCourse.Value.Parent.Item["KategoriNavn"]
147 </h5>
148 <h3 class="mt-0">@courseName</h3>
149 }
150 else
151 {
152 <h3>@courseName</h3>
153 }
154155 </a>
156 </div>
157158 @if ( fagByCourseItemList.Count() > 1 )
159 {
160 <div class="course-date small">Flere fag tilknyttet</div>
161 }
162 else
163 {
164 <div class="course-date small">
165 <table class="table">
166 @foreach (Page teamPage in teamsSorted.OrderBy( t => (DateTime)t.Item[ "HoldStartDato" ] ))
167 {
168 DateTime startDato = ( DateTime ) teamPage.Item[ "HoldStartDato" ];
169 DateTime slutDato = ( DateTime ) teamPage.Item[ "HoldSlutDato" ];
170 double freeSpots;
171 double.TryParse( teamPage.Item["HoldLedigePladser"]?.ToString(), out freeSpots );
172 <tr>
173 <td class="px-0">
174 @startDato.ToString("dd. MMM yyyy")- @slutDato.ToString("dd. MMM yyyy")
175 </td>
176 <td class=" px-0 text-right">
177 <span class="badge p-1 badge-pill badge-secondary">
178 @if ( freeSpots > 0)
179 {
180 <span>@freeSpots ledige pladser</span>
181 }
182 else
183 {
184 <span>Kontakt os</span>
185 }
186187 </span>
188 </td>
189 </tr>
190 }
191 </table>
192 </div>
193194 }
195 <div class="course-signup text-right">
196 <a class="btn btn-sm " href="@courseUrl">@Translate( "Rybners Course module - Signup DA - Button", "Se mere og tilmeld" )</a>
197 <br />
198 </div>
199 <div class="course-type text-left">
200201 @if ( courseType == "amu" )
202 {
203 <p class="mb-0 mr-2 float-left"><i class="material-icons">done</i> AMU-kursus</p>
204 }
205 else if ( courseType == "idv")
206 {
207 <p class="mb-0 mr-2 float-left"><i class="material-icons">done</i> IDV-kursus</p>
208 }
209 else
210 {
211 <p class="mb-0">@courseType</p>
212 }
213214 </div>
215 <div class="course-deadline text-right">
216 @if ( fagByCourseItemList.Count() == 1 && (courseDeadlineDate.Date) >= DateTime.Now.Date )
217 {
218 <small>@Translate( "Rybners Course module - Deadline DA - Text", "Tilmeldingsfrist:" )<br />@courseDeadlineDate.ToString( "dd. MMM yyyy" )</small>
219 }
220 </div>
221 </li>
222 }
223 }
224 }
225 </ul>
226 }
227 else
228 {
229 <p>Der er pt. ingen hold oprettet - @Translate( "Rybners Course module - Inactive contact DA - Text", "Kontakt skolen" )</p>
230 }
231232 <h2>Vi tilbyder også kurser indenfor:</h2>
233234 <ul class="rybners-course-overview">
235236 @if ( matchingCourseCollection.Any() )
237 {
238 foreach ( KeyValuePair<string, Page> coursePage in matchingCourseCollection )
239 {
240241 string holdId = coursePage.Value.Item["HoldAktiId"]?.ToString();
242 var fagByCourseItemList = RybnersItemService.Instance.GetSchoolSubjectsForCourse( coursePage.Value.Parent.ID );
243 var teams = RybnersItemService.Instance.GetTeamsForCourse( coursePage.Value.Parent.ID );
244 if ( coursePage.Value != null && coursePage.Value.Item != null && holdId != null )
245 {
246 string courseName = coursePage.Value.Item["HoldAktivitetsnavn"]?.ToString();
247 string courseType = coursePage.Value.Parent.Item["AktivitetOfflineVisning"]?.ToString();
248249 string courseStartStr = coursePage.Value.Item["HoldStartDato"]?.ToString();
250 DateTime courseStartDate = new DateTime();
251 DateTime.TryParse( courseStartStr, out courseStartDate );
252253 string courseEndStr = coursePage.Value.Item["HoldSlutDato"]?.ToString();
254 DateTime courseEndDate = new DateTime();
255 DateTime.TryParse( courseEndStr, out courseEndDate );
256257 string courseDeadlineStr = coursePage.Value.Item["HoldTilmeldingsfrist"]?.ToString();
258 DateTime courseDeadlineDate = new DateTime();
259 DateTime.TryParse( courseDeadlineStr, out courseDeadlineDate );
260261262 string courseUrl = string.Format( "Default.aspx?ID={0}", coursePage.Value.Parent.ID );
263264 courseUrl = SearchEngineFriendlyURLs.GetFriendlyUrl( courseUrl );
265266267 bool hasAnyFreeTeams = teams.Any( t => (DateTime) t.Item["HoldTilmeldingsfrist"] > DateTime.Now );
268 bool hasAnyFreeSpots = teams.Any(t => (int)t.Item["HoldLedigePladser"] > 0);
269 bool isFull = (string)coursePage.Value.Item["HoldStatus"] == "Optaget";
270271 bool isAllFull = true;
272273 foreach ( var d in teams )
274 {
275 if ( (string)d.Item["HoldStatus"] != "Optaget" )
276 {
277 isAllFull = false;
278 }
279 }
280281 if ( isAllFull )
282 {
283 continue;
284 }
285286287 bool isOpenCourseOrGuaranteed = teams.Any(t => (bool)t.Item["HoldErGarantikursus"] == true || (string)t.Item["HoldType"] == "av" ) && hasAnyFreeTeams;
288289 if ( isAllFull == true || isOpenCourseOrGuaranteed == false && (hasAnyFreeTeams == false || hasAnyFreeSpots == false) )
290 {
291 <li class="align-self-center d-flex rybners-course-list rybners-course-list-others w-100">
292 <div class="course-name small">
293 <h3 class="small">
294 <a href="@courseUrl">
295 @courseName
296 </a>
297 </h3>
298 </div>
299300 <div class="text-right">@Translate( "Rybners Course module - Inactive contact DA - Text", "Kontakt skolen" )</div>
301 </li>
302 }
303 }
304 }
305 }
306307308309310 @foreach ( Page fagsideWithoutHold in pagesWithCategoryWithoutHold )
311 {
312 bool showFag = bool.Parse(fagsideWithoutHold.Item["AktivitetVisesOffline"]?.ToString() ?? bool.FalseString);
313 bool activeFag = bool.Parse(fagsideWithoutHold.Item["AktivitetVisible"]?.ToString() ?? bool.FalseString);
314315 if ( activeFag == true && showFag == true )
316 {
317 string courseName = fagsideWithoutHold.Item["AktivitetNavn"]?.ToString();
318 string courseUrl = string.Format( "Default.aspx?ID={0}", fagsideWithoutHold.ID );
319320 courseUrl = SearchEngineFriendlyURLs.GetFriendlyUrl( courseUrl );
321322 <li class="align-self-center d-flex rybners-course-list rybners-course-list-others w-100">
323 <div class="course-name small">
324 <h3 class="small">
325 <a href="@courseUrl">
326 @courseName
327 </a>
328 </h3>
329 </div>
330331 <div class="text-right">@Translate( "Rybners Course module - Inactive contact DA - Text", "Kontakt skolen" )</div>
332 </li>
333 }
334 }
335 </ul>
336337 </div>
338 </div>
339 </div>
340