Skip to content

Commit

Permalink
Merge pull request #461 from ox-it/speaker-api-ical-3481
Browse files Browse the repository at this point in the history
Speaker api ical 3481
  • Loading branch information
markdoub committed May 6, 2016
2 parents 9c6fdd9 + c1f7a55 commit d436629
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 4 deletions.
51 changes: 51 additions & 0 deletions talks/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,57 @@ class Meta:
model = EventGroup
fields = ('_links', 'id', 'title', 'description', 'occurence', '_embedded')

class PersonLinksSerializer(serializers.ModelSerializer):
self = HALURICharField(source='get_api_url', read_only=True)
talks_page = HALURICharField(source='get_absolute_url', read_only=True)
ics = HALURICharField(source='get_ics_url', read_only=True)

class Meta:
model = Person
field = ('self', 'talks_page', 'ics')


class PersonEmbedsSerializer(serializers.ModelSerializer):
speaker_talks = serializers.SerializerMethodField()
hosting_talks = serializers.SerializerMethodField()
organising_talks = serializers.SerializerMethodField()

def get_speaker_talks(self, obj):
events = self.filterEvents(obj.speaker_events)
serializer = HALEventSerializer(events, many=True, read_only=True, context=self.context)
return serializer.data

def get_hosting_talks(self, obj):
events = self.filterEvents(obj.hosting_events)
serializer = HALEventSerializer(events, many=True, read_only=True, context=self.context)
return serializer.data

def get_organising_talks(self, obj):
events = self.filterEvents(obj.organising_events)
serializer = HALEventSerializer(events, many=True, read_only=True, context=self.context)
return serializer.data

def filterEvents(self, events):
if self.context.has_key('from-date') or self.context.has_key('to-date'):
if self.context['from-date']:
events = events.filter(start__gte=self.context['from-date'])
if self.context['to-date']:
events = events.filter(end__lte=self.context['to-date']+timedelta(1))
return events

class Meta:
model = Person
fields = ('speaker_talks', 'hosting_talks', 'organising_talks')


class HALPersonSerializer(serializers.ModelSerializer):
_links = PersonLinksSerializer(source='*', read_only=True)
_embedded = PersonEmbedsSerializer(source='*', read_only=True)

class Meta:
model = Person
fields = ('_links', 'slug', 'name', 'bio', 'email_address', 'web_address', '_embedded')


class CollectionLinksSerializer(serializers.ModelSerializer):
self = HALURICharField(source='get_api_url', read_only=True)
Expand Down
5 changes: 3 additions & 2 deletions talks/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from .views import (api_event_search_hal, api_event_search_ics, api_event_get, api_event_get_ics,
api_event_group, get_event_group, suggest_event_group, api_event_group_ics,
suggest_user, suggest_user_by_complete_email_address, suggest_person, api_create_person,
suggest_user, suggest_user_by_complete_email_address, api_person, api_person_ics, suggest_person, api_create_person,
save_item, remove_item, subscribe_to_list, unsubscribe_from_list, api_collection, api_collection_ics)


Expand All @@ -19,11 +19,12 @@
url(r'^user/suggest/exact$', suggest_user_by_complete_email_address, name='api-user-suggest-exact'),
url(r'^persons/new$', api_create_person, name='api-person-create'),
url(r'^persons/suggest$', suggest_person, name='api-person-suggest'),
url(r'^person/(?P<person_slug>[^/]+).ics', api_person_ics, name='api-person-ics'),
url(r'^person/(?P<person_slug>[^/]+)', api_person, name='api-person'),
url(r'^collections/add-item$', save_item, name="save-item"),
url(r'^collections/remove-item$', remove_item, name="remove-item"),
url(r'^collections/subscribe$', subscribe_to_list, name="subscribe-to-list"),
url(r'^collections/unsubscribe$', unsubscribe_from_list, name="unsubscribe-from-list"),
url(r'^collections/id/(?P<collection_slug>[^/]+).ics', api_collection_ics, name='api-collection-ics'),
url(r'^collections/id/(?P<collection_slug>[^/]+)', api_collection, name='api-collection'),
)

38 changes: 37 additions & 1 deletion talks/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
from talks.users.models import Collection, TalksUserCollection, CollectedDepartment, COLLECTION_ROLES_READER
from talks.api.serializers import (PersonSerializer, EventGroupSerializer, UserSerializer,
CollectionItemSerializer, TalksUserCollectionSerializer, get_item_serializer, HALEventSerializer,
HALEventGroupSerializer, HALSearchResultSerializer, EventSerializer, HALCollectionSerializer)
HALEventGroupSerializer, HALSearchResultSerializer, EventSerializer, HALCollectionSerializer,
HALPersonSerializer)
from talks.api.services import events_search, get_event_by_slug, get_eventgroup_by_slug
from talks.core.renderers import ICalRenderer
from talks.core.utils import parse_date
Expand All @@ -34,6 +35,7 @@ def has_permission(self, request, view):
return user_in_group_or_super(request.user)



# These views are typically used by ajax
@authentication_classes((SessionAuthentication,))
@permission_classes((IsAuthenticated, IsSuperuserOrContributor,))
Expand Down Expand Up @@ -294,6 +296,40 @@ def unsubscribe_from_list(request):
return Response({'error': "Failed to unsubscribe from collection"},
status=status.HTTP_404_NOT_FOUND)

@api_view(["GET"])
@renderer_classes((ICalRenderer,))
def api_person_ics(request, person_slug):
"""Get events for a person to be displayed as an ical feed
"""
try:
person = Person.objects.get(slug=person_slug)
today = date.today()
events = Event.objects.filter(personevent__person__slug=person_slug)

serializer = EventSerializer(events, many=True, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)

except ObjectDoesNotExist:
return Response({'error': "Person not found"},
status=status.HTTP_404_NOT_FOUND)

@api_view(["GET"])
def api_person(request, person_slug):
"""Get events associated with a person
"""
from_date = parse_date(request.GET.get('from', ''))
to_date = parse_date(request.GET.get('to', ''))
try:
person = Person.objects.get(slug=person_slug)
if from_date or to_date:
serializer = HALPersonSerializer(person, context={'request': request, 'from-date': from_date, 'to-date': to_date})
else:
serializer = HALPersonSerializer(person, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)

except ObjectDoesNotExist:
return Response({'error': "Person not found"},
status=status.HTTP_404_NOT_FOUND)

@api_view(["GET"])
@renderer_classes((ICalRenderer,))
Expand Down
17 changes: 17 additions & 0 deletions talks/events/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,12 @@ def __unicode__(self):
def get_absolute_url(self):
return reverse('show-person', args=[self.slug])

def get_api_url(self):
return reverse('api-person', args=[str(self.slug)])

def get_ics_url(self):
return reverse('api-person-ics', args=[str(self.slug)])

# @property
# def surname(self):
# # Attempt to extract the surname as the last word of the name. This will be used for sorting on
Expand All @@ -208,6 +214,17 @@ def speaker_events(self):
personevent__person__slug=self.slug)
return events

@property
def hosting_events(self):
events = Event.objects.filter(personevent__role=ROLES_HOST,
personevent__person__slug=self.slug)
return events

@property
def organising_events(self):
events = Event.objects.filter(personevent__role=ROLES_ORGANISER,
personevent__person__slug=self.slug)
return events

class TopicItem(models.Model):

Expand Down
3 changes: 2 additions & 1 deletion talks/templates/events/person.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
<h3 class="panel-title">
{{ person.name }}
<div class="formatting-links pull-right">
{% include "events/person_plain_text_link.html" %}
{% include "events/person_plain_text_link.html" %}
{% include "events/person_ics_link.html" %}
</div>
</h3>
</div>
Expand Down
5 changes: 5 additions & 0 deletions talks/templates/events/person_ics_link.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<!-- ical/ics link -->
<a class="formatting-link ics-link" href="/api/person/{{ person.slug }}.ics" title="Import this person's events into your calendar">
<span class="fa fa-lg fa-calendar" aria-hidden="true"></span>
<span class="formatting-link-text"></span>
</a>

0 comments on commit d436629

Please sign in to comment.