@RequestMapping(value = "{postSlug}/delete", method = RequestMethod.POST)
 public RedirectView delete(
     @PathVariable ExecutionCourse executionCourse, @PathVariable String postSlug) {
   Post post = executionCourse.getSite().postForSlug(postSlug);
   atomic(() -> post.delete());
   return viewAll(executionCourse);
 }
 @RequestMapping(value = "{postSlug}/edit", method = RequestMethod.POST)
 public RedirectView edit(
     @PathVariable ExecutionCourse executionCourse,
     @PathVariable String postSlug,
     @RequestParam LocalizedString name,
     @RequestParam LocalizedString body) {
   Post post = executionCourse.getSite().postForSlug(postSlug);
   atomic(
       () -> {
         post.setName(Post.sanitize(name));
         post.setBody(Post.sanitize(body));
       });
   return viewAll(executionCourse);
 }
 @RequestMapping(value = "create", method = RequestMethod.POST)
 public RedirectView create(
     @PathVariable ExecutionCourse executionCourse,
     @RequestParam LocalizedString name,
     @RequestParam LocalizedString body)
     throws Exception {
   Site site = executionCourse.getSite();
   atomic(
       () ->
           Post.create(
               site,
               null,
               Post.sanitize(name),
               Post.sanitize(body),
               announcementsCategory(site),
               true,
               getUser()));
   return viewAll(executionCourse);
 }
 @Atomic
 private GroupBasedFile addFile(MultipartFile attachment, Post p) throws IOException {
   GroupBasedFile f =
       new GroupBasedFile(
           attachment.getOriginalFilename(),
           attachment.getOriginalFilename(),
           attachment.getBytes(),
           AnyoneGroup.get());
   p.getPostFiles().putFile(f);
   return f;
 }