Esempio n. 1
0
def _set_ajax_widget_pins(request, widget):
    # Sets pinned items in a widget based a json structure
    # as described in ajax_widget_pins.
    #
    # Any existing pins are removed and replaced by the pins described in
    # the given structure.
    try:
        pin_info = json.loads(request.raw_post_data)
    except ValueError:
        logger.exception('bad json')
        return HttpResponse("Unable to parse json body", status=400)

    new_pins = []
    for pi in pin_info['items']:
        ni = NewsItem.objects.get(id=pi['id'])
        new_pin = PinnedItem(news_item=ni,
                             widget=widget,
                             item_number=pi['index'])
        expiration = None
        if pi.get('expiration_date'):
            try:
                expiration = datetime.datetime.strptime(
                    pi['expiration_date'], '%m/%d/%Y')
            except ValueError:
                return HttpResponse("unable to parse expiration date %s" %
                                    pi['expiration_date'],
                                    status=400)
        if pi.get('expiration_time', '').strip():
            if expiration is None:
                return HttpResponse(
                    "cannot specify expiration time without expiration date",
                    status=400)
            # Be slightly broad about time formats accepted.
            etime = pi['expiration_time'].replace(' ', '').lower()
            try:
                if etime.endswith('am') or etime.endswith('pm'):
                    etime = datetime.datetime.strptime(etime, '%I:%M%p')
                else:
                    # Assume it's 24-hour.
                    etime = datetime.datetime.strptime(etime, '%H:%M')
            except ValueError:
                return HttpResponse("unable to parse expiration time %s" %
                                    pi['expiration_time'],
                                    status=400)
            expiration = expiration.replace(hour=etime.hour,
                                            minute=etime.minute)

        if expiration is not None:
            new_pin.expiration_date = expiration
        new_pins.append(new_pin)

    # destroy current pins
    PinnedItem.objects.filter(widget=widget).delete()
    for pin in new_pins:
        pin.save()

    if len(new_pins) > 0:
        return HttpResponse(status=201)
    else:
        return HttpResponse(status=200)