def api_collection(request, collection_slug): """Get events and event groups from a collection to be displayed :param collection_slug: collection slug :return: DRF response object """ # If from and to dates have been passed as request parameters, filter the events by those dates. from_date = parse_date(request.GET.get('from', '')) to_date = parse_date(request.GET.get('to', ''), from_date) try: collection = Collection.objects.get(slug=collection_slug) if collection.public: if from_date or to_date: serializer = HALCollectionSerializer(collection, context={ 'request': request, 'from-date': from_date, 'to-date': to_date }) else: serializer = HALCollectionSerializer( collection, context={'request': request}) return Response(serializer.data, status=status.HTTP_200_OK) else: return Response({'error': "Collection is not public"}, status=status.HTTP_403_FORBIDDEN) except ObjectDoesNotExist: return Response({'error': "Collection not found"}, status=status.HTTP_404_NOT_FOUND)
def events_search(parameters): """ Return a list of events based on the DRF Request object :param parameters: QueryDict in the same structure as a request.GET object :return QuerySet of Event """ queries = [] from_date = parse_date(parameters.get("from")) if not from_date: from_date = parse_date(parameters.get("start_date")) if not from_date: raise ParseError( detail= "'from' parameter is mandatory. Supply either 'today' or a date in form 'dd/mm/yy' or 'yyyy-mm-dd'." ) else: queries.append(Q(start__gt=from_date)) to_date = parse_date(parameters.get("to"), from_date) if to_date: queries.append(Q(start__lt=to_date + timedelta(1))) include_sub_departments = True subdepartments = parameters.get("subdepartments") if subdepartments and subdepartments == 'false': include_sub_departments = False # map between URL query parameters and their corresponding django ORM query list_parameters = { 'speaker': lambda speakers: Q(personevent__role=ROLES_SPEAKER, personevent__person__slug__in=speakers), 'venue': lambda venues: Q(location__in=venues), 'organising_department': lambda depts: Q(department_organiser__in=get_all_department_ids( depts, include_sub_departments)), 'topic': lambda topics: Q(topics__uri__in=topics), 'series': lambda series: Q(group__slug__in=series), 'seriesid': lambda seriesid: Q(group__id__in=seriesid) } for url_query_parameter, orm_mapping in list_parameters.items(): value = parameters.getlist(url_query_parameter) if value: queries.append(orm_mapping(value)) final_query = reduce(operator.and_, queries) events = Event.objects.filter(final_query).distinct().order_by('start') return events
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', ''), from_date) 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)
def api_event_group(request, event_group_slug): """Serialise an EventGroup :param request: DRF request object :param event_group_slug: event group slug :return: DRF response object """ eg = get_eventgroup_by_slug(event_group_slug) if not eg: return Response({'error': "Item not found"}, status=status.HTTP_404_NOT_FOUND) from_date = parse_date(request.GET.get('from', '')) to_date = parse_date(request.GET.get('to',''), from_date) if from_date or to_date: serializer = HALEventGroupSerializer(eg, context={'request': request, 'from-date': from_date, 'to-date': to_date}) else: serializer = HALEventGroupSerializer(eg, context={'request': request}) return Response(serializer.data, status=status.HTTP_200_OK)
def events_search(parameters): """ Return a list of events based on the DRF Request object :param parameters: QueryDict in the same structure as a request.GET object :return QuerySet of Event """ queries = [] from_date = parse_date(parameters.get("from")) if not from_date: from_date = parse_date(parameters.get("start_date")) if not from_date: raise ParseError(detail="'from' parameter is mandatory. Supply either 'today' or a date in form 'dd/mm/yy' or 'yyyy-mm-dd'.") else: queries.append(Q(start__gt=from_date)) to_date = parse_date(parameters.get("to"), from_date) if to_date: queries.append(Q(start__lt=to_date+timedelta(1))) include_sub_departments = True subdepartments = parameters.get("subdepartments") if subdepartments and subdepartments == 'false': include_sub_departments = False # map between URL query parameters and their corresponding django ORM query list_parameters = { 'speaker': lambda speakers: Q(personevent__role=ROLES_SPEAKER, personevent__person__slug__in=speakers), 'venue': lambda venues: Q(location__in=venues), 'organising_department': lambda depts: Q(department_organiser__in=get_all_department_ids(depts, include_sub_departments)), 'topic': lambda topics: Q(topics__uri__in=topics), 'series': lambda series: Q(group__slug__in=series), 'seriesid': lambda seriesid: Q(group__id__in=seriesid) } for url_query_parameter, orm_mapping in list_parameters.iteritems(): value = parameters.getlist(url_query_parameter) if value: queries.append(orm_mapping(value)) final_query = reduce(operator.and_, queries) events = Event.objects.filter(final_query).distinct().order_by('start') return events
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', ''), from_date) 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)
def api_event_group(request, event_group_slug): """Serialise an EventGroup :param request: DRF request object :param event_group_slug: event group slug :return: DRF response object """ eg = get_eventgroup_by_slug(event_group_slug) if not eg: return Response({'error': "Item not found"}, status=status.HTTP_404_NOT_FOUND) from_date = parse_date(request.GET.get('from', '')) to_date = parse_date(request.GET.get('to', ''), from_date) if from_date or to_date: serializer = HALEventGroupSerializer(eg, context={ 'request': request, 'from-date': from_date, 'to-date': to_date }) else: serializer = HALEventGroupSerializer(eg, context={'request': request}) return Response(serializer.data, status=status.HTTP_200_OK)
def api_collection(request, collection_slug): """Get events and event groups from a collection to be displayed :param collection_slug: collection slug :return: DRF response object """ # If from and to dates have been passed as request parameters, filter the events by those dates. from_date = parse_date(request.GET.get('from', '')) to_date = parse_date(request.GET.get('to', ''), from_date) try: collection = Collection.objects.get(slug=collection_slug) if collection.public: if from_date or to_date: serializer = HALCollectionSerializer(collection, context={'request': request, 'from-date': from_date, 'to-date': to_date}) else: serializer = HALCollectionSerializer(collection, context={'request': request}) return Response(serializer.data, status=status.HTTP_200_OK) else: return Response({'error': "Collection is not public"}, status=status.HTTP_403_FORBIDDEN) except ObjectDoesNotExist: return Response({'error': "Collection not found"}, status=status.HTTP_404_NOT_FOUND)