Example #1
0
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)
Example #2
0
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
Example #3
0
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)
Example #4
0
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)
Example #5
0
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
Example #6
0
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)
Example #7
0
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)
Example #8
0
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)