def login_ws(request): """ This method would be used if a native app was built :url: /legals/m/login/real/ :param POST['email']: email :param POST['pin']: PIN of the user :param POST['lat']: latitude of the phone :param POST['lon']: longitude of the phone :rtype: JSON :: # `experiment` is the experimental group # 0: control group # 1: social group # 2: anonymous social group # `surveys` is the number of surveys that needs to be filled # login success {'result':'1', 'experiment': '0', 'surveys': '2'} # login failure {'result':'-1'} """ email = request.POST['email'] pin = hashlib.sha224(request.POST['pin']).hexdigest() user = authenticate(email=email, pin=pin) if user is not None: login(request, user) logger.debug( "User %s authenticated and logged in: "%email ) exp_group = user.experiment.id # TODO: check the number of surveys that needs to be filled out # log latitude and longitude if 'lat' in request.POST: event = EventBasic(user=user, experiment=user.experiment, action=EventBasic.LOGIN_TEST, latitude=float(request.POST['lat']), longitude=float(request.POST['lon'])) event.save() return JSONHttpResponse({'result': '1', 'experiment': str(exp_group), 'surveys':'2'}) else: return JSONHttpResponse({'result': '-1'})
def login_mobile(request): """ POST method that is used to login :url: /legals/m/login/ :param POST['lat']: latitude :param POST['lon']: longitude :param POST['udid']: udid :param POST['email']: email address :param POST['pin']: pin number :param POST['table']: table code """ # needed to load header icon header = "legals" restaurant = Store.objects.get(id=1) if request.method == "POST": email = request.POST['email'] pin = hashlib.sha224(request.POST['pin']).hexdigest() user = authenticate(email=email, pin=pin) lat = float(request.POST.get('lat',"0.0")) lon = float(request.POST.get('lon',"0.0")) if user is not None: # valid user login(request, user) logger.debug( "User %s authenticated and logged in with table code: %s "%(email, request.POST['table']) ) # check table code table = TableCode.objects.check_code(request.POST['table']) if table is None: # if table code is not usable logger.debug( "Table code is not valid: %s"%request.POST['table'] ) event = EventBasic(user=user, experiment=user.experiment, action=EventBasic.LOGIN_OUTSIDE, latitude=lat, longitude=lon, comment="Invalid table code: %s"%request.POST.get('table','no table code entered')) event.save() #just display plain menu #return HttpResponseRedirect("/legals/m/categories/0/") return render_to_response( "legals/i/login.html", { 'header': header, 'error': 'Table Code is Invalid', 'restaurant': restaurant, 'lat': lat, 'lon': lon, 'email': email, 'pin': request.POST.get("pin",""), }, context_instance=RequestContext(request)) ################################ # You are logged in successfully ################################ logger.debug( "Using table code %s"%table.code ) # Create an Order order = Order(user=user, table=table) order.save() event = EventBasic(user=user, order=order, experiment=table.experiment, table_code=table, action=EventBasic.LOGIN_VALID, latitude=lat, longitude=lon) event.save() # register iphone if 'udid' in request.POST: p, created = iPhone.objects.get_or_create(user=user) p.udid = request.POST['udid'] p.save() return HttpResponseRedirect("/legals/m/categories/%d/"%order.id) else: # not a valid user event = EventAccess(udid=request.POST['udid'], bad=True, latitude=lat, longitude=lon) event.save() return render_to_response( "legals/i/login.html", { 'header': header, 'error': 'Email or PIN did not validate', 'restaurant': restaurant, 'lat': lat, 'lon': lon, 'email': email, 'tablecode': request.POST.get('table', "") }, context_instance=RequestContext(request)) else: # not a valid URL return render_to_response("legals/i/login.html", { 'header': header, 'error': 'Invalid URL', 'restaurant': restaurant, 'lat': '', 'lon': '', 'email': email, 'pin': request.POST.get("pin", ""), 'tablecode': request.POST.get('table', ""), }, context_instance=RequestContext(request))
def my_order(request, order_id): """ View ordered items :url: /legals/m/myorder/(?P<order_id>\d+)/ """ header = "legals" restaurant = Store.objects.get(id=1) u = request.user o = Order.objects.get(id=order_id) exp_id = o.table.experiment.id item_reviews = o.items.all() logger.debug("View Orders: Listing order") event = EventBasic(user=u, order=o, experiment=u.experiment, action=EventBasic.MY_ORDER) event.save() i_data = {} # build menu items from my orders # 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("List My 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))