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()
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()
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))
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) )