예제 #1
0
def fix_order( u, d, order_id, item_id):
    ord = Order.objects.get(id=order_id)
    exp_id = ord.table.experiment.id 

    # log to events
    item = MenuItem.objects.get(id=int(item_id))
    o = Order.objects.get(id=order_id)
    try:
        r = o.items.get(item=item)
        logger.debug("Already have %s on the order"%item.name)
        # already had ordered the item
    except MenuItemReview.DoesNotExist:
        logger.debug("Ordering %s"%item.name)
        # create a review
        r = MenuItemReview(item=item, rating=0, comment="Comments: click to edit")
        r.save()
        o.items.add(r)
        o.save()
        o.updated = d
        o.save()

    # log mark/order event
    people_ordered = item.menuitemreview_set.all().exclude(legals_ordered__user=u)
    event = EventMenuItem(user=u, 
            order=o,
            experiment=Experiment.objects.get(id=exp_id),
            item=item, 
            action=EventMenuItem.MARK,
            num_people=people_ordered.count())
    event.save()
    event.timestamp = d
    event.save()
예제 #2
0
def add_consider(u, d, order_id, item_id):
    ord = Order.objects.get(id=order_id)
    exp_id = ord.table.experiment.id 

    # log to events
    item = MenuItem.objects.get(id=int(item_id))
    o = Order.objects.get(id=order_id)

    # log consider event
    people_ordered = item.menuitemreview_set.all().exclude(legals_ordered__user=u)
    event = EventMenuItem(user=u, 
            order=o,
            experiment=Experiment.objects.get(id=exp_id),
            item=item, 
            action=EventMenuItem.CONSIDER,
            num_people=people_ordered.count())
    event.save()
    event.timestamp = d
    event.save()
예제 #3
0
def unmark_item(request, item_id, order_id):
    """
        Unmark an item to cancel order 

        :url: /legals/m/unmark/(?P<item_id>\d+)/(?<order_id>\d+)/
    """
    header = "legals"
    restaurant = Store.objects.get(id=1)

    u = request.user
    ord = Order.objects.get(id=order_id)
    exp_id = ord.table.experiment.id 

    # log to events
    item = MenuItem.objects.get(id=int(item_id))

    o = Order.objects.get(id=order_id)
    try:
        r = o.items.get(item=item)
        o.items.remove(r)
        o.save()
        o.last_update()
    except MenuItemReview.DoesNotExist:
        logger.debug("Already removed %s from order"%item.name)
        pass

    # log unmark/cancel event
    people_ordered = item.menuitemreview_set.all().exclude(legals_ordered__user=u)
    event = EventMenuItem(user=u, 
            order=o,
            experiment=Experiment.objects.get(id=exp_id),
            item=item, 
            action=EventMenuItem.UNMARK,
            num_people=people_ordered.count())
    event.save()

    i_data = {}
    # build menu items for this category
    # with who else liked it
    item_reviews = o.items.all()
    for r in item_reviews:
        #: contains item and other social metadata
        i_data[r.item.id] = {'item':r.item.get_json()}
        if exp_id == 3:
            numordered = r.item.menuitemreview_set.all().exclude(legals_ordered__user=u).count()
            if numordered == 0:
                i_data[r.item.id]['anonymous'] = ''
            elif numordered == 1: 
                i_data[r.item.id]['anonymous'] = '1 person ordered'
            else:
                i_data[r.item.id]['anonymous'] = '%d people ordered'%numordered

            numliked = r.item.menuitemreview_set.all().exclude(legals_ordered__user=u).filter(rating__gte=4).count()
            if numliked == 0:
                i_data[r.item.id]['aliked'] = ''
            elif numliked == 1: 
                i_data[r.item.id]['aliked'] = '1 person like this'
            else:
                i_data[r.item.id]['aliked'] = '%d people like this'%numordered

        elif exp_id in [2,4,5]:
            i_data[r.item.id]['friends'] = set()
            i_data[r.item.id]['fliked'] = set() 
        

    # Handle friends orders and reviews
    if exp_id in [2,4,5]:
        # get friends of user
        fb_id = request.user.facebook_profile.facebook_id
        friends = Friends.objects.get(facebook_id=fb_id).friends.values_list('facebook_id', flat=True)
        
        # get those items that friends have ordered 
        orders = Order.objects.filter(user__facebook_profile__facebook_id__in=friends)
        for o in orders:
            if o.num_items() > 0:
                for r in o.items.all():
                    # 2: friends
                    # 4: friends and popularity mixed
                    # 5: intervention
                    if r.item.id in i_data:
                        # friends that ordered the item
                        i_data[r.item.id]['friends'].add(o.user.first_name)
                        if r.rating >= MenuItemReview.GOOD:
                            i_data[r.item.id]['fliked'].add(o.user.first_name)
    
        for key,val in i_data.items(): 
            # arrange labels
            numfriends = len(val['friends'])
            numliked = len(val['fliked'])

            if exp_id == 4:
                # anonymous friends
                i_data[key]['friend_label']="%d friend(s) ordered"%numfriends
                if numliked > 0:
                    i_data[key]['fliked']="%d friend(s) like this"%numliked
            else:
                i = 0
                label = ''
                for f in val['friends']: 
                    i += 1 
                    if i == 3 and numfriends > 3:
                        label += f + ', ...'
                        # if there are more than three people, just show
                        # that there are more
                        break
                    elif i == numfriends:
                        label += f 
                    else:
                        label += f + ', '

                i_data[key]['friend_label']=label+" ordered"

    logger.debug("Unmark Order: Listing order")

    return render_to_response( "legals/i/order.html",
            {
            'header': header,
            'restaurant': restaurant,
            'order_data': i_data,
            'exp_id': int(exp_id),
            'experiments': [2,5],
            'order_id': int(order_id)
            },
            context_instance=RequestContext(request))
예제 #4
0
def item_reconsider(request, item_id, order_id):
    """
        Reconsider an ordered item, so it allows cancellation
        
        :url: /legals/m/reconsider/(?P<item_id>\d+)/(?<order_id>\d+)/
    """
    header = "legals"
    restaurant = Store.objects.get(id=1)

    ordered = True

    u = request.user
    if int(order_id) == 0:
        exp_id = 1
    else:
        ord = Order.objects.get(id=order_id)
        exp_id = ord.table.experiment.id 

    item = MenuItem.objects.get(id=item_id)
    o = Order.objects.get(id=order_id)

    #: initialize
    numordered = 0

    i_data = {}
    i_data['item'] = item.get_json()
    # build social data for this item
    # with who else liked it
    if exp_id == 3:
        numordered = item.menuitemreview_set.all().exclude(legals_ordered__user=u).count()
        numwanted = item.pre_favorite_dishes.all().count()
        if numordered == 0:
            i_data['anonymous'] = ''
        elif numordered == 1: 
            i_data['anonymous'] = '1 person ordered'
        else:
            i_data['anonymous'] = '%d people ordered'%numordered

        numliked = item.menuitemreview_set.all().exclude(legals_ordered__user=u).filter(rating__gte=4).count()
        if numliked == 0:
            i_data['aliked'] = ''
        elif numliked == 1: 
            i_data['aliked'] = '1 person like this'
        else:
            i_data['aliked'] = '%d people like this'%numordered

        if numwanted == 0:
            i_data['awanted'] = ''
        elif numwanted == 1: 
            i_data['awanted'] = '1 person wants this'
        else:
            i_data['awanted'] = '%d people want this'%numwanted

    elif exp_id in [2,4,5]:
        i_data['friends'] = set() 
        i_data['fliked'] = set() 
        i_data['fwanted'] = set()

    # Handle friends orders and reviews
    if exp_id in [2,4,5]:
        # get friends of user
        fb_id = request.user.facebook_profile.facebook_id
        friends = Friends.objects.get(facebook_id=fb_id).friends.values_list('facebook_id', flat=True)
        
        # get those items that friends have ordered 
        reviews = item.menuitemreview_set.filter(legals_ordered__user__facebook_profile__facebook_id__in=friends)
        for r in reviews:
            # 2: friends
            # 4: friends and popularity mixed
            # 5: intervention
            if r.item.id == int(i_data['item']['id']):
                # friends that ordered the item
                i_data['friends'].add(r.legals_ordered.all()[0].user.first_name)
                if r.rating >= MenuItemReview.GOOD:
                    i_data['fliked'].add(r.legals_ordered.all()[0].user.first_name)
                want_fb_ids = r.item.pre_favorite_dishes.filter(facebook_id__in=friends).values('facebook_id')
                for f in Friends.objects.filter(facebook_id__in=want_fb_ids):
                    if f.name:
                        i_data['fwanted'].add(f.name.split(" ")[0])

    if exp_id == 4:
        numordered = len(i_data['friends'])
        numliked = len(i_data['fliked'])
        numwanted = len(i_data['fwanted'])
        if numordered > 0:
            i_data['friends'] = "%d friend(s) ordered"%numordered
        else:
            i_data['friends'] = ''
        if numliked > 0:
            i_data['fliked'] = "%d friend(s) like this"%numliked
        else:
            i_data['fliked'] = ''
        if numwanted > 0:
            i_data['fwanted'] = "%d friend(s) want this"%numwanted
        else:
            i_data['fwanted'] = ''

    if exp_id == 5:
        i_data['alternative'] = []
        # create alternatives
        alt = {}
        alt['influencer'] = 'Ilya'
        alt['action'] = 'ordered'
        alt['alt_id'] = 65
        alt['alt_name'] = 'Crab Cake'
        alt['alt_save'] = 'save $3'
        alt['alt_health'] = '300 calories lower'
        i_data['alternative'].append(alt)

    if int(order_id) > 0:
        # convert set to list
        if exp_id in [2,5]:
            i_data['friends'] = list(i_data['friends'])
            i_data['fliked'] = list(i_data['fliked'])
            i_data['fwanted'] = list(i_data['fwanted'])

        event = EventMenuItem(user=u, 
                order=o,
                experiment=Experiment.objects.get(id=exp_id),
                item=item, 
                action=EventMenuItem.RECONSIDER,
                num_people=numordered,
                params=json.dumps(i_data))
    else:
        # user is just considering since cannot order
        event = EventMenuItem(user=u, 
                experiment=Experiment.objects.get(id=exp_id),
                item=item, 
                action=EventMenuItem.RECONSIDER)
 
    event.save()

    return render_to_response( "legals/i/reconsider.html",
            {
            'header': header,
            'restaurant': restaurant,
            'cat_id': item.category.id,
            'i': i_data,
            'exp_id': int(exp_id),
            'order_id': int(order_id),
            },
            context_instance=RequestContext(request)
            )