예제 #1
0
def filter(request):
    if request.method == "POST":
        minAge = request.POST['minAge']
        maxAge = request.POST['maxAge']
        gender = request.POST['gender']
        filteredList = []
        usersAge = []
        user = User.objects.get(username=request.session['username'])
        users = User.objects.exclude(username=user.username)
        for x in users:
            userDetails = User.objects.filter(username=x)
            usersAge.append(calculate_age(x.dob))

        counter = 0
        current = dt.now()
        if (minAge != ""):
            min_date = date(current.year - int(minAge), current.month,
                            current.day)
        if (maxAge != ""):
            max_date = date(current.year - int(maxAge), current.month,
                            current.day)

        if ((gender == "Both") & (minAge == "") & (maxAge == "")):
            #Get everyone but current user
            filteredUsers = User.objects.exclude(username=user.username)
        elif ((gender != "Both") & (minAge == "") & (maxAge == "")):
            #Get all the chosen gender excluding current user
            filteredUsers = User.objects.filter(gender=gender).exclude(
                username=user.username)
        elif ((gender == "Both") & (minAge != "") & (maxAge == "")):
            #Get all users older than min age exlcuding current user
            filteredUsers = User.objects.filter(dob__lte=min_date).exclude(
                username=user.username)
        elif ((gender == "Both") & (minAge == "") & (maxAge != "")):
            #Get all users less than max age exlcuding current user
            filteredUsers = User.objects.filter(dob__gte=max_date).exclude(
                username=user.username)
        elif ((gender != "Both") & (minAge != "") & (maxAge == "")):
            #Get all users older than min age and of selected gender exlcuding current user
            filteredUsers = User.objects.filter(
                dob__lte=min_date,
                gender=gender).exclude(username=user.username)
        elif ((gender != "Both") & (minAge == "") & (maxAge != "")):
            #Get all users less than max age and of selected gender exlcuding current user
            filteredUsers = User.objects.filter(
                dob__gte=max_date,
                gender=gender).exclude(username=user.username)
        elif ((gender == "Both") & (minAge != "") & (maxAge != "")):
            #Get users between max and min age excluding current user
            filteredUsers = User.objects.filter(
                dob__gte=max_date,
                dob__lte=min_date).exclude(username=user.username)
        else:
            #Get users between max and min age excluding current user
            filteredUsers = User.objects.filter(
                dob__gte=max_date, dob__lte=min_date,
                gender=gender).exclude(username=user.username)

        if not filteredUsers:
            message = "There are no users that satsify your requirements"
            return JsonResponse({
                'status': 'false',
                'message': message
            },
                                status=500)
        else:

            count = 0
            ranks = [0]
            filteredUsersNames = [""]
            filteredUsersEmails = [""]
            iterator = 0
            for x in filteredUsers:
                filteredUsersNames[iterator] = x.username
                count = count + 1

                for k in user.hobby.all():
                    for i in x.hobby.all():
                        if (k == i):
                            ranks[iterator] = ranks[iterator] + 1
                        else:
                            ranks[iterator] = ranks[iterator] + 0
                if (count != len(filteredUsers)):
                    iterator = iterator + 1
                    ranks.append(0)
                    filteredUsersNames.append("")

            ranks, filteredUsersNames = zip(
                *sorted(zip(ranks, filteredUsersNames), reverse=True))
            ranks, filteredUsersNames = (list(t) for t in zip(
                *sorted(zip(ranks, filteredUsersNames), reverse=True)))
            all_users_ranked_list = []
            for x in filteredUsersNames:
                all_users_ranked_list.append(User.objects.get(username=x))
                filteredUsersEmails.append(
                    (User.objects.get(username=x)).email)

            results = [User.as_json() for User in all_users_ranked_list]
            jsonUser = user.username
            json = {'users': results, 'curUser': jsonUser}
            return JsonResponse(json)