course_repository = new SapphireCourseRepository; $this->training_repository = new SapphireTrainingServiceRepository; $this->course_manager = new CourseManager( $this->training_repository, new SapphireTrainingCourseTypeRepository, new SapphireTrainingCourseLevelRepository, new SapphireCourseRelatedProjectRepository, $this->course_repository, new TrainingFactory, SapphireTransactionManager::getInstance()); $this->training_manager = new TrainingManager($this->training_repository, new SapphireMarketPlaceTypeRepository, new TrainingAddPolicy, new TrainingShowPolicy, new SessionCacheService, new MarketplaceFactory, SapphireTransactionManager::getInstance() ); } public function AffiliationEditForm() { if ($CurrentMember = Member::currentUser()) { $AffiliationEditForm = new AffiliationEditForm($this, 'AffiliationEditForm'); return $AffiliationEditForm; } } // The first tab of the profile page. This is called in the EditProfilePage.ss template. public function EditProfileForm() { if ($CurrentMember = Member::currentUser()) { $EditProfileForm = new EditProfileForm($this, 'EditProfileForm'); //Populate the form with the current members data $EditProfileForm->loadDataFrom($CurrentMember->data()); return $EditProfileForm; } } public function EditSpeakerProfileForm() { if ($CurrentMember = Member::currentUser()) { $speaker = Speaker::get()->filter('MemberID',$CurrentMember->ID)->first();; $SpeakerProfileForm = New EditSpeakerProfileForm($this, 'EditSpeakerProfileForm', $speaker, $CurrentMember, null); return $SpeakerProfileForm; } } //Save profile function SaveProfile($data, $form) { //Check for a logged in member if ($CurrentMember = Member::currentUser()) { //Check for another member with the same email address if (Member::get()->filter(array('Email'=>Convert::raw2sql($data['Email']) , 'ID:not'=>$CurrentMember->ID))->count() > 0) { $form->addErrorMessage("Email", 'Sorry, that email address already exists.', "bad"); Session::set("FormInfo.Form_EditProfileForm.data", $data); return $this->redirect($this->Link('?error=1')); } //Otherwise save profile else { // Clean up bio if ($data["Bio"]) { $config = HTMLPurifier_Config::createDefault(); // Remove any CSS or inline styles $config->set('CSS.AllowedProperties', array()); $purifier = new HTMLPurifier($config); $cleanedBio = $purifier->purify($data["Bio"]); } $form->saveInto($CurrentMember); if (isset($cleanedBio)) $CurrentMember->Bio = $cleanedBio; if($data['Gender'] == 'Specify'){ $CurrentMember->Gender = $data['GenderSpecify']; } $CurrentMember->write(); $speaker = Speaker::get()->filter('MemberID', $CurrentMember->ID)->first(); if ($speaker) { if ($data['ReplaceName'] == 1) { $speaker->FirstName = $data['FirstName']; } if ($data['ReplaceSurname'] == 1) { $speaker->Surname = $data['Surname']; } if ($data['ReplaceBio'] == 1) { $speaker->Bio = $data['Bio']; } $speaker->write(); } // If they do not have a photo uploaded, but they have provided a twitter URL, attempt to grab a photo from twitter if ($CurrentMember->TwitterName && !$CurrentMember->Photo()->Exists()) { $this->ProfilePhotoFromTwitter($CurrentMember); } return $this->redirect($this->Link('?saved=1')); } } //If not logged in then return a permission error else { return Security::PermissionFailure($this->controller, 'You must be registered and logged in to edit your profile:'); } } //Check for just saved function Saved() { return $this->request->getVar('saved'); } //Check for error function Error() { return $this->request->getVar('error'); } //Check for success status function Success() { return $this->request->getVar('success'); } public function SetCurrentTab($tab) { $this->CurrentTab = $tab; } function LegalAgreements() { $CurrentMember = Member::currentUser(); $LegalAgreements = LegalAgreement::get()->filter('MemberID', $CurrentMember->ID); if ($LegalAgreements->count() > 0) { $LegalAgreements->sort('Created'); return $LegalAgreements; } else { return NULL; } } function FoundationMember() { // see if the member is in the foundation group if (Member::currentUser() && Member::currentUser()->inGroup('foundation-members')) return TRUE; } function CompanyAdmin() { return Member::currentUser()->getManagedCompanies(); } // look up the current election if there is one function CurrentElection() { // Query the election system to look for a current election $Elections = ElectionSystem::get()->first(); if ($Elections) { // See if the current election is open. // An election is open if either nominations are open or the election voting is open. if (!$Elections->CurrentElectionID == 0) { return $Elections->CurrentElection(); } } } // Uses the twitter name of the person to fetch and set a profile image function ProfilePhotoFromTwitter($Member) { $thumbnailURL = "https://api.twitter.com/1/users/profile_image?screen_name=" . $Member->TwitterName . "&size=bigger"; $folderToSave = 'assets/profile-images/'; //to save into another folder add one via the cms then change this path. Folders are a type of Folder DataObject. $folderObject = Folder::get()->filter('Filename','folderToSave')->first(); if ($folderObject) { //get image from url and save to folder $thumbnailToCopy = @file_get_contents($thumbnailURL); $thumbnailName = $Member->TwitterName . '.png'; // Make sure something was returned from twitter. if ($thumbnailToCopy !== false) { $thumbnailFile = fopen('./../' . $folderToSave . $thumbnailName, 'w'); // opens existing or creates a new file fwrite($thumbnailFile, $thumbnailToCopy); //overwrites file fclose($thumbnailFile); //close file if (!Image::get()->filter('Name', $thumbnailName)->count()) //checks if dataObject already exists, stops multiple records being created. { $thumbnailObject = Object::create('BetterImage'); $thumbnailObject->ParentID = $folderObject->ID; //assign folder of image as parent $thumbnailObject->Name = $thumbnailName; //this function also sets the images Filename and title in a round about way. (see setName() in File.php) $thumbnailObject->OwnerID = (Member::currentUser() ? Member::currentUser()->ID : 0); //assign current user as Owner $thumbnailObject->write(); } else { // Data object exists. Assign it to $thumbnailObject. $thumbnailObject = Image::get()->filter('Name', $thumbnailName)->first(); } // Set and save the profile image if ($thumbnailObject) { $Member->PhotoID = $thumbnailObject->ID; $Member->write(); } } } } // Candidate Application Form function CandidateApplicationForm() { $CandidateApplicationForm = new CandidateApplicationForm($this, 'CandidateApplicationForm'); $CandidateApplicationForm->disableSecurityToken(); // Load the election system $Elections = ElectionSystem::get()->first(); $CurrentElection = $Elections->CurrentElection(); $currentMember = Member::currentUser(); // Check for login if ($currentMember) { $Candidate = Candidate::get()->filter(array('MemberID' => $currentMember->ID , 'ElectionID' => $CurrentElection->ID))->first(); // Fill in the form if ($Candidate) { $CandidateApplicationForm->loadDataFrom($Candidate, False); $CandidateApplicationForm->loadDataFrom($currentMember, False); return $CandidateApplicationForm; } elseif ($this->request->isPost()) { // SS is returning to the form controller to post data return $CandidateApplicationForm; } else { // No candidate for this member; create a new candidate entry $Candidate = new Candidate(); $Candidate->MemberID = $currentMember->ID; $Candidate->ElectionID = $CurrentElection->ID; $Candidate->write(); $CandidateApplicationForm->loadDataFrom($currentMember, False); return $CandidateApplicationForm; } } } // Save an edited candidate function save($data, $form) { $currentMember = Member::currentUser(); // A user is logged in if ($currentMember) { // Load the election system $Elections = ElectionSystem::get()->first(); $CurrentElection = $Elections->CurrentElection(); if ($Candidate = Candidate::get()->filter(array('MemberID' => $currentMember->ID , 'ElectionID' => $CurrentElection->ID))->first()) { // Candidate profile exists // Clean up entries //////////////// // Set up HTML Purifier $config = HTMLPurifier_Config::createDefault(); // Remove any CSS or inline styles $config->set('CSS.AllowedProperties', array()); $purifier = new HTMLPurifier($config); // Clean Bio field if ($data["Bio"]) { $currentMember->Bio = $purifier->purify($data["Bio"]); $currentMember->write(); } // Clean RelationshipToOpenStack field if ($toClean = $data["RelationshipToOpenStack"]) { $Candidate->RelationshipToOpenStack = $purifier->purify($toClean); } // Clean Experience field if ($toClean = $data["Experience"]) { $Candidate->Experience = $purifier->purify($toClean); } // Clean BoardsRole field if ($toClean = $data["BoardsRole"]) { $Candidate->BoardsRole = $purifier->purify($toClean); } // Clean HasAcceptedNomination field if ($toClean = $data["TopPriority"]) { $Candidate->TopPriority = $purifier->purify($toClean); } $Candidate->write(); $questions = array('Bio' => 'Bio','RelationshipToOpenStack' => 'RelationshipToOpenStack','Experience' => 'Experience' ,'BoardsRole' => 'BoardsRole' ,'TopPriority' => 'TopPriority'); // Must answer all questions, but can save work as they go, so we're going to check here rather than set up validators if( (strlen($data['Bio'])) < 4 || (strlen($data['RelationshipToOpenStack'])) < 4 || (strlen($data['Experience'])) < 4 || (strlen($data['BoardsRole'])) < 4 || (strlen($data['TopPriority'])) < 4 ) { $Candidate->HasAcceptedNomination = FALSE; $form->saveInto($Candidate); $Candidate->write(); $this->setMessage('Success', 'Your edits have been saved but you will need to provide full answers to all these questions to be eligible as a candidate.'); $this->redirectBack(); return; } $Candidate->HasAcceptedNomination = TRUE; $Candidate->write(); $this->setMessage('Success', 'Congratulations. You have accepted your nomination as a candidate. Good luck in the election!'); $this->redirect($this->Link() . 'election/'); } else { $this->setMessage('Error', 'There was an error saving your edits.'); $this->redirectBack(); } } } // Resigning membership in the foundation removes the member from the database entirely. function resign() { $CurrentMember = Member::currentUser(); if ($CurrentMember && isset($_GET['confirmed'])) { // Remove Member's Legal Agreements if ($LegalAgreements = LegalAgreement::get()->filter('MemberID', $CurrentMember->ID)) { foreach ($LegalAgreements->items as $item) { $item->delete(); } } // Remove member from Foundation group $CurrentMember->Groups()->remove(5); // Logout and delete the user $this->setMessage('Success', 'You have resigned your membership to the OpenStack Foundation.'); $this->redirect('profile/'); $CurrentMember->Delete(); } else if ($CurrentMember) { return $this->renderWith(array('EditProfilePage_resign', 'Page')); } } // Training // Helpers function Trainings(){ return new ArrayList($this->training_manager->getAllowedTrainings(Member::currentUser())); } function AddTrainingCourseForm() { Requirements::css(THIRDPARTY_DIR . '/jquery-ui-themes/smoothness/jquery-ui.css'); Requirements::javascript(THIRDPARTY_DIR . '/jquery-ui/jquery-ui.js'); Requirements::javascript("datepicker/javascript/datepicker.js"); Requirements::javascript('registration/javascript/edit.profile.training.form.js'); // Name Set $Name = new TextField('Name', "Name"); $Name->addExtraClass('course-name'); $Link = new TextField('Link', "Link"); $Link->addExtraClass('course-online-link url'); $Description = new TextareaField('Description', "Description"); $Description->addExtraClass('course-description'); $Online = new CheckboxField('Online', "Is Online?"); $Online->addExtraClass('course-online-checkbox'); $Paid = new CheckboxField('Paid', "Is Paid?"); $Level = new DropdownField('LevelID', 'Level', TrainingCourseLevel::get()->map('ID', 'Level') ); $Projects = new CheckboxSetField('Projects', '', Project::get()->map('ID', 'Name') ); $Program = new HiddenField('TrainingServiceID', "TrainingServiceID", $this->training_id); $Course = new HiddenField('ID', "course", 0); $show_blank_schedule = true; if(isset($this->EditCourseID)){ $locations_dto = $this->course_repository->getLocations($this->EditCourseID); for ($i = 0; $i < count($locations_dto); $i++) { $dto = $locations_dto[$i]; $show_blank_schedule = false; $City[$i] = new TextField('City[' . $i . ']', "City", $dto->getCity() ); $City[$i]->addExtraClass('city_name'); $State[$i] = new TextField('State[' . $i . ']', "State", $dto->getState()); $State[$i]->addExtraClass('state'); $Country[$i] = new DropdownField('Country[' . $i . ']', $dto->getCountry(), CountryCodes::$iso_3166_countryCodes, $dto->getCountry()); $Country[$i]->addExtraClass('country'); $LinkS[$i] = new TextField('LinkS[' . $i . ']', "Link", $dto->getLink()); $LinkS[$i]->addExtraClass('url'); $StartDate[$i] = new TextField('StartDate[' . $i . ']', "Start Date", is_null( $dto->getStartDate()) ? '' : $dto->getStartDate()); $StartDate[$i]->addExtraClass('dateSelector start'); $EndDate[$i] = new TextField('EndDate[' . $i . ']', "End Date", is_null($dto->getEndDate()) ? '' : $dto->getEndDate()); $EndDate[$i]->addExtraClass('dateSelector end'); } } if($show_blank_schedule) { $City = new TextField('City[]', "City"); $City->addExtraClass('city_name'); $State = new TextField('State[]', "State"); $State->addExtraClass('state'); $Country = new DropdownField('Country[]', 'Country', CountryCodes::$iso_3166_countryCodes ); $Country->addExtraClass('country'); $StartDate = new TextField('StartDate[]', "Start Date"); $StartDate->addExtraClass('dateSelector start'); $EndDate = new TextField('EndDate[]', "End Date"); $EndDate->addExtraClass('dateSelector end'); $LinkS = new TextField('LinkS[]', "Link"); $LinkS->addExtraClass('url'); } $fields = new FieldList( $Name, $Description, $Link, new LiteralField('break','
'), $Online, $Paid, $Level, $Program, $Course, new LiteralField('break','

'), new LiteralField('projects','

Projects

'), $Projects, new LiteralField('schedule','

Schedule

'), new LiteralField('instruction','

City, State and Country can\'t be edited when a course is marked Online.

'), new LiteralField('scheduleDiv','
') ); if(!$show_blank_schedule){ for($j=0;$j<$i;$j++){ $fields->push(new LiteralField('scheduleDiv','
')); $fields->push($City[$j]); $fields->push($State[$j]); $fields->push($Country[$j]); $fields->push($StartDate[$j]); $fields->push($EndDate[$j]); $fields->push($LinkS[$j]); $fields->push(new LiteralField('scheduleDiv','
')); } } else{ $fields->push(new LiteralField('scheduleDiv','
')); $fields->push($City); $fields->push($State); $fields->push($Country); $fields->push($StartDate); $fields->push($EndDate); $fields->push($LinkS); $fields->push(new LiteralField('scheduleDiv','
')); } $fields->push(new LiteralField('scheduleDivC','
')); $fields->push(new LiteralField('addSchedule','')); $actions = new FieldList( new FormAction('AddCourse', 'Submit') ); $validators = new ConditionalAndValidationRule(array(new RequiredFields('Name','Level'), new HtmlPurifierRequiredValidator('Description'))); $form = new Form($this, 'AddTrainingCourseForm', $fields, $actions, $validators); if(isset($this->EditCourseID)){ $form->loadDataFrom($this->course_repository->getById($this->EditCourseID)); unset($this->EditCourseID); } else{ $form->loadDataFrom($this->request->postVars()); } return $form; } /** * @param $data * @param $form */ function AddCourse($data,$form){ $config = HTMLPurifier_Config::createDefault(); $config->set('CSS.AllowedProperties', array()); $purifier = new HTMLPurifier($config); $data['Description'] = $purifier->purify($data['Description']); $this->course_manager->register($data); $this->redirect('training'); } function trainingEdit(){ $this->EditCourseID = intval($_GET['course_id']); return $this->renderWith(array('EditProfilePage_TrainingAddCourse', 'Page')); } function trainingDelete(){ $course_id = intval(Convert::raw2sql( @$_GET['course_id'])); if($course_id > 0 ) { $course = $this->course_repository->getBydId($course_id); $training = $course->training(); if(!Member::currentUser()->canEditTraining($training->getIdentifier())){ die(); } $this->course_manager->unRegister($course_id); } $this->redirect('training'); } // Views function training(){ Requirements::javascript('registration/javascript/edit.profile.training.js'); return $this->renderWith(array('EditProfilePage_Training', 'Page')); } function trainingAddCourse(){ if($this->request->postVars()){ $data = $this->request->postVars(); $training_id = $data['training_id']; }else{ $training_id = intval(@$_GET['training_id']); } // Validation if it belongs to the program if(Member::currentUser()->canEditTraining($training_id)){ $context = array('Training' => $this->training_repository->getById($training_id)); $this->training_id = $training_id; return $this->renderWith(array('EditProfilePage_TrainingAddCourse', 'Page'), $context); } else { echo "You are not allowed to do this."; die(); } } function getMarketPlaceManagerLink(){ $marketplace_admin_page = MarketPlaceAdminPage::get()->first(); return $marketplace_admin_page?$marketplace_admin_page->URLSegment:'#'; } function getNavActionsExtensions(){ $html = ''; $this->extend('getNavActionsExtensions',$html); return $html; } }