/** * Send a notification * * @param Notification $notif * @param bool $tryCompile * @return bool */ public function send(Notification $notif, $tryCompile = false) { /** @var $em EntityManager */ $em = $this->doctrine->getManager(); if (!$notif->getIsSuper() && $tryCompile) { $oldDate = new \DateTime(); $oldDate->setTime(date('h') - 1, date('i'), date('s')); $oldNotif = $em->createQueryBuilder()->select('n')->from('EtuCoreBundle:Notification', 'n')->where('n.createdAt > :oldDate')->andWhere('n.isSuper = 0')->andWhere('n.helper = :helper')->andWhere('n.entityType = :entityType')->andWhere('n.entityId = :entityId')->setParameter('oldDate', $oldDate)->setParameter('helper', $notif->getHelper())->setParameter('entityType', $notif->getEntityType())->setParameter('entityId', $notif->getEntityId())->setMaxResults(1)->getQuery()->getOneOrNullResult(); if ($oldNotif instanceof Notification) { $oldNotif->setEntities(array_merge($oldNotif->getEntities(), $notif->getEntities())); $oldNotif->setCreatedAt($notif->getDate()); $em->persist($oldNotif); } else { $em->persist($notif); } } else { $em->persist($notif); } $em->flush(); return true; }
/** * @Route("/forum/answer/{id}-{slug}", name="forum_answer") * @Template() */ public function answerAction($id, $slug) { if (!$this->getUser()) { return $this->createAccessDeniedResponse(); } $em = $this->getDoctrine()->getManager(); $thread = $em->createQueryBuilder()->select('t, c')->from('EtuModuleForumBundle:Thread', 't')->leftJoin('t.category', 'c')->where('t.id = :id')->andWhere('t.state != 300')->setParameter('id', $id)->getQuery()->getSingleResult(); $category = $thread->getCategory(); $checker = new PermissionsChecker($this->getUser()); if (!$checker->canAnswer($category) || $thread->getState() == 200 && !$checker->canLock($category) && !$this->getUser()->getIsAdmin()) { return $this->createAccessDeniedResponse(); } $parents = $em->createQueryBuilder()->select('c')->from('EtuModuleForumBundle:Category', 'c')->where('c.left <= :left')->andWhere('c.right >= :right')->setParameter('left', $category->getLeft())->setParameter('right', $category->getRight())->orderBy('c.depth')->getQuery()->getResult(); $message = new Message(); $form = $this->createForm(new MessageType(), $message); $request = $this->get('request'); if ($request->getMethod() == 'POST') { $form->bind($request); if ($form->isValid()) { $message->setAuthor($this->getUser())->setCategory($category)->setThread($thread)->setState(100); $thread->setCountMessages($thread->getCountMessages() + 1)->setLastMessage($message); foreach ($parents as $parent) { $parent->setLastMessage($message)->setCountMessages($parent->getCountMessages() + 1); $em->persist($parent); } $em->persist($thread); $views = $em->getRepository('EtuModuleForumBundle:View')->findByThread($thread); foreach ($views as $view) { $em->remove($view); } $cviews = $em->getRepository('EtuModuleForumBundle:CategoryView')->findByCategory($category); foreach ($cviews as $cview) { $em->remove($cview); } $em->flush(); $this->giveBadges(); $page = ceil($thread->getCountMessages() / 10); $notif = new Notification(); $notif->setModule($this->getCurrentBundle()->getIdentifier())->setHelper('thread_answered')->setAuthorId($this->getUser()->getId())->setEntityType('message')->setEntityId($thread->getId())->addEntity($message); $this->getNotificationsSender()->send($notif); $this->getSubscriptionsManager()->subscribe($this->getUser(), 'message', $thread->getId()); return $this->redirect($this->generateUrl('forum_thread', array('id' => $thread->getId(), 'slug' => $thread->getSlug(), 'page' => $page)) . '#' . $message->getId()); } else { return array('errors' => $form->getErrors(), 'thread' => $thread, 'parents' => $parents, 'form' => $form->createView()); } } return array('thread' => $thread, 'parents' => $parents, 'form' => $form->createView()); }
/** * @Route("/{id}/subscribe", name="covoiturage_my_subscribe") */ public function subscribeAction($id) { if (!$this->getUserLayer()->isUser()) { return $this->createAccessDeniedResponse(); } /** @var EntityManager $em */ $em = $this->getDoctrine()->getManager(); /** @var Covoit $covoit */ $covoit = $em->createQueryBuilder()->select('c, s, u, sc, ec')->from('EtuModuleCovoitBundle:Covoit', 'c')->leftJoin('c.subscriptions', 's')->leftJoin('c.startCity', 'sc')->leftJoin('c.endCity', 'ec')->leftJoin('s.user', 'u')->where('c.id = :id')->setParameter('id', (int) $id)->getQuery()->getOneOrNullResult(); if (!$covoit) { throw $this->createNotFoundException(); } if (!$this->getUser()->getPhoneNumber()) { $this->get('session')->getFlashBag()->set('message', array('type' => 'error', 'message' => 'covoit.messages.required_phone')); } elseif ($covoit->hasUser($this->getUser())) { $this->get('session')->getFlashBag()->set('message', array('type' => 'error', 'message' => 'covoit.messages.already_subscribed')); } else { $subscription = new CovoitSubscription(); $subscription->setCovoit($covoit); $subscription->setUser($this->getUser()); $subscription->setPhoneNumber($this->getUser()->getPhoneNumber()); $covoit->addSubscription($subscription); $em->persist($subscription); $em->persist($covoit); $em->flush(); // Notify followers $notif = new Notification(); $notif->setModule($this->getCurrentBundle()->getIdentifier())->setHelper('covoit_subscription')->setAuthorId($this->getUser()->getId())->setEntityType('covoit')->setEntityId($covoit->getId())->addEntity($subscription); $this->getNotificationsSender()->send($notif); // Add current user as subscriber $this->getSubscriptionsManager()->subscribe($this->getUser(), 'covoit', $covoit->getId()); $this->get('session')->getFlashBag()->set('message', array('type' => 'success', 'message' => 'covoit.messages.subscribed')); } return $this->redirect($this->generateUrl('covoiturage_view', ['id' => $covoit->getId(), 'slug' => $covoit->getStartCity()->getSlug() . '-' . $covoit->getEndCity()->getSlug()])); }
/** * @Route("/user/membership/{login}/notification", name="memberships_orga_notifications") * @Template() */ public function notificationAction($login) { if (!$this->getUserLayer()->isUser()) { return $this->createAccessDeniedResponse(); } /** @var $em EntityManager */ $em = $this->getDoctrine()->getManager(); $query = $em->createQueryBuilder()->select('m, o')->from('EtuUserBundle:Member', 'm')->leftJoin('m.organization', 'o')->andWhere('m.user = :user')->setParameter('user', $this->getUser()->getId())->orderBy('m.role', 'DESC')->addOrderBy('o.name', 'ASC')->getQuery(); $query->useResultCache(true, 60); /** @var $memberships Member[] */ $memberships = $query->getResult(); $membership = null; foreach ($memberships as $m) { if ($m->getOrganization()->getLogin() == $login) { $membership = $m; break; } } if (!$membership) { throw $this->createNotFoundException('Membership or organization not found for login ' . $login); } if (!$membership->hasPermission('notify')) { return $this->createAccessDeniedResponse(); } $orga = $membership->getOrganization(); $notif = new \stdClass(); $notif->link = null; $notif->content = ''; $notif->orga_name = $orga->getName(); $form = $this->createFormBuilder($notif)->add('link', 'url', array('required' => false))->add('content', 'textarea', array('required' => true, 'max_length' => 140))->getForm(); $request = $this->getRequest(); if ($request->getMethod() == 'POST' && $form->bind($request)->isValid()) { $notification = new Notification(); $notification->setEntityType('orga')->setEntityId($orga->getId())->setModule('assos')->setAuthorId($this->getUser()->getId())->setHelper('orga_message')->addEntity($notif); $this->getNotificationsSender()->send($notification, false); $this->get('session')->getFlashBag()->set('message', array('type' => 'success', 'message' => 'user.memberships.notification.confirm')); return $this->redirect($this->generateUrl('memberships_orga_notifications', array('login' => $login))); } return array('memberships' => $memberships, 'membership' => $membership, 'form' => $form->createView()); }
/** * @Route("/{id}-{slug}/close", requirements = {"id" = "\d+"}, name="bugs_admin_close") * @Template() */ public function closeAction($id, $slug) { if (!$this->getUserLayer()->isUser() || !$this->getUser()->hasPermission('bugs.admin')) { return $this->createAccessDeniedResponse(); } /** @var $em EntityManager */ $em = $this->getDoctrine()->getManager(); /** @var $bug Issue */ $bug = $em->createQueryBuilder()->select('i, u, a')->from('EtuModuleBugsBundle:Issue', 'i')->leftJoin('i.user', 'u')->leftJoin('i.assignee', 'a')->where('i.id = :id')->setParameter('id', $id)->setMaxResults(1)->getQuery()->getOneOrNullResult(); if (!$bug) { throw $this->createNotFoundException('Issue #' . $id . ' not found'); } if (StringManipulationExtension::slugify($bug->getTitle()) != $slug) { throw $this->createNotFoundException('Invalid slug'); } $bug->close(); $em->persist($bug); $comment = new Comment(); $comment->setIsStateUpdate(true); $comment->setIssue($bug); $comment->setUser($this->getUser()); $comment->setBody($this->get('translator')->trans('bugs.bugs_admin.close.message', array('%adminName%' => $this->getUser()->getFullName()))); $em->persist($comment); $em->flush(); // Send notifications to subscribers $notif = new Notification(); $notif->setModule($this->getCurrentBundle()->getIdentifier())->setHelper('bugs_closed')->setAuthorId($this->getUser()->getId())->setEntityType('issue')->setEntityId($bug->getId())->addEntity($bug); $this->getNotificationsSender()->send($notif); $this->get('session')->getFlashBag()->set('message', array('type' => 'success', 'message' => 'bugs.bugs_admin.close.success')); return $this->redirect($this->generateUrl('bugs_view', array('id' => $bug->getId(), 'slug' => StringManipulationExtension::slugify($bug->getTitle())))); }
/** * @param Covoit $covoit * @return Notification */ private function createNotification(Covoit $covoit) { $notif = new Notification(); $notif->setModule('covoit')->setHelper('covoit_alert')->setEntityType('covoit-alert')->addEntity($covoit); return $notif; }
/** * @Route("/{slug}-{name}/send-review", name="uvs_view_send_review") * @Template() */ public function sendReviewAction(Request $request, $slug, $name) { if (!$this->getUserLayer()->isUser()) { return $this->createAccessDeniedResponse(); } /** @var EntityManager $em */ $em = $this->getDoctrine()->getManager(); /** @var UV $uv */ $uv = $em->getRepository('EtuModuleUVBundle:UV')->findOneBy(array('slug' => $slug)); if (!$uv) { throw $this->createNotFoundException(sprintf('UV for slug %s not found', $slug)); } if (StringManipulationExtension::slugify($uv->getName()) != $name) { return $this->redirect($this->generateUrl('uvs_view_send_review', array('slug' => $uv->getSlug(), 'name' => StringManipulationExtension::slugify($uv->getName()))), 301); } $review = new Review(); $review->setUv($uv)->setSender($this->getUser())->setSemester(User::currentSemester()); $form = $this->createFormBuilder($review)->add('type', 'choice', array('choices' => Review::$types, 'required' => true))->add('semester', 'choice', array('choices' => Review::availableSemesters(), 'required' => true))->add('file', null, array('required' => true))->getForm(); if ($request->getMethod() == 'POST' && $form->submit($request)->isValid()) { $review->upload(); $em->persist($review); $em->flush(); // Notify subscribers $notif = new Notification(); $review->file = null; $notif->setModule($this->getCurrentBundle()->getIdentifier())->setHelper('uv_new_review')->setAuthorId($this->getUser()->getId())->setEntityType('uv')->setEntityId($uv->getId())->addEntity($review); $this->getNotificationsSender()->send($notif); // Add badges $count = $em->createQueryBuilder()->select('COUNT(r) as nb')->from('EtuModuleUVBundle:Review', 'r')->where('r.sender = :user')->setParameter('user', $this->getUser()->getId())->getQuery()->getSingleScalarResult(); $user = $this->getUser(); if ($count >= 1) { BadgesManager::userAddBadge($user, 'uvs_reviews', 1); } else { BadgesManager::userRemoveBadge($user, 'uvs_reviews', 1); } if ($count >= 2) { BadgesManager::userAddBadge($user, 'uvs_reviews', 2); } else { BadgesManager::userRemoveBadge($user, 'uvs_reviews', 2); } if ($count >= 4) { BadgesManager::userAddBadge($user, 'uvs_reviews', 3); } else { BadgesManager::userRemoveBadge($user, 'uvs_reviews', 3); } if ($count >= 10) { BadgesManager::userAddBadge($user, 'uvs_reviews', 4); } else { BadgesManager::userRemoveBadge($user, 'uvs_reviews', 4); } BadgesManager::userPersistBadges($user); $em->persist($user); $em->flush(); $this->get('session')->getFlashBag()->set('message', array('type' => 'success', 'message' => 'uvs.main.sendReview.confirm')); return $this->redirect($this->generateUrl('uvs_view', array('slug' => $slug, 'name' => $name))); } return array('uv' => $uv, 'form' => $form->createView()); }
/** * @Route( * "/user/membership/{login}/event/{id}-{slug}/delete/{confirm}", * defaults={"confirm"=false}, * name="memberships_orga_events_delete" * ) * @Template() */ public function deleteAction(Request $request, $login, $id, $slug, $confirm = false) { if (!$this->getUserLayer()->isUser()) { return $this->createAccessDeniedResponse(); } /** @var $em EntityManager */ $em = $this->getDoctrine()->getManager(); /** @var $memberships Member[] */ $memberships = $em->createQueryBuilder()->select('m, o')->from('EtuUserBundle:Member', 'm')->leftJoin('m.organization', 'o')->andWhere('m.user = :user')->setParameter('user', $this->getUser()->getId())->orderBy('m.role', 'DESC')->addOrderBy('o.name', 'ASC')->getQuery()->getResult(); $membership = null; foreach ($memberships as $m) { if ($m->getOrganization()->getLogin() == $login) { $membership = $m; break; } } if (!$membership) { throw $this->createNotFoundException('Membership or organization not found for login ' . $login); } if (!$membership->hasPermission('events')) { return $this->createAccessDeniedResponse(); } $orga = $membership->getOrganization(); /** @var $event Event */ $event = $em->createQueryBuilder()->select('e, o')->from('EtuModuleEventsBundle:Event', 'e')->leftJoin('e.orga', 'o')->where('e.uid = :id')->setParameter('id', $id)->setMaxResults(1)->getQuery()->getOneOrNullResult(); if (!$event) { throw $this->createNotFoundException('Event #' . $id . ' not found'); } if (StringManipulationExtension::slugify($event->getTitle()) != $slug) { return $this->redirect($this->generateUrl('events_view', array('id' => $id, 'slug' => StringManipulationExtension::slugify($event->getTitle()))), 301); } if ($event->getOrga()->getId() != $orga->getId()) { return $this->createAccessDeniedResponse(); } if ($confirm) { $entity = array('id' => $event->getId(), 'title' => $event->getTitle(), 'location' => $event->getLocation(), 'begin' => $event->getBegin(), 'end' => $event->getEnd(), 'orga' => array('id' => $event->getOrga()->getId(), 'name' => $event->getOrga()->getName())); // Send notifications to subscribers $notif = new Notification(); $notif->setModule($this->getCurrentBundle()->getIdentifier())->setHelper('event_deleted')->setAuthorId($this->getUser()->getId())->setEntityType('event')->setEntityId($event->getId())->addEntity($entity); $this->getNotificationsSender()->send($notif); $em->createQueryBuilder()->delete()->from('EtuModuleEventsBundle:Answer', 'a')->where('a.event = :id')->setParameter('id', $event->getId())->getQuery()->execute(); $em->remove($event); $em->flush(); // Confirmation $this->get('session')->getFlashBag()->set('message', array('type' => 'success', 'message' => 'events.memberships.delete.confirm')); return $this->redirect($this->generateUrl('memberships_orga_events', array('login' => $login))); } return array('memberships' => $memberships, 'membership' => $membership, 'orga' => $orga, 'event' => $event); }
/** * @Route("/create", name="bugs_create") * @Template() */ public function createAction() { if (!$this->getUserLayer()->isUser()) { return $this->createAccessDeniedResponse(); } if (!$this->getUser()->hasPermission('bugs.add')) { throw new AccessDeniedHttpException('Vous n\'avez pas la permission nécessaire pour signaler un problème.'); } $bug = new Issue(); $bug->setUser($this->getUser()); $form = $this->createFormBuilder($bug)->add('title')->add('criticality', 'choice', array('choices' => array(Issue::CRITICALITY_SECURITY => 'bugs.criticality.60', Issue::CRITICALITY_CRITICAL => 'bugs.criticality.50', Issue::CRITICALITY_MAJOR => 'bugs.criticality.40', Issue::CRITICALITY_MINOR => 'bugs.criticality.30', Issue::CRITICALITY_VISUAL => 'bugs.criticality.20', Issue::CRITICALITY_TYPO => 'bugs.criticality.10')))->add('body')->getForm(); $request = $this->getRequest(); if ($request->getMethod() == 'POST' && $form->bind($request)->isValid()) { /** @var $em EntityManager */ $em = $this->getDoctrine()->getManager(); $em->persist($bug); $em->flush(); // Send notifications to subscribers ("entityId = 0" mean all opened bugs) $notif = new Notification(); $notif->setModule($this->getCurrentBundle()->getIdentifier())->setHelper('bugs_new_opened')->setAuthorId($this->getUser()->getId())->setEntityType('issue')->setEntityId(0)->addEntity($bug); $this->getNotificationsSender()->send($notif); // Subscribe automatically the user at the issue $this->getSubscriptionsManager()->subscribe($this->getUser(), 'issue', $bug->getId()); $this->get('session')->getFlashBag()->set('message', array('type' => 'success', 'message' => 'bugs.bugs.create.confirm')); return $this->redirect($this->generateUrl('bugs_view', array('id' => $bug->getId(), 'slug' => StringManipulationExtension::slugify($bug->getTitle())))); } return array('form' => $form->createView()); }
/** * @Route("/{slug}-{id}", requirements={"slug"=".+"}, name="covoiturage_view") * @Template() */ public function viewAction(Request $request, $id, $slug) { if (!$this->getUserLayer()->isUser()) { return $this->createAccessDeniedResponse(); } /** @var EntityManager $em */ $em = $this->getDoctrine()->getManager(); /** @var Covoit $covoit */ $covoit = $em->createQueryBuilder()->select('c, cs, ca')->from('EtuModuleCovoitBundle:Covoit', 'c')->leftJoin('c.author', 'ca')->leftJoin('c.subscriptions', 'cs')->where('c.id = :id')->setParameter('id', $id)->getQuery()->getOneOrNullResult(); if (!$covoit) { throw $this->createNotFoundException('Covoit not found'); } // One URL to rule them all if ($slug != $covoit->getStartCity()->getSlug() . '-' . $covoit->getEndCity()->getSlug()) { return $this->redirect($this->generateUrl('covoiturage_view', ['id' => $covoit->getId(), 'slug' => $covoit->getStartCity()->getSlug() . '-' . $covoit->getEndCity()->getSlug()]), 301); } $message = new CovoitMessage(); $message->setAuthor($this->getUser()); $message->setCovoit($covoit); $messageForm = $this->createForm($this->get('etu.covoit.form.message'), $message); if ($request->getMethod() == 'POST' && $messageForm->submit($request)->isValid()) { $em->persist($message); $em->flush(); // Send notifications to subscribers $notif = new Notification(); $notif->setModule($this->getCurrentBundle()->getIdentifier())->setHelper('covoit_new_message')->setAuthorId($this->getUser()->getId())->setEntityType('covoit')->setEntityId($covoit->getId())->addEntity($message); $this->getNotificationsSender()->send($notif); // Add current user as subscriber $this->getSubscriptionsManager()->subscribe($this->getUser(), 'covoit', $covoit->getId()); $this->get('session')->getFlashBag()->set('message', array('type' => 'success', 'message' => 'covoit.messages.message_sent')); return $this->redirect($this->generateUrl('covoiturage_view', ['id' => $covoit->getId(), 'slug' => $covoit->getStartCity()->getSlug() . '-' . $covoit->getEndCity()->getSlug()])); } return ['covoit' => $covoit, 'messageForm' => $messageForm->createView()]; }