Пример #1
0
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'})
Пример #2
0
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))
Пример #3
0
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))