Пример #1
0
def get_tag_info(request, label):
    """
    Get the set of documents associated with a tag

    """
    return tag_as_json_dict(
        request.user.tags.get(label = label.rstrip().lower()),
        show_doc_count = True,
        show_documents = True,
        show_conversations = param_is_true(request.REQUEST.get('conversations', 'false')),
        show_url       = param_is_true(request.REQUEST.get('show_url', 'false')),
        relative_time  = param_is_true(request.REQUEST.get('relative_time', 'true')))
Пример #2
0
def get_tag_list(request):
    """
    Get a list of the user's tags, optionally starting with some
    initial pattern.  The request can specifiy whether it just wants
    the play list of labels (the default), or it can request the the
    number of documents belonging to the tag is included, plus the URL
    for each tag, plus document info for each tag.

    """
    exclude_prefix = request.REQUEST.get('notstartswith', None)
    prefix     = request.REQUEST.get('startswith', None)
    show_count = param_is_true(request.REQUEST.get('doc_count', 'false'))
    show_conversations = param_is_true(request.REQUEST.get('conversations', 'false'))
    show_message_bodies = param_is_true(request.REQUEST.get('message_bodies', 'false'))
    show_url   = param_is_true(request.REQUEST.get('url', 'false'))
    relative_time = param_is_true(request.REQUEST.get('relative_time', 'true'))

    if prefix:
        tag_set = request.user.tags.filter(label__istartswith=prefix.lower())
    else:
        tag_set = request.user.tags.all()

    if exclude_prefix:
        tag_set = set(tag_set)
        exclude_tag_set = set(request.user.tags.filter(label__istartswith=exclude_prefix.lower()))
        tag_set = tag_set.difference(exclude_tag_set)

    tag_list = list()

    for t in tag_set:
        if t.conversations.count() > 0:
            tag_list.append({'date': t.conversations.order_by('messages__date')[0].date, 'tag': t})
    tag_list.sort(reverse=True)

    return {
        'content' : [
            tag_as_json_dict(
                list_entry['tag'],
                date = list_entry['date'],
                show_doc_count = show_count,
                show_documents = False,
                show_conversations = show_conversations,
                show_message_bodies = show_message_bodies,
                show_url       = show_url,
                relative_time  = relative_time )
            for list_entry in tag_list ],
        }
Пример #3
0
def get_sync_event_list(request):
    """
    Get messages along with metadata
    """
    include_aggregates = param_is_true(request.REQUEST.get('aggregates', 'true'))
    include_contacts = param_is_true(request.REQUEST.get('contacts', 'true'))
    include_tags = param_is_true(request.REQUEST.get('tags', 'true'))
    include_body = param_is_true(request.REQUEST.get('body', 'true'))

    limit = int(request.REQUEST.get('limit', 10))

    # Accept with a query parameter or a header value
    modified_since = request.REQUEST.get('modified_since',
                                None) or request.META.get('If-Modified-Since',
                                            None)
                                
    # Convert the date parameters to datetime
    if modified_since:
        modified_since = float(modified_since)/1000000
        modified_since = datetime.datetime.fromtimestamp(modified_since)
        
    modified_before = request.REQUEST.get('modified_before', None)
    if modified_before:
        modified_before = float(modified_before)/1000000
        modified_before = datetime.datetime.fromtimestamp(modified_before)

    # messages modified since date X will be ordered by date.
    # this is to make sure that when we apply the 'limit' on the resultset 
    # the client is able to use the date of the most recent messages as 
    # the next value of modified_since
    #
    # inversely, when asking for messages modified before a given date, 
    # the messages are ordered in reverse chronological order to allow 
    # using the date of the last message as the next value of modified_before
    #
    # TODO figure out the case when all three values are provided - 
    # modified_before, modified_since and limit

    if modified_since and modified_before:
        messages = request.user.messages.filter(
                    status = models.Message.STATUS_READY, 
                    modified_date__gt = modified_since, 
                    modified_date__lt = modified_before).order_by('modified_date')
    elif modified_since:
        messages = request.user.messages.filter(
                    status = models.Message.STATUS_READY,
                    modified_date__gt = modified_since).order_by('modified_date')
    elif modified_before:
        messages = request.user.messages.filter(
                    status = models.Message.STATUS_READY,
                    modified_date__lt = modified_before).order_by('-date')
    else:
        messages = request.user.messages.all().order_by('modified_date')

    message_count = messages.count()
    messages = messages[:limit]

    aggregate_set = set()
    tag_set = set()
    contact_set = set()
    address_set = set()

    for message in messages:
        for aggregate in message.aggregates.all():
            aggregate_set.add(aggregate)
            tag_set.update(set(aggregate.tags.all()))
        address_set.update(set(message.to_addresses.all()))
        address_set.update(set(message.cc_addresses.all()))
        address_set.add(message.sender_address)

    for address in address_set:
        contact_set.add(address.contact)

    if not include_aggregates:
        aggregate_set = set()
    if not include_tags:
        tag_set = set()
    if not include_contacts:
        contacts_set = set()

    return {
            'message_count' : message_count,
            'message_limit' : limit,
            'messages' : [ message_as_json_dict(message, include_body)
                    for message in messages ],

            'aggregates' : [ aggregate_as_json_dict(aggregate, False)
                    for aggregate in aggregate_set ],
            'tags' : [ tag_as_json_dict(tag)
                    for tag in tag_set ],
            'contacts' : [ contact_as_json_dict(contact)
                    for contact in contact_set ],
    }