/** * @param Member $member * @return void */ public function ensureSpeakerProfile(Member $member) { $speaker = $member->getSpeakerProfile(); if (!$speaker) { $speaker = PresentationSpeaker::create(array('MemberID' => Member::currentUserID(), 'FirstName' => Member::currentUser()->FirstName, 'LastName' => Member::currentUser()->Surname)); $speaker->write(); } }
/** * Handles the form submission that creates a new speaker. * Checks for existence, and uses existing if found * * @param $data array * @param $form Form * @return SSViewer */ public function doAddSpeaker($data, $form) { $me = $data['SpeakerType'] == 'Me'; $email = $me ? Member::currentUser()->Email : $data['EmailAddress']; if (!$email) { $form->sessionMessage('Please specify an email addresss', 'bad'); return $this->redirectBack(); } $speaker = $this->getSpeaker($email); if (!$speaker) { $speaker = PresentationSpeaker::create(array('SummitID' => Summit::get_active()->ID)); if ($me) { $member = Member::currentUser(); $speaker->MemberID = $member->ID; } else { // look for the member.. $member = Member::get()->filter('Email', $email)->first(); if (!$member) { $speaker->MemberID = 0; $speaker->write(); $request = $this->getParent()->getSpeakerRegistrationRequestManager()->register($speaker, $email); $speaker->RegistrationRequestID = $request->getIdentifier(); } else { $member->addToGroupByCode('speakers'); $speaker->MemberID = $member->ID; $member->write(); } } } $speaker->Presentations()->add($this->presentation->ID); $speaker->write(); return $this->parent->redirect(Controller::join_links($this->Link(), 'speaker', $speaker->ID)); }
/** * Handles the form submission that creates a new speaker. * Checks for existence, and uses existing if found * @param $data array * @param $form Form * @return SSViewer */ public function doAddSpeaker($data, $form) { $me = $data['SpeakerType'] == 'Me'; $email = $me ? Member::currentUser()->Email : $data['EmailAddress']; if (!$email) { $form->sessionMessage('Please specify an email address', 'bad'); return $this->redirectBack(); } $speaker = $this->getSpeaker($email); if (!$speaker) { $speaker = PresentationSpeaker::create(); if ($me) { $member = Member::currentUser(); $speaker->MemberID = $member->ID; } else { // look for the member.. $member = Member::get()->filter('Email', $email)->first(); if (!$member) { $speaker->MemberID = 0; $speaker->write(); $request = $this->getParent()->getSpeakerRegistrationRequestManager()->register($speaker, $email); $speaker->RegistrationRequestID = $request->getIdentifier(); } else { $member->addToGroupByCode('speakers'); $speaker->MemberID = $member->ID; $member->write(); } } } // i am adding other speaker than me if (!$me && $speaker->hasReachPresentationLimitBy($this->Summit()->ID)) { $form->sessionMessage(sprintf("You reached the maximun allowed # of presentations (%s) for speaker %s (%s)", MAX_SUMMIT_ALLOWED_PER_USER, $speaker->getName(), $email), 'bad'); return $this->redirectBack(); } $speaker->Presentations()->add($this->presentation->ID); $speaker->write(); return $this->parent->redirect(Controller::join_links($this->Link(), 'speaker', $speaker->ID)); }
/** * Attempt to add speakers to the presentation by fuzzy matching the FirstName / Surname * @param Presentation $p * @param VideoPresentation $v */ private function addLegacySpeakers(Presentation $p, VideoPresentation $v) { $speakers = explode(',', $v->Speakers); $created = 0; $resolved = 0; $found = 0; foreach ($speakers as $speakerName) { $speakerName = trim($speakerName); $speakerName = preg_replace('/\\s\\s+/', ' ', $speakerName); $speaker = PresentationSpeaker::get()->where("CONCAT(FirstName, ' ', LastName) = '" . Convert::raw2sql($speakerName) . "'"); if (!$speaker->exists()) { $names = explode(' ', $speakerName); $firstName = array_shift($names); $lastName = implode(' ', $names); $speaker = PresentationSpeaker::create(['FirstName' => $firstName, 'LastName' => $lastName, 'Notes' => '[LEGACY]']); $speaker->write(); $p->Speakers()->add($speaker); echo "Created legacy speaker {$speaker->getName()} from {$speakerName}" . $this->br(); $created++; } else { if ($speaker->count() > 1) { echo "Found more than one speaker matching \"{$speakerName}\": " . implode(',', $speaker->column('ID')) . $this->br(); $bestCandidate = null; $highScore = 0; foreach ($speaker as $s) { $numSpeakings = DB::query("SELECT COUNT(*) FROM `Presentation_Speakers` WHERE PresentationSpeakerID = {$s->ID}")->value(); $hasMember = (int) $s->Member()->exists(); $score = $numSpeakings + $hasMember; if ($score > $highScore) { $highScore = $score; $bestCandidate = $s; } } if ($bestCandidate) { echo "Found best candidate #{$bestCandidate->ID} with a score of {$highScore}" . $this->br(); $p->Speakers()->add($bestCandidate); $resolved++; } else { $this->addError("No speakings or MemberIDs for " . implode(',', $speaker->map('ID', 'Name')->toArray()) . " on \"{$p->Title}\""); } } else { $p->Speakers()->add($speaker->first()); echo "Added speaker " . $speaker->first()->getName() . $this->br(); $found++; } } } $this->stats['Speakers created'] += $created; $this->stats['Speakers resolved'] += $resolved; $this->stats['Speakers found'] += $found; return $p; }
/** * Handles requests that update speakers attached to this presentation * and hands them off to a sub-sub controller * @param $r SS_HTTPRequest * @return RequestHandler */ public function handleSpeaker(SS_HTTPRequest $r) { if ($r->param('SpeakerID') === 'new') { $speaker = PresentationSpeaker::create(); } else { $speaker = PresentationSpeaker::get()->filter(array('ID' => $r->param('SpeakerID')))->first(); } if (!$speaker) { return $this->httpError(404, 'Speaker not found'); } if ($speaker->isInDB() && (!$speaker->Presentations()->byID($this->presentation->ID) && $this->presentation->ModeratorID != $speaker->ID)) { return $this->httpError(403, 'That speaker is not part of this presentation'); } $request = PresentationPage_ManageSpeakerRequest::create($speaker, $this); return $request->handleRequest($r, DataModel::inst()); }
/** * @param ISummit $summit * @param array $speaker_data * @return IPresentationSpeaker */ public function createSpeaker(ISummit $summit, array $speaker_data) { $speaker_repository = $this->speaker_repository; $member_repository = $this->member_repository; $speaker_registration_request_manager = $this->speaker_registration_request_manager; $speaker_creation_email_sender = new PresentationSpeakerCreationEmailMessageSender(); return $this->tx_service->transaction(function () use($summit, $speaker_data, $speaker_repository, $member_repository, $speaker_registration_request_manager, $speaker_creation_email_sender) { $speaker = PresentationSpeaker::create(); $member_id = 0; if (!isset($speaker_data['email']) && !isset($speaker_data['member_id'])) { throw new EntityValidationException("you must provide an email or a member_id in order to create a speaker!"); } if (isset($speaker_data['member_id']) && intval($speaker_data['member_id']) > 0) { $member_id = intval($speaker_data['member_id']); $old_speaker = $speaker_repository->getByMemberID($member_id); if (!is_null($old_speaker)) { throw new EntityValidationException(sprintf("Member %s already has assigned an speaker!", $member_id)); } } $speaker->Title = trim($speaker_data['title']); $speaker->FirstName = trim($speaker_data['first_name']); $speaker->LastName = trim($speaker_data['last_name']); $speaker->IRCHandle = trim($speaker_data['twitter_name']); $speaker->TwitterName = trim($speaker_data['irc_name']); $speaker->MemberID = $member_id; $speaker->CreatedFromAPI = true; $speaker_repository->add($speaker); $speaker->write(); if ($member_id === 0 && isset($speaker_data['email'])) { $email = trim($speaker_data['email']); $member = $member_repository->findByEmail($email); if (is_null($member)) { // we need to create a registration request $request = $speaker_registration_request_manager->register($speaker, $email); $request->SpeakerID = $speaker->ID; $request->write(); $speaker->RegistrationRequestID = $request->ID; $speaker->write(); } else { $old_speaker = $speaker_repository->getByMemberID($member->getIdentifier()); if (!is_null($old_speaker)) { throw new EntityValidationException(sprintf("Member %s already has assigned an speaker!", $member->getIdentifier())); } $speaker->MemberID = $member->getIdentifier(); $speaker->write(); } } // send email to speaker so he can register as a member $speaker_creation_email_sender->send(['Speaker' => $speaker]); $onsite_phone = trim($speaker_data['onsite_phone']); if (!empty($onsite_phone)) { $summit_assistance = $speaker->createAssistanceFor($summit->getIdentifier()); $summit_assistance->OnSitePhoneNumber = $onsite_phone; $summit_assistance->write(); } return $speaker; }); }
/** * @param IPresentation $presentation * @param string $email * @param Member|null $member * @param IPresentationSpeaker|null $speaker * @return IPresentationSpeaker */ public function addSpeakerByEmailTo(IPresentation $presentation, $email, Member $member = null, IPresentationSpeaker $speaker = null) { return $this->tx_manager->transaction(function () use($presentation, $email, $member, $speaker) { $speaker = !is_null($speaker) ? $speaker : $this->speaker_repository->getByEmail($email); if (is_null($speaker) && !is_null($member)) { $speaker = $member->getSpeakerProfile(); } if (!is_null($speaker) && !is_null($member) && intval($member->ID) !== intval($speaker->MemberID)) { throw new EntityValidationException(sprintf('speaker does not belongs to selected member!')); } if (!$speaker) { // create it $speaker = PresentationSpeaker::create(); $speaker->write(); if (!is_null($member)) { $speaker->MemberID = $member->ID; $member->addToGroupByCode('speakers'); $member->write(); } else { $speaker->MemberID = 0; $request = $this->speaker_registration_manager->register($speaker, $email); $speaker->RegistrationRequestID = $request->getIdentifier(); } $speaker->write(); } // i am adding other speaker than me if (!is_null($member) && intval($member->ID) !== intval(Member::currentUserID()) && !$this->canAddSpeakerOnPresentation($speaker, $presentation)) { throw new EntityValidationException(sprintf("You reached the max. allowed # of presentations for speaker %s (%s)", $speaker->getName(), $email)); } if ($speaker->Presentations()->filter('PresentationID', $presentation->ID)->count() > 0 || $presentation->ModeratorID == $speaker->ID) { throw new EntityValidationException('Speaker already assigned to this presentation!.'); } // The first one is the moderator. if (!$presentation->maxModeratorsReached()) { $presentation->ModeratorID = $speaker->ID; } else { $speaker->Presentations()->add($presentation); $speaker->write(); } return $speaker; }); }