From dddeaedb2eb31bef0f115116eadec65536d2c028 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rapha=C3=ABl=20Gertz?= Date: Wed, 27 Nov 2019 02:09:43 +0100 Subject: [PATCH] Add new location controller Add location index template Add defulat policy template --- Controller/LocationController.php | 231 +++++++++++++++++++++++ Resources/views/default/policy.html.twig | 87 +++++++++ Resources/views/location/index.html.twig | 58 ++++++ 3 files changed, 376 insertions(+) create mode 100644 Controller/LocationController.php create mode 100644 Resources/views/default/policy.html.twig create mode 100644 Resources/views/location/index.html.twig diff --git a/Controller/LocationController.php b/Controller/LocationController.php new file mode 100644 index 0000000..e692ade --- /dev/null +++ b/Controller/LocationController.php @@ -0,0 +1,231 @@ +createForm('Rapsys\AirBundle\Form\ApplicationType', null, [ + // To set the action use $this->generateUrl('route_identifier') + 'action' => $this->generateUrl('rapsys_air_location'), + 'method' => 'POST', + 'attr' => [ 'class' => 'form_col' ] + ]); + return $this->render('@RapsysAir/location/index.html.twig', ['title' => $title, 'section' => $section, 'form' => $form->createView(), 'calendar' => $calendar]+$this->context); + } + + public function show(Request $request, $id) { + } + + public function toto(Request $request) { + //Prevent non-admin to access here + $this->denyAccessUnlessGranted('ROLE_GUEST', null, 'Unable to access this page without ROLE_GUEST!'); + + //Set section + $section = $this->translator->trans('Admin'); + + //Set title + $title = $section.' - '.$this->translator->trans($this->config['site']['title']); + + header('Content-Type: text/plain'); + var_dump('TODO'); + exit; + //Create the form according to the FormType created previously. + //And give the proper parameters + $form = $this->createForm('Rapsys\AirBundle\Form\ApplicationType', null, [ + // To set the action use $this->generateUrl('route_identifier') + 'action' => $this->generateUrl('rapsys_air_admin'), + 'method' => 'POST', + 'attr' => [ 'class' => 'form_col' ] + ]); + + //Get doctrine + $doctrine = $this->getDoctrine(); + + //Handle request + if ($request->isMethod('POST')) { + // Refill the fields in case the form is not valid. + $form->handleRequest($request); + + if ($form->isValid()) { + //Get data + $data = $form->getData(); + + //Get manager + $manager = $doctrine->getManager(); + + //Protect session fetching + try { + $session = $doctrine->getRepository(Session::class)->findOneByLocationSlotDate($data['location'], $data['slot'], $data['date']); + //Catch no session case + } catch (\Doctrine\ORM\NoResultException $e) { + //Create the session + $session = new Session(); + $session->setLocation($data['location']); + $session->setSlot($data['slot']); + $session->setDate($data['date']); + $session->setCreated(new \DateTime('now')); + $session->setUpdated(new \DateTime('now')); + $manager->persist($session); + //Flush to get the ids + #$manager->flush(); + } + + //Init application + $application = false; + + //Protect application fetching + try { + //TODO: handle admin case where we provide a user in extra + $application = $doctrine->getRepository(Application::class)->findOneBySessionUser($session, $this->getUser()); + + //Add error message to mail field + $form->get('slot')->addError(new FormError($this->translator->trans('Application already exists'))); + //Catch no application cases + //XXX: combine these catch when php 7.1 is available + } catch (\Doctrine\ORM\NoResultException $e) { + //Catch invalid argument because session is not already persisted + } catch(\Doctrine\ORM\ORMInvalidArgumentException $e) { + } + + //Create new application if none found + if (!$application) { + //Create the application + $application = new Application(); + $application->setSession($session); + //TODO: handle admin case where we provide a user in extra + $application->setUser($this->getUser()); + $application->setCreated(new \DateTime('now')); + $application->setUpdated(new \DateTime('now')); + $manager->persist($application); + + //Flush to get the ids + $manager->flush(); + + //Add notice in flash message + $this->addFlash('notice', $this->translator->trans('Application request the %date% for %location% on the slot %slot% saved', ['%location%' => $data['location']->getTitle(), '%slot%' => $data['slot']->getTitle(), '%date%' => $data['date']->format('Y-m-d')])); + + //Redirect to cleanup the form + return $this->redirectToRoute('rapsys_air_admin'); + } + } + } + + //Compute period + $period = new \DatePeriod( + //Start from first monday of week + new \DateTime('Monday this week'), + //Iterate on each day + new \DateInterval('P1D'), + //End with next sunday and 4 weeks + new \DateTime('Monday this week + 5 week') + ); + + //Fetch sessions + $sessions = $doctrine->getRepository(Session::class)->findByDatePeriod($period); + + //Init calendar + $calendar = []; + + //Init month + $month = null; + + //Iterate on each day + foreach($period as $date) { + //Init day in calendar + $calendar[$Ymd = $date->format('Ymd')] = [ + 'title' => $date->format('d'), + 'class' => [], + 'sessions' => [] + ]; + //Append month for first day of month + if ($month != $date->format('m')) { + $month = $date->format('m'); + $calendar[$Ymd]['title'] .= '/'.$month; + } + //Deal with today + if ($date->format('U') == ($today = strtotime('today'))) { + $calendar[$Ymd]['title'] .= '/'.$month; + $calendar[$Ymd]['current'] = true; + $calendar[$Ymd]['class'][] = 'current'; + } + //Disable passed days + if ($date->format('U') < $today) { + $calendar[$Ymd]['disabled'] = true; + $calendar[$Ymd]['class'][] = 'disabled'; + } + //Set next month days + if ($date->format('m') > date('m')) { + $calendar[$Ymd]['next'] = true; + $calendar[$Ymd]['class'][] = 'next'; + } + //Iterate on each session to find the one of the day + foreach($sessions as $session) { + if (($sessionYmd = $session->getDate()->format('Ymd')) == $Ymd) { + //Count number of application + $count = count($session->getApplications()); + + //Compute classes + $class = []; + if ($session->getApplication()) { + $class[] = 'granted'; + } elseif ($count == 0) { + $class[] = 'orphaned'; + } elseif ($count > 1) { + $class[] = 'disputed'; + } else { + $class[] = 'pending'; + } + + //Add the session + $calendar[$Ymd]['sessions'][$session->getSlot()->getId().$session->getLocation()->getId()] = [ + 'id' => $session->getId(), + 'title' => ($count > 1?'['.$count.'] ':'').$session->getSlot()->getTitle().' '.$session->getLocation()->getTitle(), + 'class' => $class + ]; + } + } + + //Sort sessions + ksort($calendar[$Ymd]['sessions']); + } + + return $this->render('@RapsysAir/admin/index.html.twig', ['title' => $title, 'section' => $section, 'form' => $form->createView(), 'calendar' => $calendar]); + } + + public function tata(Request $request, $id) { + /*header('Content-Type: text/plain'); + var_dump($calendar); + exit;*/ + + //Set section + $section = $this->translator->trans('Session %id%', ['%id%' => $id]); + + //Set title + $title = $section.' - '.$this->translator->trans($this->config['site']['title']); + + //Create the form according to the FormType created previously. + //And give the proper parameters + /*$form = $this->createForm('Rapsys\AirBundle\Form\ApplicationType', null, [ + // To set the action use $this->generateUrl('route_identifier') + 'action' => $this->generateUrl('rapsys_air_admin'), + 'method' => 'POST', + 'attr' => [ 'class' => 'form_col' ] + ]);*/ + + //Get doctrine + $doctrine = $this->getDoctrine(); + + //Fetch session + $session = $doctrine->getRepository(Session::class)->findOneById($id); + + return $this->render('@RapsysAir/admin/session.html.twig', ['title' => $title, 'section' => $section, /*'form' => $form->createView(),*/ 'session' => $session]); + } +} diff --git a/Resources/views/default/policy.html.twig b/Resources/views/default/policy.html.twig new file mode 100644 index 0000000..0f3c3bc --- /dev/null +++ b/Resources/views/default/policy.html.twig @@ -0,0 +1,87 @@ +{% extends '@RapsysAir/body.html.twig' %} +{% block content %} +
+

{{ section }}

+
+

Guest

+
+

Prerequisite

+
+
Who
+
Anyone
+
+
+
Residence
+
Anywhere +
+
+
Skill
+
Basic tango ballroom organisation
+
Basic tango music programming
+
Basic french communication
+
+
+
+

Hardware

+
+
Music
+
+
+

+ Matériel à prévoir : + - Une sono de 200W (Ibiza 8) ou suppérieure + - Un lecteur avec 4h d'autonomie (téléphone/baladeur) + - Câble + - Flacon de talc + - Corde + - Balais selon le lieu + + Préparation à remplir : + - Une liste de lecture de 4h déconnectée + - Assister un dj pour une soirée sur place + - Répétition générale à la maison + + Les limitations : + - première soirée sur low spot en semaine + - représentation unique à Opéra en semaine +

+
+
+
+

Regular

+

+ Les conditions à remplir : + - Une sono de 250W (Ibiza 10) ou suppérieure + - Un lecteur avec 6h d'autonomie (téléphone/baladeur) + - Câble + - Flacon de talc + - Corde avec fanions + - Balais + + Préparation à remplir : + - Une liste de lecture de 6h déconnectée + - Un renouvellement une fois par mois de la liste de lecture + - Avoir assisté un dj pour une soirée sur place + - Avoir fait une répétition générale à la maison + + Les limitations : + - première soirée sur low spot + - représentation à Opéra en semaine +

+
+
+

Senior

+

+ + - Une playlist hors ligne (mise à jour tous les mois) + - Un système de lecture de musique ( + - Une sono de 200W (Ibiza 8) ou suppérieure + + Les limitations : + - répétition sur un low spot préalable + - représentation unique à Opéra +

+
+

{{ 'Welcome to the outdoor space reservation system'|trans }}

+
+{% endblock %} diff --git a/Resources/views/location/index.html.twig b/Resources/views/location/index.html.twig new file mode 100644 index 0000000..5863c76 --- /dev/null +++ b/Resources/views/location/index.html.twig @@ -0,0 +1,58 @@ +{% extends '@RapsysAir/body.html.twig' %} +{% block content %} +
+TODO: +

{% trans %}Dashboard{% endtrans %}

+
+ {% if calendar is defined and calendar %} + + + + {% for date, day in calendar %} + + {% if loop.index % 7 == 0 and not loop.last %} + + + {% endif %} + {% endfor %} + + +
+

{{ day.title }}

+ {% if day.sessions is not empty %} + + {% endif %} +
+ {% endif %} +
+ {{ form_start(form) }} + +
{{ form_errors(form) }}
+ +
+ {{ form_row(form.location) }} + + {{ form_row(form.date) }} + + {{ form_row(form.slot) }} +
+ + {{ form_row(form.submit) }} + + {# Render CSRF token etc .#} + + + {{ form_end(form) }} +
+
+ {# dump(calendar) #} +
+{% endblock %} -- 2.41.0