Skip to content

Commit

Permalink
[spalenque] - #10818 - google calendar synch for schedule events
Browse files Browse the repository at this point in the history
  • Loading branch information
santipalenque committed May 16, 2016
1 parent acaa390 commit 926385a
Show file tree
Hide file tree
Showing 18 changed files with 462 additions and 71 deletions.
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@
"fzaninotto/Faker": "^1.5",
"symfony/yaml": "~2.1|~3.0",
"phpoffice/phpexcel": "dev-master",
"tractorcow/silverstripe-fluent": "^3.2"
"tractorcow/silverstripe-fluent": "^3.2",
"google/apiclient": "1.*"

},
"require-dev": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ function updateExtraFields($item, array $extraFields)
{
$identifier = spl_object_hash($item);
//get extra fields by object
$extra_fields = $this->extra_fields[$identifier];
$extra_fields = (isset($this->extra_fields[$identifier])) ? $this->extra_fields[$identifier] : array();
foreach ($extraFields as $name => $value) {
$extra_fields[$name] = array();//reset it
array_push($extra_fields[$name], $value);
Expand Down
5 changes: 4 additions & 1 deletion sample._ss_environment.php
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,14 @@
//SOCIAL MEDIA
define('FB_APP_ID','');
// COA

define('COA_FILE_API_BASE_URL','');
define('COA_FILE_API_BASE_USER','');
define('COA_FILE_API_BASE_PASS','');

//GOOGLE CALENDAR
define('GAPI_CLIENT','');


global $_FILE_TO_URL_MAPPING;
$_FILE_TO_URL_MAPPING[''] = '';

11 changes: 11 additions & 0 deletions summit/code/extensions/AttendeeMember.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,17 @@ public function isOnMySchedule($event_id){
return $this->owner->getSummitAttendee($event->SummitID)->isScheduled(intval($event_id));
}

/**
* @param int $event_id
* @return string
*/
public function getGoogleCalEventId($event_id){
$event = SummitEvent::get()->byID($event_id);
if(is_null($event)) return false;
if(!$this->isAttendee($event->SummitID)) return false;
return $this->owner->getSummitAttendee($event->SummitID)->getGoogleCalEventId($event);
}

public function updateCMSFields(FieldList $fields)
{
$fields->removeByName("SummitAttendance");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ final class SummitAttendee extends DataObject implements ISummitAttendee
(
'Schedule' => array
(
'IsCheckedIn' => "Boolean",
'IsCheckedIn' => 'Boolean',
'GoogleCalEventId' => 'Varchar',
'AppleCalEventId' => 'Varchar'
),
);

Expand Down Expand Up @@ -267,6 +269,7 @@ protected function validate()
}
return $valid;
}

public function getAllowedSchedule()
{
$summit = $this->Summit();
Expand Down Expand Up @@ -343,4 +346,30 @@ public function setShareContactInfo($must_share)
$this->setField('SharedContactInfo', $must_share);
return $this;
}

/**
* @param ISummitEvent $event
* @return string
*/
public function getGoogleCalEventId(ISummitEvent $event)
{
$event_extra_fields = $this->Schedule()->getExtraData('SummitEvent',$event->getIdentifier());
return $event_extra_fields['GoogleCalEventId'];
}

/**
* @param ISummitEvent $event
* @param int $google_event_id
* @return string
*/
public function setGoogleCalEventId(ISummitEvent $event, $google_event_id)
{
AssociationFactory::getInstance()->getMany2ManyAssociation($this, 'Schedule')->updateExtraFields
(
$event,
array('GoogleCalEventId' => $google_event_id)
);
}


}
99 changes: 88 additions & 11 deletions summit/code/interfaces/restfull_api/SummitAppScheduleApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,18 @@ protected function authenticate() {
}

static $url_handlers = array(
'GET ' => 'getScheduleByDay',
'GET level' => 'getScheduleByLevel',
'GET track' => 'getScheduleByTrack',
'GET search' => 'getSearchResults',
'GET empty_spots' => 'getEmptySpots',
'GET full' => 'getFullSchedule',
'PUT $EventID!' => 'addToSchedule',
'DELETE $EventID!' => 'removeFromSchedule',
'POST $EventID!/feedback' => 'addFeedback',
'POST $EVENT_ID!/share' => 'shareEmail',
'GET ' => 'getScheduleByDay',
'GET level' => 'getScheduleByLevel',
'GET track' => 'getScheduleByTrack',
'GET search' => 'getSearchResults',
'GET empty_spots' => 'getEmptySpots',
'GET full' => 'getFullSchedule',
'PUT $EventID!/synch/$Target!/$CalEventID!' => 'synchEvent',
'PUT $EventID!' => 'addToSchedule',
'DELETE $EventID!/synch/$Target!' => 'unSynchEvent',
'DELETE $EventID!' => 'removeFromSchedule',
'POST $EventID!/feedback' => 'addFeedback',
'POST $EventID!/share' => 'shareEmail',
);

static $allowed_actions = array(
Expand All @@ -111,6 +113,8 @@ protected function authenticate() {
'addFeedback',
'getFullSchedule',
'shareEmail',
'synchEvent',
'unSynchEvent',
);

protected function getCacheKey(SS_HTTPRequest $request){
Expand Down Expand Up @@ -255,6 +259,7 @@ public function normalizeEvents($schedule, $summit) {
'category_group_ids' => array(),
'tags_id' => array(),
'own' => is_null($current_member) || !$is_attendee ? false : $current_member->isOnMySchedule($e->ID),
'gcal_id' => is_null($current_member) || !$is_attendee ? false : $current_member->getGoogleCalEventId($e->ID),
'favorite' => false,
'show' => true,
'headcount' => intval($e->HeadCount),
Expand Down Expand Up @@ -634,7 +639,7 @@ public function addFeedback(){
*/
public function shareEmail(SS_HTTPRequest $request){
try {
$event_id = intval($request->param('EVENT_ID'));
$event_id = intval($request->param('EventID'));
$event = $this->summitevent_repository->getById($event_id) ;
if(is_null($event)) throw new NotFoundEntityException('SummitEvent', sprintf(' id %s', $event_id));

Expand Down Expand Up @@ -737,4 +742,76 @@ public function getFullSchedule(SS_HTTPRequest $request)

return $this->saveJSONResponseToCache($request, $events)->ok($events);
}

public function synchEvent() {
try{
$summit_id = (int)$this->request->param('SUMMIT_ID');
$event_id = (int)$this->request->param('EventID');
$target = $this->request->param('Target');
$cal_event_id = $this->request->param('CalEventID');
$member = Member::currentUser();

if(is_null($member)) return $this->permissionFailure();

if(intval($summit_id) > 0)
$summit = $this->summit_repository->getById(intval($summit_id));
if(strtolower($summit_id) === 'current')
$summit = Summit::ActiveSummit();

if(is_null($summit))
return $this->notFound('summit not found!');

$this->schedule_manager->saveSynchId(Member::currentUserID(), $event_id, $target, $cal_event_id);

return $this->ok($cal_event_id);
}
catch(EntityValidationException $ex1){
SS_Log::log($ex1,SS_Log::WARN);
return $this->validationError($ex1->getMessages());
}
catch(NotFoundEntityException $ex2){
SS_Log::log($ex2,SS_Log::WARN);
return $this->notFound($ex2->getMessage());
}
catch(Exception $ex){
SS_Log::log($ex,SS_Log::ERR);
return $this->serverError();
}
}

public function unSynchEvent() {
try{
$summit_id = (int)$this->request->param('SUMMIT_ID');
$event_id = (int)$this->request->param('EventID');
$target = $this->request->param('Target');
$member = Member::currentUser();

if(is_null($member)) return $this->permissionFailure();

if(intval($summit_id) > 0)
$summit = $this->summit_repository->getById(intval($summit_id));
if(strtolower($summit_id) === 'current')
$summit = Summit::ActiveSummit();

if(is_null($summit))
return $this->notFound('summit not found!');

$this->schedule_manager->saveSynchId(Member::currentUserID(), $event_id, $target, '');

return $this->ok();
}
catch(EntityValidationException $ex1){
SS_Log::log($ex1,SS_Log::WARN);
return $this->validationError($ex1->getMessages());
}
catch(NotFoundEntityException $ex2){
SS_Log::log($ex2,SS_Log::WARN);
return $this->notFound($ex2->getMessage());
}
catch(Exception $ex){
SS_Log::log($ex,SS_Log::ERR);
return $this->serverError();
}
}

}
6 changes: 6 additions & 0 deletions summit/code/models/IAttendeeMember.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,10 @@ public function getCurrentSummitAttendee();
* @return ISummitAttendee|null
*/
public function getUpcomingSummitAttendee();

/**
* @param int $event_id
* @return string
*/
public function getGoogleCalEventId($event_id);
}
13 changes: 13 additions & 0 deletions summit/code/models/ISummitAttendee.php
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,17 @@ public function registerCheckInOnEvent(ISummitEvent $summit_event);
*/
public function setShareContactInfo($must_share);

/**
* @param ISummitEvent $event
* @return string
*/
public function getGoogleCalEventId(ISummitEvent $event);

/**
* @param ISummitEvent $event
* @param int $google_event_id
* @return string
*/
public function setGoogleCalEventId(ISummitEvent $event, $google_event_id);

}
40 changes: 40 additions & 0 deletions summit/code/models/managers/ScheduleManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -227,4 +227,44 @@ public function addFeedback($data)
});
}

/**
* @param $member_id
* @param $event_id
* @return mixed
*/
public function saveSynchId($member_id, $event_id, $target, $cal_event_id)
{

$this_var = $this;
$summitevent_repository = $this->summitevent_repository;
$attendee_repository = $this->attendee_repository;

return $this->tx_manager->transaction(function () use (
$this_var,
$member_id,
$event_id,
$target,
$cal_event_id,
$attendee_repository,
$summitevent_repository
) {

$event = $summitevent_repository->getById($event_id);
if (!$event) {
throw new NotFoundEntityException('Event', sprintf('id %s', $event_id));
}

$attendee = $attendee_repository->getByMemberAndSummit($member_id, $event->Summit()->getIdentifier());

if (!$attendee) {
throw new NotFoundEntityException('Attendee', sprintf('id %s', $event_id));
}

if ($target == 'google')
$attendee->setGoogleCalEventId($event, $cal_event_id);

return $cal_event_id;
});
}

}
4 changes: 4 additions & 0 deletions summit/code/pages/SummitAppSchedPage.php
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ public function init()
Requirements::javascript('themes/openstack/bower_assets/jquery-validate/dist/additional-methods.min.js');
Requirements::javascript('themes/openstack/javascript/urlfragment.jquery.js');
Requirements::javascript('themes/openstack/bower_assets/pure-templates/libs/pure.min.js');
// GOOGLE CALENDAR
Requirements::javascript('summit/javascript/schedule/google-calendar.js');
Requirements::javascript('https://apis.google.com/js/client.js?onload=checkAuth');

}

public function ViewEvent()
Expand Down
2 changes: 1 addition & 1 deletion summit/css/schedule-grid.css
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ a.navbar-brand.navbar-brand-month
color:#CDCDCD;
}

.my-schedule-container
.my-schedule-container, .gcal-synch-container
{
text-align: right;
}
Expand Down
50 changes: 50 additions & 0 deletions summit/javascript/schedule/calendar-synch.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@

var calendar_synch = riot.observable();
var schedule_api = require('./schedule-api.js');

calendar_synch.addEventToGoogleCalendar = function(summit_id, event)
{
var cal_event = {
'summary': event.title,
'location': event.location,
'description': event.abstract,
'start': {
'dateTime': event.start_datetime.replace(' ','T'),
'timeZone': 'America/Chicago'
},
'end': {
'dateTime': event.end_datetime.replace(' ','T'), //'2016-05-15T14:00:00-07:00'
'timeZone': 'America/Chicago'
},
'reminders': {
'useDefault': false,
'overrides': [
{'method': 'email', 'minutes': 24 * 60},
{'method': 'popup', 'minutes': 10}
]
}
};

var request = gapi.client.calendar.events.insert({
'calendarId': 'primary',
'resource': cal_event
});

request.execute(function(cal_event) {
calendar_synch.trigger('googleSynchComplete', summit_id, event.id, cal_event.id);
});
}

calendar_synch.removeEventFromGoogleCalendar = function(summit_id, event_id, cal_event_id)
{
var request = gapi.client.calendar.events.delete({
'calendarId': 'primary',
'eventId': cal_event_id
});

request.execute(function() {
calendar_synch.trigger('googleUnSynchComplete', summit_id, event_id);
});
}

module.exports = calendar_synch;
Loading

0 comments on commit 926385a

Please sign in to comment.