示例#1
0
def memberid_sms(request):
    request_count = memberid_sms_count(request.META['REMOTE_ADDR'])
    if request_count > 10:
        return HttpResponse(json.dumps({'status': 'too_high_frequency'}))

    if request.user.get_phone_mobile() == '':
        # This shouldn't happen (it's checked client-side first) - but handle it anyway, just in case
        return HttpResponse(json.dumps({
            'status': 'missing_number'
        }))
    return HttpResponse(json.dumps(send_sms_receipt(request, request.user)))
示例#2
0
文件: views.py 项目: simensma/sherpa
def memberid_sms(request):
    """This is a membership service that lets you get your memberid by providing your phone number.
    Note that a lot of phone number entries in Focus are bogus (email, date of birth, or
    poorly formatted) and some are also foreign, which we allow for now.
    We are currently relying on the SMS service to fail if a bogus number
    happens to fall through."""

    # Robots etc, just redirect them
    if not 'phone_mobile' in request.POST:
        return redirect('membership.views.service')

    # Start recording this request - details will be filled underway
    sms_request = SMSServiceRequest()
    sms_request.phone_number_input = request.POST['phone_mobile']
    sms_request.ip = request.META['REMOTE_ADDR']
    if request.user.is_authenticated():
        sms_request.user = request.user

    sms_request.count = memberid_sms_count(request.META['REMOTE_ADDR'])
    if sms_request.count > 10 and request.META['REMOTE_ADDR'] not in settings.SMS_RESTRICTION_WHITELIST:
        sms_request.blocked = True
        sms_request.save()
        return HttpResponse(json.dumps({'status': 'too_high_frequency'}))

    users = lookup_users_by_phone(request.POST['phone_mobile'])
    if len(users) == 0:
        sms_request.save()
        return HttpResponse(json.dumps({'status': 'no_match'}))
    elif len(users) == 1:
        user = users[0]
    elif len(users) > 1:
        # Usually, this will be because household members have the same number as their parents.
        # Check if any of these are related, and in that case, use the parent.
        user = None
        for user_to_check in users:
            if user_to_check.is_household_member() and \
                    user_to_check.get_parent() is not None and \
                    user_to_check.get_parent() in users:
                # Ah, this parent is in the result set - probably the one we want, use it
                user = user_to_check.get_parent()
                break
        if user is None:
            # Multiple hits, and they are not related. What do? Pick a random hit for now.
            user = users[0]
    else:
        raise Exception("A negative number of actors resulted from raw query. This is very strange, please investigate immediately.")

    sms_request.memberid = user.memberid
    sms_request.save()

    # Delete the actor cache in case the number was recently updated; the cache may differ from our raw lookup above
    user.get_actor().clear_cache()
    return HttpResponse(json.dumps(send_sms_receipt(request, user)))
示例#3
0
def memberid_sms(request):
    """This membership service tries to send a membership receipt by SMS to the given phone number.
    Note that a lot of phone number entries in Focus are bogus (email, date of birth, or poorly
    formatted) and some are also foreign, which is allowed for now. We are currently relying on the
    SMS service to fail if a bogus number happens to fall through."""
    if 'phone_mobile' not in request.POST:
        raise PermissionDenied

    request_count = memberid_sms_count(request.META['REMOTE_ADDR'])
    if request_count > 10 and request.META['REMOTE_ADDR'] not in settings.SMS_RESTRICTION_WHITELIST:
        return HttpResponse(json.dumps({'status': 'too_high_frequency'}))

    users = lookup_users_by_phone(request.POST['phone_mobile'])
    if len(users) == 0:
        return HttpResponse(json.dumps({'status': 'no_match'}))
    elif len(users) == 1:
        user = users[0]
        # Delete the user cache in case the number was recently updated; the cache may differ from
        # our raw lookup above
        user.clear_cache()
        return HttpResponse(json.dumps(send_sms_receipt(request, user)))
    else:
        # Multiple matches. This is typically a number related to members of a single family. This
        # is fine, since the receipt will include all family members, regardless of who it's sent
        # to. However, if that's not the case, we need to send one SMS for each matched but
        # unrelated user.
        recipients = []
        for user in users:
            # If this user is not in the family of any other recipients, add them to the recipient
            # list
            if not any([r.has_family() and user in r.family.all_members() for r in recipients]):
                recipients.append(user)

        statuses = []
        for user in recipients:
            # Delete the user cache in case the number was recently updated; the cache may differ
            # from our raw lookup above
            user.clear_cache()
            statuses.append(send_sms_receipt(request, user)['status'])

        if all([s == 'ok' for s in statuses]):
            return HttpResponse(json.dumps({'status': 'ok'}))
        else:
            return HttpResponse(json.dumps({'status': 'service_fail'}))
示例#4
0
文件: views.py 项目: simensma/sherpa
def memberid_sms_userpage(request):
    # Requests from the userpage
    user = request.user

    sms_request = SMSServiceRequest(
        phone_number_input=None,
        ip=request.META['REMOTE_ADDR'],
        user=request.user,
        memberid=user.memberid
    )

    sms_request.count = memberid_sms_count(request.META['REMOTE_ADDR'])
    if sms_request.count > 10:
        sms_request.blocked = True
        sms_request.save()
        return HttpResponse(json.dumps({'status': 'too_high_frequency'}))

    if user.get_phone_mobile() == '':
        # This shouldn't happen (it's checked client-side first) - but handle it anyway, just in case
        return HttpResponse(json.dumps({
            'status': 'missing_number'
        }))
    sms_request.save()
    return HttpResponse(json.dumps(send_sms_receipt(request, user)))