Skip to content

Commit f03819c

Browse files
committed
added: database seeder
1 parent b88cb6f commit f03819c

File tree

2 files changed

+239
-0
lines changed

2 files changed

+239
-0
lines changed
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
<?php
2+
3+
namespace ColdTrick\EventManager;
4+
5+
use Elgg\Database\Seeds\Seed;
6+
use Elgg\Exceptions\Seeding\MaxAttemptsException;
7+
use Elgg\Groups\Tool;
8+
use Elgg\Values;
9+
10+
/**
11+
* Database seeder for Events
12+
*/
13+
class Seeder extends Seed {
14+
15+
/**
16+
* {@inheritDoc}
17+
*/
18+
public function seed() {
19+
$this->advance($this->getCount());
20+
21+
$groups_supported = elgg()->group_tools->get('event_manager') instanceof Tool;
22+
23+
while ($this->getCount() < $this->limit) {
24+
$container = null;
25+
if ($groups_supported && $this->faker()->boolean()) {
26+
$container = $this->getRandomGroup();
27+
$container->enableTool('event_manager');
28+
}
29+
30+
try {
31+
/* @var $event \Event */
32+
$event = $this->createObject([
33+
'subtype' => \Event::SUBTYPE,
34+
'container_guid' => $container ? $container->guid : null,
35+
'shortdescription' => $this->faker()->words($this->faker()->numberBetween(4, 8), true),
36+
'comments_on' => (int) $this->faker()->boolean(75),
37+
'venue' => $this->faker()->streetName(),
38+
'location' => $this->faker()->address(),
39+
'contact_details' => $this->faker()->company(),
40+
'organizer' => $this->faker()->name(),
41+
'website' => $this->faker()->url(),
42+
'max_attendees' => $this->faker()->numberBetween(10, 80),
43+
'show_attendees' => (int) $this->faker()->boolean(80),
44+
'registration_completed' => $this->faker()->words($this->faker()->numberBetween(150, 500), true),
45+
'waiting_list_enabled' => (int) $this->faker()->boolean(),
46+
// no (yet) supported features
47+
'with_program' => 0,
48+
'registration_needed' => 0,
49+
'registration_ended' => 0,
50+
'notify_onsignup' => 0,
51+
'notify_onsignup_contact' => 0,
52+
'notify_onsignup_organizer' => 0,
53+
]);
54+
} catch (MaxAttemptsException $e) {
55+
// unable to create a blog with the given options
56+
continue;
57+
}
58+
59+
if ($event->comments_on) {
60+
$this->createComments($event);
61+
}
62+
63+
$this->createLikes($event);
64+
65+
$this->setStartEndTime($event);
66+
$event->setLatLong($this->faker()->latitude(24.52, 49.38), $this->faker()->longitude(-66.95, -124.77)); // in the USA, can be in the ocean
67+
$this->addAttendees($event);
68+
$this->addOrganizers($event);
69+
$this->addContacts($event);
70+
71+
elgg_create_river_item([
72+
'action_type' => 'create',
73+
'subject_guid' => $event->owner_guid,
74+
'object_guid' => $event->guid,
75+
'target_guid' => $event->container_guid,
76+
'posted' => $event->time_created,
77+
]);
78+
79+
$event->save();
80+
81+
$this->advance();
82+
}
83+
}
84+
85+
/**
86+
* {@inheritDoc}
87+
*/
88+
public function unseed() {
89+
/* @var $events \ElggBatch */
90+
$events = elgg_get_entities([
91+
'type' => 'object',
92+
'subtype' => \Event::SUBTYPE,
93+
'metadata_name' => '__faker',
94+
'limit' => false,
95+
'batch' => true,
96+
'batch_inc_offset' => false,
97+
]);
98+
99+
/* @var $event \Event */
100+
foreach ($events as $event) {
101+
if ($event->delete()) {
102+
$this->log("Deleted event {$event->guid}");
103+
} else {
104+
$this->log("Failed to delete event {$event->guid}");
105+
$events->reportFailure();
106+
continue;
107+
}
108+
109+
$this->advance();
110+
}
111+
}
112+
113+
/**
114+
* {@inheritDoc}
115+
*/
116+
public static function getType(): string {
117+
return \Event::SUBTYPE;
118+
}
119+
120+
/**
121+
* {@inheritDoc}
122+
*/
123+
protected function getCountOptions(): array {
124+
return [
125+
'type' => 'object',
126+
'subtype' => \Event::SUBTYPE,
127+
];
128+
}
129+
130+
/**
131+
* Set the start and end time of the event
132+
*
133+
* @param \Event $event the event
134+
*
135+
* @return void
136+
*/
137+
protected function setStartEndTime(\Event $event): void {
138+
$since = $this->create_since;
139+
140+
$this->setCreateSince($event->time_created);
141+
$start = $this->getRandomCreationTimestamp();
142+
$event->event_start = $start - ($start % 900); // round to a 15-min period
143+
144+
$end = Values::normalizeTime($event->event_start);
145+
$end = $end->modify("+{$this->faker()->numberBetween(60, 480)} minutes"); // range of 1-8 hours
146+
147+
$event->event_end = $end->getTimestamp() - ($end->getTimestamp() % 900); // round to a 15-min period
148+
149+
$this->setCreateSince($since);
150+
}
151+
152+
/**
153+
* Add attendees to the event
154+
*
155+
* @param \Event $event the event
156+
*
157+
* @return void
158+
*/
159+
protected function addAttendees(\Event $event): void {
160+
$since = $this->create_since;
161+
$until = $this->create_until;
162+
163+
$this->setCreateSince($event->time_created);
164+
$this->setCreateUntil($event->event_start);
165+
166+
$num = $this->faker()->numberBetween(0, $event->max_attendees);
167+
$users = [];
168+
for ($i = 0; $i < $num; $i++) {
169+
$user = $this->getRandomUser($users);
170+
$users[] = $user->guid;
171+
172+
$event->rsvp(EVENT_MANAGER_RELATION_ATTENDING, $user->guid, true, false, false);
173+
174+
elgg_create_river_item([
175+
'view' => 'river/event_relationship/create',
176+
'action_type' => 'event_relationship',
177+
'subject_guid' => $user->guid,
178+
'object_guid' => $event->guid,
179+
'posted' => $this->getRandomCreationTimestamp(),
180+
]);
181+
}
182+
183+
$this->setCreateSince($since);
184+
$this->setCreateUntil($until);
185+
}
186+
187+
/**
188+
* Add organizers to an event
189+
*
190+
* @param \Event $event the event
191+
*
192+
* @return void
193+
*/
194+
protected function addOrganizers(\Event $event): void {
195+
$exclude = (array) $event->contact_guids;
196+
$exclude[] = $event->owner_guid;
197+
198+
$organizers = [];
199+
for ($i = 0; $i < $this->faker()->numberBetween(0, 5); $i++) {
200+
$user = $this->getRandomUser($exclude);
201+
$exclude[] = $user->guid;
202+
203+
$organizers[] = $user->guid;
204+
}
205+
206+
if (!empty($organizers)) {
207+
$event->organizer_guids = $organizers;
208+
}
209+
}
210+
211+
/**
212+
* Add contacts to an event
213+
*
214+
* @param \Event $event the event
215+
*
216+
* @return void
217+
*/
218+
protected function addContacts(\Event $event): void {
219+
$exclude = (array) $event->organizer_guids;
220+
$exclude[] = $event->owner_guid;
221+
222+
$contacts = [];
223+
for ($i = 0; $i < $this->faker()->numberBetween(0, 5); $i++) {
224+
$user = $this->getRandomUser($exclude);
225+
$exclude[] = $user->guid;
226+
227+
$contacts[] = $user->guid;
228+
}
229+
230+
if (!empty($contacts)) {
231+
$event->contact_guids = $contacts;
232+
}
233+
}
234+
}

elgg-plugin.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,11 @@
354354
'\ColdTrick\EventManager\Search::addFields' => [],
355355
],
356356
],
357+
'seeds' => [
358+
'database' => [
359+
'ColdTrick\EventManager\Seeder::register' => [],
360+
],
361+
],
357362
'send:after' => [
358363
'notifications' => [
359364
'\ColdTrick\EventManager\Notifications::sendAfterEventMail' => ['priority' => 99999],

0 commit comments

Comments
 (0)