function testBasic()
 {
     global $CONFIG;
     \TimeSource::mock(2013, 10, 1, 1, 1, 1);
     $CONFIG->importURLAllowEventsSecondsIntoFuture = 7776000;
     // 90 days
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     $group = new GroupModel();
     $group->setTitle("test");
     $group->setDescription("test test");
     $group->setUrl("http://www.group.com");
     $groupRepo = new GroupRepository();
     $groupRepo->create($group, $site, $user);
     $importURLRepository = new ImportURLRepository();
     $importURL = new ImportURLModel();
     $importURL->setIsEnabled(true);
     $importURL->setSiteId($site->getId());
     $importURL->setGroupId($group->getId());
     $importURL->setTitle("Test");
     $importURL->setUrl("http://test.com");
     $importURLRepository->create($importURL, $site, $user);
     // Import
     $importURLRun = new ImportURLRun($importURL, $site);
     $importURLRun->setTemporaryFileStorageForTesting(dirname(__FILE__) . '/data/Lanyrd1.ical');
     $importURLRun->setFlag(ImportURLRun::$FLAG_ADD_UIDS);
     $i = new ImportURLICalHandler();
     $i->setImportURLRun($importURLRun);
     $this->assertTrue($i->canHandle());
     $r = $i->handle();
     // Load!
     $erb = new EventRepositoryBuilder();
     $erb->setSite($site);
     $events = $erb->fetchAll();
     $this->assertEquals(1, count($events));
     $event = $events[0];
     $this->assertEquals("State of the Map Scotland 2013", $event->getSummary());
     $this->assertEquals('2013-10-11 00:00:00', $event->getStartAt()->format('Y-m-d H:i:s'));
     $this->assertEquals('2013-10-14 23:59:59', $event->getEndAt()->format('Y-m-d H:i:s'));
     $this->assertEquals("http://sotms.eventbrite.com/\n\nhttp://lanyrd.com/crkmt", $event->getDescription());
     $this->assertEquals('http://lanyrd.com/2013/sotmscot2013/', $event->getURL());
     $this->assertFalse($event->getIsDeleted());
     // Look for event
     $erb = new EventRepositoryBuilder();
     $erb->setSite($site);
     $erb->setImportURL($importURL);
     $this->assertEquals(1, count($erb->fetchAll()));
 }
 function index($username, Request $request, Application $app)
 {
     if (!$this->build($username, $request, $app)) {
         $app->abort(404, "User does not exist.");
     }
     $erb = new EventRepositoryBuilder();
     $erb->setAfterNow();
     $erb->setUserAccount($this->parameters['user'], false, false, true, false);
     $this->parameters['events'] = $erb->fetchAll();
     return $app['twig']->render('index/publicuser/index.html.twig', $this->parameters);
 }
 function testBasic()
 {
     global $CONFIG;
     \TimeSource::mock(2013, 10, 1, 1, 1, 1);
     $CONFIG->importURLAllowEventsSecondsIntoFuture = 7776000;
     // 90 days
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     $group = new GroupModel();
     $group->setTitle("test");
     $group->setDescription("test test");
     $group->setUrl("http://www.group.com");
     $groupRepo = new GroupRepository();
     $groupRepo->create($group, $site, $user);
     $importURLRepository = new ImportURLRepository();
     $importURL = new ImportURLModel();
     $importURL->setIsEnabled(true);
     $importURL->setSiteId($site->getId());
     $importURL->setGroupId($group->getId());
     $importURL->setTitle("Test");
     $importURL->setUrl("http://test.com");
     $importURLRepository->create($importURL, $site, $user);
     // Import
     $importURLRun = new ImportURLRun($importURL, $site);
     $importURLRun->setTemporaryFileStorageForTesting(dirname(__FILE__) . '/data/Eventbrite1.ical');
     $importURLRun->setFlag(ImportURLRun::$FLAG_ADD_UIDS);
     $importURLRun->setFlag(ImportURLRun::$FLAG_SET_TICKET_URL_AS_URL);
     $i = new ImportURLICalHandler();
     $i->setImportURLRun($importURLRun);
     $this->assertTrue($i->canHandle());
     $r = $i->handle();
     // Load!
     $erb = new EventRepositoryBuilder();
     $erb->setSite($site);
     $events = $erb->fetchAll();
     $this->assertEquals(1, count($events));
     $event = $events[0];
     $this->assertEquals("Computing At School Scotland Conference 2013", $event->getSummary());
     $this->assertEquals('2013-10-26 07:30:00', $event->getStartAt()->format('Y-m-d H:i:s'));
     $this->assertEquals('2013-10-26 16:00:00', $event->getEndAt()->format('Y-m-d H:i:s'));
     $this->assertEquals('For details, click here: https://casscot13.eventbrite.co.uk', $event->getDescription());
     $this->assertEquals('https://casscot13.eventbrite.co.uk', $event->getURL());
     $this->assertEquals('https://casscot13.eventbrite.co.uk', $event->getTicketURL());
     $this->assertFalse($event->getIsDeleted());
 }
 public function listJson(Request $request, Application $app)
 {
     $erb = new EventRepositoryBuilder();
     $erb->setSite($app['currentSite']);
     $ourRequest = new \Request($request);
     $erb->setIncludeDeleted($ourRequest->getGetOrPostBoolean('include_deleted', false));
     $out = array('events' => array());
     foreach ($erb->fetchAll() as $event) {
         $out['events'][] = array('slug' => $event->getSlug(), 'slugForURL' => $event->getSlugForUrl(), 'summary' => $event->getSummary(), 'summaryDisplay' => $event->getSummaryDisplay());
     }
     return json_encode($out);
 }
 function testBasic()
 {
     global $CONFIG;
     \TimeSource::mock(2013, 10, 1, 1, 1, 1);
     $CONFIG->importURLAllowEventsSecondsIntoFuture = 7776000;
     // 90 days
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     $group = new GroupModel();
     $group->setTitle("test");
     $group->setDescription("test test");
     $group->setUrl("http://www.group.com");
     $groupRepo = new GroupRepository();
     $groupRepo->create($group, $site, $user);
     $importURLRepository = new ImportURLRepository();
     $importURL = new ImportURLModel();
     $importURL->setIsEnabled(true);
     $importURL->setSiteId($site->getId());
     $importURL->setGroupId($group->getId());
     $importURL->setTitle("Test");
     $importURL->setUrl("http://test.com");
     $importURLRepository->create($importURL, $site, $user);
     // Import
     $importURLRun = new ImportURLRun($importURL, $site);
     $importURLRun->setTemporaryFileStorageForTesting(dirname(__FILE__) . '/data/Meetup1.ics');
     $importURLRun->setFlag(ImportURLRun::$FLAG_ADD_UIDS);
     $i = new ImportURLICalHandler();
     $i->setImportURLRun($importURLRun);
     $this->assertTrue($i->canHandle());
     $r = $i->handle();
     // Load!
     $erb = new EventRepositoryBuilder();
     $erb->setSite($site);
     $events = $erb->fetchAll();
     $this->assertEquals(1, count($events));
     $event = $events[0];
     $this->assertEquals("Talk & Build AngularJS", $event->getSummary());
     $this->assertEquals('2013-10-17 18:00:00', $event->getStartAt()->format('Y-m-d H:i:s'));
     $this->assertEquals('2013-10-17 21:00:00', $event->getEndAt()->format('Y-m-d H:i:s'));
     $this->assertEquals("AngularJS - Edinburgh\nThursday, October 17 at 7:00 PM\n\nDetails: http://www.meetup.com/AngularJS-Edinburgh/events/141654792/", $event->getDescription());
     $this->assertEquals('http://www.meetup.com/AngularJS-Edinburgh/events/141654792/', $event->getURL());
     $this->assertFalse($event->getIsDeleted());
 }
 function index($siteid, Request $request, Application $app)
 {
     $sr = new SiteRepository();
     $site = $sr->loadById($siteid);
     if (!$site) {
         die("404");
     }
     $erb = new EventRepositoryBuilder();
     $erb->setSite($site);
     $erb->setOrderByStartAt(true);
     $events = $erb->fetchAll();
     return $app['twig']->render('sysadmin/eventlist/index.html.twig', array('site' => $site, 'events' => $events));
 }
 function testEventsVanish()
 {
     ## User, Site, Event
     \TimeSource::mock(2014, 1, 1, 1, 2, 3);
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     $event = new EventModel();
     $event->setSummary("test");
     $event->setDescription("test test");
     $event->setStartAt(getUTCDateTime(2014, 5, 10, 19, 0, 0, 'Europe/London'));
     $event->setEndAt(getUTCDateTime(2014, 5, 10, 21, 0, 0, 'Europe/London'));
     $event->setUrl("http://www.info.com");
     $event->setTicketUrl("http://www.tickets.com");
     $eventRepository = new EventRepository();
     $eventRepository->create($event, $site, $user);
     ## Event can be found
     $erb = new EventRepositoryBuilder();
     $erb->setIncludeEventsFromClosedSites(true);
     $erb->fetchAll();
     $this->assertEquals(1, count($erb->fetchAll()));
     $erb = new EventRepositoryBuilder();
     $erb->setIncludeEventsFromClosedSites(false);
     $erb->fetchAll();
     $this->assertEquals(1, count($erb->fetchAll()));
     ## Close Site
     \TimeSource::mock(2014, 2, 1, 1, 2, 3);
     $site->setIsClosedBySysAdmin(true);
     $site->setClosedBySysAdminreason('Testing');
     $siteRepo->edit($site, $user);
     ## Event can not be found
     $erb = new EventRepositoryBuilder();
     $erb->setIncludeEventsFromClosedSites(true);
     $erb->fetchAll();
     $this->assertEquals(1, count($erb->fetchAll()));
     $erb = new EventRepositoryBuilder();
     $erb->setIncludeEventsFromClosedSites(false);
     $erb->fetchAll();
     $this->assertEquals(0, count($erb->fetchAll()));
 }
 function index(Application $app)
 {
     $erb = new EventRepositoryBuilder();
     $erb->setSite($app['currentSite']);
     $erb->setAfterNow();
     $erb->setIncludeDeleted(false);
     $erb->setIncludeAreaInformation(true);
     $erb->setIncludeVenueInformation(true);
     $erb->setIncludeMediasSlugs(true);
     if ($app['currentUser']) {
         $erb->setUserAccount($app['currentUser'], true);
     }
     $erb->setLimit(100);
     $events = $erb->fetchAll();
     return $app['twig']->render('site/index/index.html.twig', array('events' => $events));
 }
 protected function buildData()
 {
     // ############# Build Array of dates
     $this->eventsDataByDay = array();
     //print "START ".$this->start->format('Y-m-d H:i:s')."<br>";
     //print "END ".$this->start->format('Y-m-d H:i:s')."<br>";
     $now = new \DateTime($this->start->format('Y-m-d H:i:s'), new \DateTimeZone('UTC'));
     $now->setTime(23, 59, 59);
     $this->eventsDataByDay[] = $this->getTemplateForDaysData($now, true);
     $oneDay = new \DateInterval('P1D');
     while ($now->getTimestamp() < $this->end->getTimestamp()) {
         $now->add($oneDay);
         $this->eventsDataByDay[] = $this->getTemplateForDaysData($now);
     }
     // ############# Get events
     $this->eventRepositoryBuilder->setAfter($this->start);
     $this->eventRepositoryBuilder->setBefore($this->end);
     $this->events = $this->eventRepositoryBuilder->fetchAll();
     foreach ($this->events as $event) {
         foreach ($this->eventsDataByDay as $k => $data) {
             $startAt = $event->getStartAt()->getTimestamp();
             if ($data['startTimestamp'] <= $startAt && $startAt <= $data['endTimestamp']) {
                 $this->eventsDataByDay[$k]['events'][] = $event;
             } else {
                 if ($startAt < $data['startTimestamp'] && $event->getEndAt()->getTimestamp() > $data['startTimestamp']) {
                     $this->eventsDataByDay[$k]['eventsContinuing'][] = $event;
                 }
             }
         }
     }
 }
 function testSummerTime()
 {
     TimeSource::mock(2014, 5, 1, 7, 0, 0);
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     $event = new EventModel();
     $event->setSummary("test");
     $event->setDescription("test test");
     $event->setStartAt($this->mktime(2014, 5, 10, 19, 0, 0, 'Europe/London'));
     $event->setEndAt($this->mktime(2014, 5, 10, 21, 0, 0, 'Europe/London'));
     $event->setUrl("http://www.info.com");
     $event->setTicketUrl("http://www.tickets.com");
     $eventRepository = new EventRepository();
     $eventRepository->create($event, $site, $user);
     $event = $eventRepository->loadBySlug($site, $event->getSlug());
     $this->assertEquals("test test", $event->getDescription());
     $this->assertEquals("test", $event->getSummary());
     $this->assertEquals("http://www.info.com", $event->getUrl());
     $this->assertEquals("http://www.tickets.com", $event->getTicketUrl());
     $startAtShouldBe = $this->mktime(2014, 5, 10, 18, 0, 0, 'UTC');
     // Not summer time so London is +1 UTC!
     $startAtIs = clone $event->getStartAt();
     $startAtIs->setTimezone(new \DateTimeZone('UTC'));
     $this->assertEquals($startAtShouldBe->format("c"), $startAtIs->format("c"));
     $erb = new EventRepositoryBuilder();
     $erb->setFreeTextsearch('cat');
     $this->assertEquals(0, count($erb->fetchAll()));
     $erb = new EventRepositoryBuilder();
     $erb->setFreeTextsearch('test');
     $this->assertEquals(1, count($erb->fetchAll()));
 }
 function getPossibleDuplicates()
 {
     /**
      * If no Start or End time on event then we aren't even going to try to look for dupes.
      * There would be to many options and not enought to search on.
      */
     if (!$this->event->getStartAt() || !$this->event->getEndAt()) {
         return array();
     }
     ## Get events
     $eventRepositoryBuilder = new EventRepositoryBuilder();
     $eventRepositoryBuilder->setSite($this->site);
     $eventRepositoryBuilder->setIncludeAreaInformation(true);
     $eventRepositoryBuilder->setIncludeDeleted(true);
     $eventRepositoryBuilder->setIncludeCancelled(true);
     $after = clone $this->event->getStartAt();
     $after->sub(new \DateInterval("PT4H"));
     $eventRepositoryBuilder->setAfter($after);
     $before = clone $this->event->getStartAt();
     $before->add(new \DateInterval("PT4H"));
     $eventRepositoryBuilder->setBefore($before);
     $events = $eventRepositoryBuilder->fetchAll();
     ## Score
     $eventsWithScore = array();
     foreach ($events as $event) {
         if (!in_array($event->getSlug(), $this->notTheseSlugs)) {
             $eventsWithScore[] = array('event' => $event, 'score' => $this->getScoreForConsideredEvent($event));
         }
     }
     ## sort
     $sortFunc = function ($a, $b) {
         if ($a['score'] == $b['score']) {
             return 0;
         } elseif ($a['score'] > $b['score']) {
             return 1;
         } elseif ($a['score'] < $b['score']) {
             return -1;
         }
     };
     usort($eventsWithScore, $sortFunc);
     ## Results
     $results = array();
     foreach ($eventsWithScore as $eventWithScore) {
         if (count($results) < $this->showEventsCount && $eventWithScore['score'] >= $this->showEventsThreshhold) {
             $results[] = $eventWithScore['event'];
         }
     }
     return $results;
 }
 protected function build()
 {
     parent::build();
     if ($this->human) {
         $this->joins[] = "  JOIN event_has_human ON event_has_human.event_id = event_information.id AND  event_has_human.human_id = :human_id AND event_has_human.removed_at IS NULL";
         $this->params['human_id'] = $this->human->getId();
     } else {
         if ($this->includeNoHumansOnly) {
             $this->joins[] = "  LEFT JOIN event_has_human ON event_has_human.event_id = event_information.id AND event_has_human.removed_at IS NULL";
             $this->where[] = "   event_has_human.added_at IS NULL ";
         }
     }
 }
 function getDataJson(Application $app)
 {
     $steps = 120;
     $venueRepo = new VenueRepository();
     $data = array('data' => array());
     if ($_POST['speed'] == '3600') {
         $interval = new \DateInterval("PT1H");
     } else {
         if ($_POST['speed'] == '21600') {
             $interval = new \DateInterval("PT6H");
         } else {
             $interval = new \DateInterval("PT1M");
         }
     }
     $start = new \DateTime("", new \DateTimeZone($app['currentTimeZone']));
     $start->setDate($_POST['year'], $_POST['month'], $_POST['day']);
     $start->setTime($_POST['hour'], $_POST['min'], 0);
     $time = clone $start;
     $end = clone $start;
     for ($i = 1; $i <= $steps; $i++) {
         $end->add($interval);
     }
     $erb = new EventRepositoryBuilder();
     $erb->setSite($app['currentSite']);
     $erb->setAfter($start);
     $erb->setBefore($end);
     $erb->setIncludeDeleted(false);
     $erb->setMustHaveLatLng(true);
     $events = $erb->fetchAll();
     $eventsStatus = array();
     for ($i = 1; $i <= $steps; $i++) {
         $thisData = array('year' => $time->format('Y'), 'month' => $time->format('n'), 'day' => $time->format('j'), 'hour' => $time->format('H'), 'min' => $time->format('i'), 'events' => array(), 'eventsContinuing' => array());
         foreach ($events as $event) {
             if (!isset($eventsStatus[$event->getId()])) {
                 if ($event->getStartAt()->getTimestamp() < $time->getTimestamp()) {
                     $eventsStatus[$event->getId()] = true;
                     $thisData['events'][$event->getSlug()] = array('slug' => $event->getSlug(), 'venue_slug' => $event->getVenue()->getSlug(), 'venue_lat' => $event->getVenue()->getLat(), 'venue_lng' => $event->getVenue()->getLng(), 'venue_title' => $event->getVenue()->getTitle(), 'event_title' => $event->getSummaryDisplay());
                 }
             } else {
                 if ($event->getEndAt()->getTimestamp() >= $time->getTimestamp()) {
                     $thisData['eventsContinuing'][$event->getSlug()] = true;
                 }
             }
         }
         $data['data'][] = $thisData;
         $time->add($interval);
     }
     $response = new Response(json_encode($data));
     $response->headers->set('Content-Type', 'application/json');
     return $response;
 }
 public function pastEventsCount($data)
 {
     $erb = new EventRepositoryBuilder();
     $erb->setBeforeNow();
     $erb->setIncludeCancelled(true);
     $erb->setIncludeDeleted(false);
     if ($data instanceof \models\AreaModel) {
         $erb->setArea($data);
     }
     return $erb->fetchCount();
 }
 function testUserWatchingParentAreaWithVenue()
 {
     TimeSource::mock(2014, 01, 01, 9, 0, 0);
     $this->addCountriesToTestDB();
     $countryRepo = new CountryRepository();
     $areaRepo = new AreaRepository();
     $userRepo = new UserAccountRepository();
     $siteRepo = new SiteRepository();
     $venueRepo = new \repositories\VenueRepository();
     $eventRepository = new EventRepository();
     $userWatchesAreaRepo = new \repositories\UserWatchesAreaRepository();
     $GB = $countryRepo->loadByTwoCharCode("GB");
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo->create($user);
     $userWatchesMain = new UserAccountModel();
     $userWatchesMain->setEmail("*****@*****.**");
     $userWatchesMain->setUsername("test1");
     $userWatchesMain->setPassword("password1");
     $userRepo->create($userWatchesMain);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo->create($site, $user, array($countryRepo->loadByTwoCharCode('GB')), $this->getSiteQuotaUsedForTesting());
     $area = new AreaModel();
     $area->setTitle("Scotland");
     $areaRepo->create($area, null, $site, $GB);
     $areaChild = new AreaModel();
     $areaChild->setTitle("Edinburgh");
     $areaRepo->create($areaChild, $area, $site, $GB);
     $venue = new \models\VenueModel();
     $venue->setTitle("Castle");
     $venue->setAreaId($areaChild->getId());
     $venueRepo->create($venue, $site, $user);
     $event = new EventModel();
     $event->setSummary("test");
     $event->setDescription("test test");
     $event->setStartAt(getUTCDateTime(2014, 11, 10, 19, 0, 0));
     $event->setEndAt(getUTCDateTime(2014, 11, 10, 21, 0, 0));
     $eventRepository->create($event, $site, $user);
     $event->setVenueId($venue->getId());
     TimeSource::mock(2014, 01, 01, 9, 1, 0);
     $eventRepository->edit($event);
     // have to update child cache
     $areaRepo->buildCacheAreaHasParent($area);
     $areaRepo->buildCacheAreaHasParent($areaChild);
     // test before
     $erb = new EventRepositoryBuilder();
     $erb->setUserAccount($userWatchesMain, false, true, true, true);
     $events = $erb->fetchAll();
     $this->assertEquals(0, count($events));
     $erb = new EventRepositoryBuilder();
     $erb->setUserAccount($userWatchesMain, false, true, true, false);
     $events = $erb->fetchAll();
     $this->assertEquals(0, count($events));
     // test watching main group gets event
     $userWatchesAreaRepo->startUserWatchingArea($userWatchesMain, $area);
     $erb = new EventRepositoryBuilder();
     $erb->setUserAccount($userWatchesMain, false, true, true, true);
     $events = $erb->fetchAll();
     $this->assertEquals(1, count($events));
     $erb = new EventRepositoryBuilder();
     $erb->setUserAccount($userWatchesMain, false, true, true, false);
     $events = $erb->fetchAll();
     $this->assertEquals(0, count($events));
 }
 function testFreeTextSearch()
 {
     TimeSource::mock(2014, 5, 1, 7, 0, 0);
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     $event = new EventModel();
     $event->setSummary("test");
     $event->setDescription("test test");
     $event->setStartAt(getUTCDateTime(2014, 5, 10, 19, 0, 0, 'Europe/London'));
     $event->setEndAt(getUTCDateTime(2014, 5, 10, 21, 0, 0, 'Europe/London'));
     $event->setUrl("http://www.info.com");
     $event->setTicketUrl("http://www.tickets.com");
     $eventRepository = new EventRepository();
     $eventRepository->create($event, $site, $user);
     ///////////// Test No Search
     $erb = new EventRepositoryBuilder();
     $this->assertEquals(1, count($erb->fetchAll()));
     $erb = new EventRepositoryBuilder();
     $this->assertEquals(1, $erb->fetchCount());
     ///////////// Test Search Pass
     $erb = new EventRepositoryBuilder();
     $erb->setFreeTextsearch("test");
     $this->assertEquals(1, count($erb->fetchAll()));
     $erb = new EventRepositoryBuilder();
     $erb->setFreeTextsearch("test");
     $this->assertEquals(1, $erb->fetchCount());
     ///////////// Test Search Fail
     $erb = new EventRepositoryBuilder();
     $erb->setFreeTextsearch("eodueoth dlhtunkn ethh5f 8l79,35dheutn");
     $this->assertEquals(0, count($erb->fetchAll()));
     $erb = new EventRepositoryBuilder();
     $erb->setFreeTextsearch("eodueoth dlhtunkn ethh5f 8l79,35dheutn");
     $this->assertEquals(0, $erb->fetchCount());
 }
 function testLimits()
 {
     global $CONFIG;
     \TimeSource::mock(2012, 9, 1, 1, 1, 1);
     $CONFIG->importURLAllowEventsSecondsIntoFuture = 77760000;
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     $group = new GroupModel();
     $group->setTitle("test");
     $group->setDescription("test test");
     $group->setUrl("http://www.group.com");
     $groupRepo = new GroupRepository();
     $groupRepo->create($group, $site, $user);
     $importURLRepository = new ImportURLRepository();
     $importURL = new ImportURLModel();
     $importURL->setIsEnabled(true);
     $importURL->setSiteId($site->getId());
     $importURL->setGroupId($group->getId());
     $importURL->setTitle("Test");
     $importURL->setUrl("http://test.com");
     $importURLRepository->create($importURL, $site, $user);
     // Import
     $importURLRun = new ImportURLRun($importURL, $site);
     $importURLRun->setTemporaryFileStorageForTesting(dirname(__FILE__) . '/data/ICALManyEvents.ical');
     $i = new ImportURLICalHandler();
     $i->setImportURLRun($importURLRun);
     $i->setLimitToSaveOnEachRun(2);
     $this->assertTrue($i->canHandle());
     $r = $i->handle();
     // Load!
     $erb = new EventRepositoryBuilder();
     $erb->setSite($site);
     $events = $erb->fetchAll();
     $this->assertEquals(2, count($events));
 }
 /**
  * 
  * @return type array(array(), array(), array(), boolean) - upcoming events, other events, user at event data, flag if any to send
  */
 public function getDataForUpcomingEventsEmail()
 {
     $flag = false;
     $start = \TimeSource::getDateTime();
     $end = \TimeSource::getDateTime();
     if ($this->email_upcoming_events_days_notice > 0) {
         $interval = new \DateInterval("P" . $this->email_upcoming_events_days_notice . "D");
         $start->add($interval);
         $end->add($interval);
     }
     $start->setTime(0, 0, 0);
     $end->setTime(23, 59, 59);
     $upcomingEvents = array();
     $allEvents = array();
     $userAtEvent = array();
     $userAtEventRepo = new UserAtEventRepository();
     $erb = new EventRepositoryBuilder();
     $erb->setAfterNow();
     $erb->setIncludeDeleted(false);
     $erb->setIncludeCancelled(true);
     $erb->setUserAccount($this, false, true);
     foreach ($erb->fetchAll() as $event) {
         $userAtEvent[$event->getId()] = $userAtEventRepo->loadByUserAndEvent($this, $event);
         if ($start->getTimestamp() <= $event->getStartAt()->getTimestamp() && $event->getStartAt()->getTimestamp() <= $end->getTimestamp()) {
             $upcomingEvents[] = $event;
             if ($this->email_upcoming_events == 'w') {
                 $flag = true;
             } else {
                 if ($this->email_upcoming_events == 'a') {
                     if ($userAtEvent[$event->getId()] && $userAtEvent[$event->getId()]->getIsPlanAttending()) {
                         $flag = true;
                     }
                 } else {
                     if ($this->email_upcoming_events == 'm') {
                         if ($userAtEvent[$event->getId()] && ($userAtEvent[$event->getId()]->getIsPlanAttending() || $userAtEvent[$event->getId()]->getIsPlanMaybeAttending())) {
                             $flag = true;
                         }
                     }
                 }
             }
         }
         $allEvents[] = $event;
     }
     return array($upcomingEvents, $allEvents, $userAtEvent, $flag);
 }
 function testRRuleDeleteByExDate1()
 {
     global $CONFIG;
     \TimeSource::mock(2015, 1, 1, 1, 1, 1);
     $CONFIG->importURLAllowEventsSecondsIntoFuture = 77760000;
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     $group = new GroupModel();
     $group->setTitle("test");
     $group->setDescription("test test");
     $group->setUrl("http://www.group.com");
     $groupRepo = new GroupRepository();
     $groupRepo->create($group, $site, $user);
     $importURLRepository = new ImportURLRepository();
     $importURL = new ImportURLModel();
     $importURL->setIsEnabled(true);
     $importURL->setSiteId($site->getId());
     $importURL->setGroupId($group->getId());
     $importURL->setTitle("Test");
     $importURL->setUrl("http://test.com");
     $importURLRepository->create($importURL, $site, $user);
     // ============================================= Import CREATE
     $importURLRun = new ImportURLRun($importURL, $site);
     $importURLRun->setTemporaryFileStorageForTesting(dirname(__FILE__) . '/data/ImportRRuleDeleteByExDate1Part1.ics');
     $i = new ImportURLICalHandler();
     $i->setImportURLRun($importURLRun);
     $i->setLimitToSaveOnEachRun(7);
     $this->assertTrue($i->canHandle());
     $r = $i->handle();
     // Is it loaded on Imported Events?
     $ierb = new \repositories\builders\ImportedEventRepositoryBuilder();
     $importedEvents = $ierb->fetchAll();
     $this->assertEquals(1, count($importedEvents));
     $importedEvent = $importedEvents[0];
     $reoccur = $importedEvent->getReoccur();
     $this->assertEquals(true, is_array($reoccur));
     $this->assertEquals(true, isset($reoccur['ical_rrule']));
     $this->assertEquals(true, is_array($reoccur['ical_rrule']));
     $this->assertEquals("WEEKLY", $reoccur['ical_rrule']["FREQ"]);
     $this->assertEquals("TH", $reoccur['ical_rrule']["BYDAY"]);
     // now test real events
     $erb = new EventRepositoryBuilder();
     $erb->setImportedEvent($importedEvent);
     $erb->setAfterNow();
     $events = $erb->fetchAll();
     $this->assertTrue(count($events) > 5);
     $event = $events[0];
     $this->assertEquals("2015-02-12T09:00:00+00:00", $event->getStartAtInUTC()->format("c"));
     $this->assertEquals("2015-02-12T10:00:00+00:00", $event->getEndAtInUTC()->format("c"));
     $this->assertFalse($event->getIsDeleted());
     $event = $events[1];
     $this->assertEquals("2015-02-26T09:00:00+00:00", $event->getStartAtInUTC()->format("c"));
     $this->assertEquals("2015-02-26T10:00:00+00:00", $event->getEndAtInUTC()->format("c"));
     $this->assertFalse($event->getIsDeleted());
     $event = $events[2];
     $this->assertEquals("2015-03-12T09:00:00+00:00", $event->getStartAtInUTC()->format("c"));
     $this->assertEquals("2015-03-12T10:00:00+00:00", $event->getEndAtInUTC()->format("c"));
     $this->assertFalse($event->getIsDeleted());
     \TimeSource::mock(2015, 1, 2, 1, 1, 1);
     // ============================================= Import With no changes
     $importURLRun = new ImportURLRun($importURL, $site);
     $importURLRun->setTemporaryFileStorageForTesting(dirname(__FILE__) . '/data/ImportRRuleDeleteByExDate1Part1.ics');
     $i = new ImportURLICalHandler();
     $i->setImportURLRun($importURLRun);
     $i->setLimitToSaveOnEachRun(7);
     $this->assertTrue($i->canHandle());
     $r = $i->handle();
     // Is it loaded on Imported Events?
     $ierb = new \repositories\builders\ImportedEventRepositoryBuilder();
     $importedEvents = $ierb->fetchAll();
     $this->assertEquals(1, count($importedEvents));
     $importedEvent = $importedEvents[0];
     $reoccur = $importedEvent->getReoccur();
     $this->assertEquals(true, is_array($reoccur));
     $this->assertEquals(true, isset($reoccur['ical_rrule']));
     $this->assertEquals(true, is_array($reoccur['ical_rrule']));
     $this->assertEquals("WEEKLY", $reoccur['ical_rrule']["FREQ"]);
     $this->assertEquals("TH", $reoccur['ical_rrule']["BYDAY"]);
     // now test real events
     $erb = new EventRepositoryBuilder();
     $erb->setImportedEvent($importedEvent);
     $erb->setAfterNow();
     $events = $erb->fetchAll();
     $this->assertTrue(count($events) > 5);
     $event = $events[0];
     $this->assertEquals("2015-02-12T09:00:00+00:00", $event->getStartAtInUTC()->format("c"));
     $this->assertEquals("2015-02-12T10:00:00+00:00", $event->getEndAtInUTC()->format("c"));
     $this->assertFalse($event->getIsDeleted());
     $event = $events[1];
     $this->assertEquals("2015-02-26T09:00:00+00:00", $event->getStartAtInUTC()->format("c"));
     $this->assertEquals("2015-02-26T10:00:00+00:00", $event->getEndAtInUTC()->format("c"));
     $this->assertFalse($event->getIsDeleted());
     $event = $events[2];
     $this->assertEquals("2015-03-12T09:00:00+00:00", $event->getStartAtInUTC()->format("c"));
     $this->assertEquals("2015-03-12T10:00:00+00:00", $event->getEndAtInUTC()->format("c"));
     $this->assertFalse($event->getIsDeleted());
     \TimeSource::mock(2015, 1, 3, 1, 1, 1);
     // ============================================= Import WITH ONE DELETED!
     $importURLRun = new ImportURLRun($importURL, $site);
     $importURLRun->setTemporaryFileStorageForTesting(dirname(__FILE__) . '/data/ImportRRuleDeleteByExDate1Part2.ics');
     $i = new ImportURLICalHandler();
     $i->setImportURLRun($importURLRun);
     $i->setLimitToSaveOnEachRun(7);
     $this->assertTrue($i->canHandle());
     $r = $i->handle();
     // Is it loaded on Imported Events?
     $ierb = new \repositories\builders\ImportedEventRepositoryBuilder();
     $importedEvents = $ierb->fetchAll();
     $this->assertEquals(1, count($importedEvents));
     $importedEvent = $importedEvents[0];
     $reoccur = $importedEvent->getReoccur();
     $this->assertEquals(true, is_array($reoccur));
     $this->assertEquals(true, isset($reoccur['ical_rrule']));
     $this->assertEquals(true, is_array($reoccur['ical_rrule']));
     $this->assertEquals("WEEKLY", $reoccur['ical_rrule']["FREQ"]);
     $this->assertEquals("TH", $reoccur['ical_rrule']["BYDAY"]);
     // now test real events
     $erb = new EventRepositoryBuilder();
     $erb->setImportedEvent($importedEvent);
     $erb->setAfterNow();
     $erb->setIncludeDeleted(true);
     $events = $erb->fetchAll();
     $this->assertTrue(count($events) > 5);
     $event = $events[0];
     $this->assertEquals("2015-02-12T09:00:00+00:00", $event->getStartAtInUTC()->format("c"));
     $this->assertEquals("2015-02-12T10:00:00+00:00", $event->getEndAtInUTC()->format("c"));
     $this->assertFalse($event->getIsDeleted());
     $event = $events[1];
     $this->assertEquals("2015-02-26T09:00:00+00:00", $event->getStartAtInUTC()->format("c"));
     $this->assertEquals("2015-02-26T10:00:00+00:00", $event->getEndAtInUTC()->format("c"));
     $this->assertTrue($event->getIsDeleted());
     $event = $events[2];
     $this->assertEquals("2015-03-12T09:00:00+00:00", $event->getStartAtInUTC()->format("c"));
     $this->assertEquals("2015-03-12T10:00:00+00:00", $event->getEndAtInUTC()->format("c"));
     $this->assertFalse($event->getIsDeleted());
 }
 function eventEdited($id, Request $request, Application $app)
 {
     $this->build($id, $request, $app);
     $erb = new EventRepositoryBuilder();
     $erb->setEditedByUser($this->parameters['user']);
     $erb->setOrderByStartAt(true);
     $this->parameters['events'] = $erb->fetchAll();
     return $app['twig']->render('/sysadmin/user/event.edited.html.twig', $this->parameters);
 }
 function editFuture($slug, Request $request, Application $app)
 {
     if (!$this->build($slug, $request, $app)) {
         $app->abort(404, "Event does not exist.");
     }
     // Event Recur Set
     $eventRecurSetRepo = new EventRecurSetRepository();
     $this->parameters['eventRecurSet'] = $eventRecurSetRepo->loadForEvent($this->parameters['event']);
     if (!$this->parameters['eventRecurSet']) {
         return false;
         // TODO
     }
     $this->parameters['eventRecurSet']->setCustomFields($app['currentSite']->getCachedEventCustomFieldDefinitionsAsModels());
     // Load history we are working with
     $eventHistoryRepo = new EventHistoryRepository();
     $this->parameters['eventHistory'] = $eventHistoryRepo->loadByEventAndlastEditByUser($this->parameters['event'], $app['currentUser']);
     if (!$this->parameters['eventHistory']) {
         return false;
         // TODO
     }
     $eventHistoryRepo->ensureChangedFlagsAreSet($this->parameters['eventHistory']);
     $this->parameters['eventRecurSet']->setInitalEventLastChange($this->parameters['eventHistory']);
     // load event before this edit
     $eventRepo = new EventRepository();
     $this->parameters['eventRecurSet']->setInitialEventJustBeforeLastChange($eventRepo->loadEventJustBeforeEdit($this->parameters['event'], $this->parameters['eventHistory']));
     // Event & Future Events
     $this->parameters['eventRecurSet']->setInitalEvent($this->parameters['event']);
     $eventRB = new EventRepositoryBuilder();
     $eventRB->setStartAfter($this->parameters['event']->getStartAtInUTC());
     $eventRB->setInSameRecurEventSet($this->parameters['event']);
     $eventRB->setIncludeDeleted(false);
     $this->parameters['eventRecurSet']->setFutureEvents($eventRB->fetchAll());
     if (!$this->parameters['eventRecurSet']->getFutureEvents()) {
         return false;
         // TODO
     }
     // Let's check for upgrades, then apply or show user
     $this->parameters['eventRecurSet']->applyChangeToFutureEvents();
     if ($this->parameters['eventRecurSet']->isAnyProposedChangesPossible()) {
         if ($request->request->get('submitted') == 'cancel' && $request->request->get('CSFRToken') == $app['websession']->getCSFRToken()) {
             return $app->redirect("/event/" . $this->parameters['event']->getSlugforURL());
         }
         if ($request->request->get('submitted') == 'yes' && $request->request->get('CSFRToken') == $app['websession']->getCSFRToken()) {
             $eventRepo = new EventRepository();
             $countEvents = 0;
             foreach ($this->parameters['eventRecurSet']->getFutureEvents() as $futureEvent) {
                 $proposedChanges = $this->parameters['eventRecurSet']->getFutureEventsProposedChangesForEventSlug($futureEvent->getSlug());
                 if ($proposedChanges->getSummaryChangePossible()) {
                     $proposedChanges->setSummaryChangeSelected($request->request->get("eventSlug" . $futureEvent->getSlug() . 'fieldSummary') == 1);
                 }
                 if ($proposedChanges->getDescriptionChangePossible()) {
                     $proposedChanges->setDescriptionChangeSelected($request->request->get("eventSlug" . $futureEvent->getSlug() . 'fieldDescription') == 1);
                 }
                 if ($proposedChanges->getCountryAreaVenueIdChangePossible()) {
                     $proposedChanges->setCountryAreaVenueIdChangeSelected($request->request->get("eventSlug" . $futureEvent->getSlug() . 'fieldCountryAreaVenue') == 1);
                 }
                 if ($proposedChanges->getTimezoneChangePossible()) {
                     $proposedChanges->setTimezoneChangeSelected($request->request->get("eventSlug" . $futureEvent->getSlug() . 'fieldTimezone') == 1);
                 }
                 if ($proposedChanges->getUrlChangePossible()) {
                     $proposedChanges->setUrlChangeSelected($request->request->get("eventSlug" . $futureEvent->getSlug() . 'fieldUrl') == 1);
                 }
                 if ($proposedChanges->getTicketUrlChangePossible()) {
                     $proposedChanges->setTicketUrlChangeSelected($request->request->get("eventSlug" . $futureEvent->getSlug() . 'fieldTicketUrl') == 1);
                 }
                 if ($proposedChanges->getIsVirtualChangePossible()) {
                     $proposedChanges->setIsVirtualChangeSelected($request->request->get("eventSlug" . $futureEvent->getSlug() . 'fieldIsVirtual') == 1);
                 }
                 if ($proposedChanges->getIsPhysicalChangePossible()) {
                     $proposedChanges->setIsPhysicalChangeSelected($request->request->get("eventSlug" . $futureEvent->getSlug() . 'fieldIsPhysical') == 1);
                 }
                 if ($proposedChanges->getIsCancelledChangePossible()) {
                     $proposedChanges->setIsCancelledChangeSelected($request->request->get("eventSlug" . $futureEvent->getSlug() . 'fieldIsCancelled') == 1);
                 }
                 if ($proposedChanges->getStartEndAtChangePossible()) {
                     $proposedChanges->setStartEndAtChangePossible($request->request->get("eventSlug" . $futureEvent->getSlug() . 'fieldStartEnd') == 1);
                 }
                 foreach ($app['currentSite']->getCachedEventCustomFieldDefinitionsAsModels() as $customField) {
                     if ($proposedChanges->getCustomFieldChangePossible($customField)) {
                         $proposedChanges->setCustomFieldChangeSelected($customField, $request->request->get("eventSlug" . $futureEvent->getSlug() . 'fieldCustom' . $customField->getKey()) == 1);
                     }
                 }
                 if ($proposedChanges->applyToEvent($futureEvent, $this->parameters['event'])) {
                     $eventRepo->edit($futureEvent, $app['currentUser'], $this->parameters['eventHistory']);
                     $countEvents++;
                 }
             }
             if ($countEvents > 0) {
                 $app['flashmessages']->addMessage($countEvents > 1 ? $countEvents . " future events edited." : "Future event edited.");
                 return $app->redirect("/event/" . $this->parameters['event']->getSlugforURL());
             }
         }
         // Only pass $futureEvent to the view layer if there are actually changes that can be made.
         $futureEvents = array();
         foreach ($this->parameters['eventRecurSet']->getFutureEvents() as $futureEvent) {
             if ($this->parameters['eventRecurSet']->getFutureEventsProposedChangesForEventSlug($futureEvent->getSlug())->isAnyChangesPossible()) {
                 $futureEvents[] = $futureEvent;
             }
         }
         $this->parameters['futureEvents'] = $futureEvents;
         $this->parameters['futureEventsProposedChanges'] = $this->parameters['eventRecurSet']->getFutureEventsProposedChanges();
         return $app['twig']->render('site/event/edit.future.html.twig', $this->parameters);
     } else {
         return $app->redirect("/event/" . $this->parameters['event']->getSlugforURL());
     }
 }
 protected function run()
 {
     global $CONFIG;
     $userRepo = new UserAccountRepository();
     $siteRepo = new SiteRepository();
     $eventRepo = new EventRepository();
     $userWatchesSiteRepository = new UserWatchesSiteRepository();
     $userWatchesSiteStopRepository = new UserWatchesSiteStopRepository();
     $userAccountGeneralSecurityKeyRepository = new UserAccountGeneralSecurityKeyRepository();
     $userNotificationRepo = new UserNotificationRepository();
     /** @var usernotifications/UserWatchesSiteGroupPromptNotificationType **/
     $userNotificationType = $this->app['extensions']->getCoreExtension()->getUserNotificationType('UserWatchesSiteGroupPrompt');
     $b = new UserWatchesSiteRepositoryBuilder();
     foreach ($b->fetchAll() as $userWatchesSite) {
         $user = $userRepo->loadByID($userWatchesSite->getUserAccountId());
         $site = $siteRepo->loadById($userWatchesSite->getSiteId());
         $siteRepo->loadLegacyFeaturesOnSite($site);
         // to avoid flooding user we only send one group email per run
         $anyGroupNotificationsSent = false;
         $this->logVerbose(" User " . $user->getEmail() . " Site " . $site->getTitle());
         if ($site->getIsClosedBySysAdmin()) {
             $this->logVerbose(" ... site is closed");
             // Technically UserWatchesSiteRepositoryBuilder() should only return getIsWatching() == true but lets double check
         } else {
             if ($userWatchesSite->getIsWatching()) {
                 $groupRepoBuilder = new GroupRepositoryBuilder();
                 $groupRepoBuilder->setSite($site);
                 $groupRepoBuilder->setIncludeDeleted(false);
                 foreach ($groupRepoBuilder->fetchAll() as $group) {
                     if (!$anyGroupNotificationsSent) {
                         $this->logVerbose(" ... searching group " . $group->getSlug() . " for data");
                         $lastEvent = $eventRepo->loadLastNonDeletedNonImportedByStartTimeInGroupId($group->getId());
                         $data = $userWatchesSite->getGroupPromptEmailData($site, $group, $lastEvent);
                         if ($data['moreEventsNeeded']) {
                             $this->logVerbose(" ... found data ");
                             ///// Notification Class
                             $userNotification = $userNotificationType->getNewNotification($user, $site);
                             $userNotification->setGroup($group);
                             ////// Save Notification Class
                             $userNotificationRepo->create($userNotification);
                             ////// Send Email
                             if ($userNotification->getIsEmail()) {
                                 $userWatchesSiteStop = $userWatchesSiteStopRepository->getForUserAndSite($user, $site);
                                 configureAppForSite($site);
                                 configureAppForUser($user);
                                 $userAccountGeneralSecurityKey = $userAccountGeneralSecurityKeyRepository->getForUser($user);
                                 $unsubscribeURL = $CONFIG->getWebIndexDomainSecure() . '/you/emails/' . $user->getId() . '/' . $userAccountGeneralSecurityKey->getAccessKey();
                                 $lastEventsBuilder = new EventRepositoryBuilder();
                                 $lastEventsBuilder->setSite($site);
                                 $lastEventsBuilder->setGroup($group);
                                 $lastEventsBuilder->setOrderByStartAt(true);
                                 $lastEventsBuilder->setIncludeDeleted(false);
                                 $lastEventsBuilder->setIncludeImported(false);
                                 $lastEventsBuilder->setLimit($CONFIG->userWatchesSiteGroupPromptEmailShowEvents);
                                 $lastEvents = $lastEventsBuilder->fetchAll();
                                 $message = \Swift_Message::newInstance();
                                 $message->setSubject("Any news about " . $group->getTitle() . "?");
                                 $message->setFrom(array($CONFIG->emailFrom => $CONFIG->emailFromName));
                                 $message->setTo($user->getEmail());
                                 $messageText = $this->app['twig']->render('email/userWatchesSiteGroupPromptEmail.txt.twig', array('user' => $user, 'group' => $group, 'lastEvents' => $lastEvents, 'stopCode' => $userWatchesSiteStop->getAccessKey(), 'generalSecurityCode' => $userAccountGeneralSecurityKey->getAccessKey(), 'unsubscribeURL' => $unsubscribeURL));
                                 if ($CONFIG->isDebug) {
                                     file_put_contents('/tmp/userWatchesSiteGroupPromptEmail.txt', $messageText);
                                 }
                                 $message->setBody($messageText);
                                 $messageHTML = $this->app['twig']->render('email/userWatchesSiteGroupPromptEmail.html.twig', array('user' => $user, 'group' => $group, 'lastEvents' => $lastEvents, 'stopCode' => $userWatchesSiteStop->getAccessKey(), 'generalSecurityCode' => $userAccountGeneralSecurityKey->getAccessKey(), 'unsubscribeURL' => $unsubscribeURL));
                                 if ($CONFIG->isDebug) {
                                     file_put_contents('/tmp/userWatchesSiteGroupPromptEmail.html', $messageHTML);
                                 }
                                 $message->addPart($messageHTML, 'text/html');
                                 $headers = $message->getHeaders();
                                 $headers->addTextHeader('List-Unsubscribe', $unsubscribeURL);
                                 $this->logVerbose(" ... sending");
                                 if (!$CONFIG->isDebug) {
                                     $this->app['mailer']->send($message);
                                 }
                                 $userNotificationRepo->markEmailed($userNotification);
                             }
                             $userWatchesSiteRepository->markGroupPromptEmailSent($userWatchesSite, $group, $data['checkTime']);
                             $anyGroupNotificationsSent = true;
                         }
                     }
                 }
             }
         }
     }
     return array('result' => 'ok');
 }
 public function markDuplicateWithMetaData(AreaModel $duplicateArea, AreaModel $originalArea, AreaEditMetaDataModel $areaEditMetaDataModel)
 {
     global $DB;
     if ($duplicateArea->getId() == $originalArea->getId()) {
         return;
     }
     try {
         $DB->beginTransaction();
         $duplicateArea->setIsDuplicateOfId($originalArea->getId());
         $duplicateArea->setIsDeleted(true);
         $this->areaDBAccess->update($duplicateArea, array('is_duplicate_of_id', 'is_deleted'), $areaEditMetaDataModel);
         // Move Venues
         $venueDBAccess = new VenueDBAccess($DB, new \TimeSource());
         $vrb = new VenueRepositoryBuilder();
         $vrb->setArea($duplicateArea);
         $venueEditMetaData = new VenueEditMetaDataModel();
         $venueEditMetaData->setUserAccount($areaEditMetaDataModel->getUserAccount());
         foreach ($vrb->fetchAll() as $venue) {
             $venue->setAreaId($originalArea->getId());
             $venueDBAccess->update($venue, array('area_id'), $venueEditMetaData);
         }
         // Move Events
         $eventRepoBuilder = new EventRepositoryBuilder();
         $eventRepoBuilder->setArea($duplicateArea);
         $eventDBAccess = new EventDBAccess($DB, new \TimeSource());
         $eventEditMetaData = new EventEditMetaDataModel();
         $eventEditMetaData->setUserAccount($areaEditMetaDataModel->getUserAccount());
         foreach ($eventRepoBuilder->fetchAll() as $event) {
             // Check Area actually matches here because we may get events at a venue.
             // Based on the order we do things in (ie Move Venue, Move Event) we shouldn't but let's be safe.
             if ($event->getAreaId() == $duplicateArea->getId() && $event->getVenueId() == null) {
                 $event->setAreaId($originalArea->getId());
                 $eventDBAccess->update($event, array('area_id'), $eventEditMetaData);
             }
         }
         // Move Child Areas
         $areaRepoBuilder = new AreaRepositoryBuilder();
         $areaRepoBuilder->setParentArea($duplicateArea);
         $areaRepoBuilder->setIncludeParentLevels(0);
         $flag = false;
         foreach ($areaRepoBuilder->fetchAll() as $area) {
             // lets just double check we haven't got any child areas.
             if ($area->getParentAreaId() == $duplicateArea->getId()) {
                 $area->setParentAreaId($originalArea->getId());
                 $this->areaDBAccess->update($area, array('parent_area_id'), $areaEditMetaDataModel);
                 $flag = true;
             }
         }
         if ($flag) {
             // now must clear caches
             $this->deleteParentCacheForArea($originalArea);
             $this->deleteParentCacheForArea($duplicateArea);
         }
         $DB->commit();
     } catch (Exception $e) {
         $DB->rollBack();
     }
 }
 function testInChildArea()
 {
     $this->addCountriesToTestDB();
     TimeSource::mock(2013, 7, 1, 7, 0, 0);
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     $area1 = new AreaModel();
     $area1->setTitle("scotland");
     $area1child = new AreaModel();
     $area1child->setTitle("edinburgh");
     $area2 = new AreaModel();
     $area2->setTitle("england");
     $areaRepo = new AreaRepository();
     $countryRepo = new CountryRepository();
     $areaRepo->create($area1, null, $site, $countryRepo->loadByTwoCharCode('GB'), $user);
     $areaRepo->buildCacheAreaHasParent($area1);
     $areaRepo->create($area1child, $area1, $site, $countryRepo->loadByTwoCharCode('GB'), $user);
     $areaRepo->buildCacheAreaHasParent($area1child);
     $areaRepo->create($area2, null, $site, $countryRepo->loadByTwoCharCode('GB'), $user);
     $areaRepo->buildCacheAreaHasParent($area2);
     $event = new EventModel();
     $event->setSummary("test");
     $event->setDescription("test test");
     $event->setStartAt($this->mktime(2013, 8, 1, 19, 0, 0));
     $event->setEndAt($this->mktime(2013, 8, 1, 21, 0, 0));
     $event->setAreaId($area1child->getId());
     $eventRepository = new EventRepository();
     $eventRepository->create($event, $site, $user);
     #test - find in erb
     $erb = new EventRepositoryBuilder();
     $erb->setSite($site);
     $erb->setArea($area1);
     $events = $erb->fetchAll();
     $this->assertEquals(1, count($events));
     $this->assertEquals($event->getId(), $events[0]->getId());
     #test - find in erb
     $erb = new EventRepositoryBuilder();
     $erb->setSite($site);
     $erb->setArea($area1child);
     $events = $erb->fetchAll();
     $this->assertEquals(1, count($events));
     $this->assertEquals($event->getId(), $events[0]->getId());
     #test - don't find in erb
     $erb = new EventRepositoryBuilder();
     $erb->setSite($site);
     $erb->setArea($area2);
     $events = $erb->fetchAll();
     $this->assertEquals(0, count($events));
 }
 /**
  * This function takes a set of proposed new events in. It looks for any duplicate events already saved and filters them out.
  * @return Array New proposed events where duplicates don't exist.
  */
 public function filterEventsForExisting(EventModel $sourceEvent, $events)
 {
     $group = new GroupModel();
     $group->setId($sourceEvent->getGroupId());
     $out = array();
     foreach ($events as $event) {
         $erb = new EventRepositoryBuilder();
         $erb->setGroup($group);
         $erb->setStart($event->getStartAt());
         $erb->setEnd($event->getEndAt());
         $existingEvents = $erb->fetchAll();
         if (count($existingEvents) > 0) {
         } else {
             $out[] = $event;
         }
     }
     return $out;
 }
    function testSetCountryAndTimeZone()
    {
        \TimeSource::mock(2014, 06, 01, 00, 00, 00);
        $this->addCountriesToTestDB();
        $countryRepo = new CountryRepository();
        $country = $countryRepo->loadByTwoCharCode("DE");
        $user = new UserAccountModel();
        $user->setEmail("*****@*****.**");
        $user->setUsername("test");
        $user->setPassword("password");
        $userRepo = new UserAccountRepository();
        $userRepo->create($user);
        $site = new SiteModel();
        $site->setTitle("Test");
        $site->setSlug("test");
        $siteRepo = new SiteRepository();
        $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
        $group = new GroupModel();
        $group->setTitle("test");
        $group->setDescription("test test");
        $group->setUrl("http://www.group.com");
        $groupRepo = new GroupRepository();
        $groupRepo->create($group, $site, $user);
        $json = json_decode('{
	"event":{
		"summary":"Test",
		"description":"test test test",
		"url":"http://example.com",
		"start":{
			"str":"2014-07-01 10:00:00"
		},
		"end":{
			"str":"2014-07-01 17:00:00"
		},
		"country":{
			"code":"DE"
		},
		"timezone":"Europe/Berlin"
	},
	"site":{
		"slug":"test"
	},
	"group":{
		"slug":"' . $group->getSlug() . '"
	},
	"user":{
		"username":"******"
	}
}');
        $createEvent = new CreateEvent();
        $createEvent->setFromJSON($json);
        $this->assertEquals(true, $createEvent->canGo());
        $createEvent->go();
        $eventRepoBuilder = new EventRepositoryBuilder();
        $events = $eventRepoBuilder->fetchAll();
        $this->assertEquals(1, count($events));
        $event = $events[0];
        $this->assertEquals('Test', $event->getSummary());
        $this->assertEquals('test test test', $event->getDescription());
        $this->assertEquals('http://example.com', $event->getUrl());
        // Times above are Berlin, These are UTC
        $this->assertEquals('2014-07-01T09:00:00+00:00', $event->getStartAtInUTC()->format('c'));
        $this->assertEquals('2014-07-01T16:00:00+00:00', $event->getEndAtInUTC()->format('c'));
        $this->assertEquals($group->getId(), $event->getGroupId());
        $this->assertEquals('Europe/Berlin', $event->getTimeZone());
        $this->assertEquals($country->getId(), $event->getCountryId());
    }
 public static function run(Application $app, $verbose = false)
 {
     global $CONFIG;
     if ($verbose) {
         print "Starting " . date("c") . "\n";
     }
     $userRepo = new UserAccountRepository();
     $siteRepo = new SiteRepository();
     $groupRepo = new GroupRepository();
     $eventRepo = new EventRepository();
     $userWatchesGroupRepository = new UserWatchesGroupRepository();
     $userWatchesGroupStopRepository = new UserWatchesGroupStopRepository();
     $userAccountGeneralSecurityKeyRepository = new UserAccountGeneralSecurityKeyRepository();
     $userNotificationRepo = new UserNotificationRepository();
     $userHasNoEditorPermissionsInSiteRepo = new UserHasNoEditorPermissionsInSiteRepository();
     $userPermissionsRepo = new UserPermissionsRepository($app['extensions']);
     /** @var usernotifications/UserWatchesGroupPromptNotificationType **/
     $userNotificationType = $app['extensions']->getCoreExtension()->getUserNotificationType('UserWatchesGroupPrompt');
     $b = new UserWatchesGroupRepositoryBuilder();
     foreach ($b->fetchAll() as $userWatchesGroup) {
         $user = $userRepo->loadByID($userWatchesGroup->getUserAccountId());
         $group = $groupRepo->loadById($userWatchesGroup->getGroupId());
         $site = $siteRepo->loadById($group->getSiteID());
         // This is not the most efficient as it involves DB access and the results might not be used. But it'll do for now.
         $userPermissions = $userPermissionsRepo->getPermissionsForUserInSite($user, $site, false, true);
         if ($verbose) {
             print date("c") . " User " . $user->getEmail() . " Site " . $site->getTitle() . " Group " . $group->getTitle() . "\n";
         }
         // UserWatchesGroupRepositoryBuilder() should only return instances where site is not also watched
         if ($site->getIsClosedBySysAdmin()) {
             if ($verbose) {
                 print " ... site is closed\n";
             }
         } else {
             if ($group->getIsDeleted()) {
                 if ($verbose) {
                     print " ... group is deleted\n";
                 }
             } else {
                 if ($userHasNoEditorPermissionsInSiteRepo->isUserInSite($user, $site)) {
                     if ($verbose) {
                         print " ... user does not have edit permissions allowed in site\n";
                     }
                 } else {
                     if (!$userPermissions->hasPermission("org.openacalendar", "CALENDAR_CHANGE")) {
                         if ($verbose) {
                             print " ... user does not have org.openacalendar/CALENDAR_CHANGE permission in site\n";
                         }
                         // Technically UserWatchesSiteRepositoryBuilder() should only return getIsWatching() == true but lets double check
                     } else {
                         if ($userWatchesGroup->getIsWatching()) {
                             if ($verbose) {
                                 print " ... searching for data\n";
                             }
                             $lastEvent = $eventRepo->loadLastNonDeletedNonImportedByStartTimeInGroupId($group->getId());
                             $data = $userWatchesGroup->getPromptEmailData($site, $lastEvent);
                             if ($data['moreEventsNeeded']) {
                                 if ($verbose) {
                                     print " ... found data\n";
                                 }
                                 ///// Notification Class
                                 $userNotification = $userNotificationType->getNewNotification($user, $site);
                                 $userNotification->setGroup($group);
                                 ////// Save Notification Class
                                 $userNotificationRepo->create($userNotification);
                                 ////// Send Email
                                 if ($userNotification->getIsEmail()) {
                                     $userWatchesGroupStop = $userWatchesGroupStopRepository->getForUserAndGroup($user, $group);
                                     configureAppForSite($site);
                                     configureAppForUser($user);
                                     $userAccountGeneralSecurityKey = $userAccountGeneralSecurityKeyRepository->getForUser($user);
                                     $unsubscribeURL = $CONFIG->getWebIndexDomainSecure() . '/you/emails/' . $user->getId() . '/' . $userAccountGeneralSecurityKey->getAccessKey();
                                     $lastEventsBuilder = new EventRepositoryBuilder();
                                     $lastEventsBuilder->setSite($site);
                                     $lastEventsBuilder->setGroup($group);
                                     $lastEventsBuilder->setOrderByStartAt(true);
                                     $lastEventsBuilder->setIncludeDeleted(false);
                                     $lastEventsBuilder->setIncludeImported(false);
                                     $lastEventsBuilder->setLimit($CONFIG->userWatchesGroupPromptEmailShowEvents);
                                     $lastEvents = $lastEventsBuilder->fetchAll();
                                     $message = \Swift_Message::newInstance();
                                     $message->setSubject("Any news about " . $group->getTitle() . "?");
                                     $message->setFrom(array($CONFIG->emailFrom => $CONFIG->emailFromName));
                                     $message->setTo($user->getEmail());
                                     $messageText = $app['twig']->render('email/userWatchesGroupPromptEmail.txt.twig', array('group' => $group, 'user' => $user, 'lastEvents' => $lastEvents, 'stopCode' => $userWatchesGroupStop->getAccessKey(), 'generalSecurityCode' => $userAccountGeneralSecurityKey->getAccessKey(), 'unsubscribeURL' => $unsubscribeURL));
                                     if ($CONFIG->isDebug) {
                                         file_put_contents('/tmp/userWatchesGroupPromptEmail.txt', $messageText);
                                     }
                                     $message->setBody($messageText);
                                     $messageHTML = $app['twig']->render('email/userWatchesGroupPromptEmail.html.twig', array('group' => $group, 'user' => $user, 'lastEvents' => $lastEvents, 'stopCode' => $userWatchesGroupStop->getAccessKey(), 'generalSecurityCode' => $userAccountGeneralSecurityKey->getAccessKey(), 'unsubscribeURL' => $unsubscribeURL));
                                     if ($CONFIG->isDebug) {
                                         file_put_contents('/tmp/userWatchesGroupPromptEmail.html', $messageHTML);
                                     }
                                     $message->addPart($messageHTML, 'text/html');
                                     $headers = $message->getHeaders();
                                     $headers->addTextHeader('List-Unsubscribe', $unsubscribeURL);
                                     if ($verbose) {
                                         print " ... sending\n";
                                     }
                                     if (!$CONFIG->isDebug) {
                                         $app['mailer']->send($message);
                                     }
                                     $userNotificationRepo->markEmailed($userNotification);
                                 }
                                 $userWatchesGroupRepository->markPromptEmailSent($userWatchesGroup, $data['checkTime']);
                             }
                         }
                     }
                 }
             }
         }
     }
     if ($verbose) {
         print "Finished " . date("c") . "\n";
     }
 }
 function disable($slug, Request $request, Application $app)
 {
     if (!$this->build($slug, $request, $app)) {
         $app->abort(404, "Import does not exist.");
     }
     if (!$this->parameters['importurl']->getIsEnabled()) {
         die('NO');
         // TODO
     }
     if ($request->request->get('disable') == 'yes' && $request->request->get('CSFRToken') == $app['websession']->getCSFRToken()) {
         $iRepository = new ImportURLRepository();
         $iRepository->disable($this->parameters['importurl'], $app['currentUser']);
         $erb = new EventRepositoryBuilder();
         $erb->setAfterNow();
         $erb->setIncludeDeleted(false);
         $erb->setImportURL($this->parameters['importurl']);
         $eventRepository = new EventRepository();
         foreach ($erb->fetchAll() as $event) {
             $eventRepository->delete($event, $app['currentUser']);
         }
         return $app->redirect("/importurl/" . $this->parameters['importurl']->getSlug());
     }
     return $app['twig']->render('site/importurl/disable.html.twig', $this->parameters);
 }
 function delete($slug, Request $request, Application $app)
 {
     if (!$this->build($slug, $request, $app)) {
         $app->abort(404, "Venue does not exist.");
     }
     if ($this->parameters['venue']->getIsDeleted()) {
         die("No");
         // TODO
     }
     $form = $app['form.factory']->create(new VenueDeleteForm());
     if ('POST' == $request->getMethod()) {
         $form->bind($request);
         if ($form->isValid()) {
             $eventRepository = new EventRepository();
             $eventRepository->moveAllFutureEventsAtVenueToNoSetVenue($this->parameters['venue'], $app['currentUser']);
             $venueRepository = new VenueRepository();
             $venueRepository->delete($this->parameters['venue'], $app['currentUser']);
             return $app->redirect("/venue/" . $this->parameters['venue']->getSlugForURL());
         }
     }
     $rb = new EventRepositoryBuilder();
     $rb->setVenue($this->parameters['venue']);
     $rb->setAfterNow(true);
     $rb->setIncludeDeleted(false);
     $this->parameters['events'] = $rb->fetchAll();
     $this->parameters['form'] = $form->createView();
     return $app['twig']->render('site/venue/delete.html.twig', $this->parameters);
 }
 public function updateFutureEventsCache(VenueModel $venue)
 {
     global $DB;
     $statUpdate = $DB->prepare("UPDATE venue_information SET cached_future_events=:count WHERE id=:id");
     $erb = new EventRepositoryBuilder();
     $erb->setVenue($venue);
     $erb->setIncludeDeleted(false);
     $erb->setIncludeCancelled(false);
     $erb->setAfterNow();
     $count = count($erb->fetchAll());
     $statUpdate->execute(array('count' => $count, 'id' => $venue->getId()));
     $venue->setCachedFutureEvents($count);
 }