def view(request):
    page = 1
    pageLength = 10
    recherche = ""
    if request.method == 'POST':
        if request.POST['action'] == "search":
            page = request.POST['page']
            recherche = request.POST['rechercheField'].strip()

    Ex = Extra.objects.only
    Tour = Tournoi.objects.all()
    # Liste des user ordered et sans sois meme
    Use = User.objects.all().order_by('username').exclude(
        username=request.user.username)
    # On retire les staff et les admins
    Use = Use.exclude(is_staff=True).exclude(
        groups__name="Admin").exclude(groups__name="staff")

    if recherche != "":
        Use = Use.filter(
            Q(username__icontains=recherche) |
            Q(participant__nom__icontains=recherche) |
            Q(participant__prenom__icontains=recherche))

    # Utilisateur courant
    u = request.user

    # Recuperations des infos
    info = infoTournoi.objects.all()
    info = info.order_by("edition")[len(info) - 1]
    today = info.date

    # Tri de la liste

    # Libre samedi/dimanche
    libre_Samedi = True
    libre_Dimanche = True
    for elem in u.user1.all() or u.user2.all():
        if elem.tournoi.titre.jour == "Samedi":
            libre_Samedi = False
        else:
            libre_Dimanche = False

    famille_25 = yearsago(25, today.replace(month=1,day=1))
    famille_15 = yearsago(15, today.replace(month=1,day=1))

    querysets = list()
    # Liste contenant les utilisateurs pour le tournoi des familles
    famille_list = User.objects.none()
    if libre_Samedi:
        # Check tournoi des familles
        #- de 15 ans
        if u.participant.datenaissance >= famille_15:
            # On garde les utilisateur de + de 25 ans
            famille_list = Use.filter(
                participant__datenaissance__lte=famille_25)
            # On retire ceux qui ne sont pas libre le samedi
            famille_list = famille_list.exclude(user1__tournoi__titre__jour="Samedi").exclude(
                user2__tournoi__titre__jour="Samedi")
            querysets.append(famille_list)
        #+ de 25 ans
        elif u.participant.datenaissance <= famille_25:
            # On garde les utilisateur de - de 15 ans
            famille_list = Use.filter(
                participant__datenaissance__gte=famille_15)
            # On retire ceux qui ne sont pas libre le samedi
            famille_list = famille_list.exclude(user1__tournoi__titre__jour="Samedi").exclude(
                user2__tournoi__titre__jour="Samedi")
            querysets.append(famille_list)

    # Liste du samedi (except tournoi des familles)
    samedi_list = User.objects.none()
    if libre_Samedi:
        # On prend seulement les joueur du sexe opposé
        samedi_list = Use.exclude(participant__titre=u.participant.titre)
        # On retire ceux qui ne sont pas libre samedi
        samedi_list = samedi_list.exclude(user1__tournoi__titre__jour="Samedi").exclude(
            user2__tournoi__titre__jour="Samedi")
        querysets.append(samedi_list)

    # Liste du dimanche
    dimanche_list = User.objects.none()
    if libre_Dimanche:
        # On prend seulement les joueurs du meme sexe
        dimanche_list = Use.filter(participant__titre=u.participant.titre)
        # On retire ceux qui ne sont pas libre dimanche
        dimanche_list = dimanche_list.exclude(user1__tournoi__titre__jour="Dimanche").exclude(
            user2__tournoi__titre__jour="Dimanche")
        querysets.append(dimanche_list)

    debut = ((int(page) - 1) * pageLength) + 1
    fin = debut + (pageLength - 1)
    length = 0

    if len(querysets) > 0:
        # Merge query sets
        Use = list(set(list(itertools.chain(*querysets))))
        Use.sort(key=lambda x:x.username)
        length = len(Use)
        Use = Use[debut - 1:fin]
    else:
        Use = list()

    # calcul des ages des users
    born = request.user.participant.datenaissance
    request.user.age = today.year - born.year

    for u in Use:
        born = u.participant.datenaissance
        u.age = today.year - born.year

    if request.method == "POST":
        if request.POST['action'] == "formPair":
            # On recupère les donnée du formualaire
            username2 = request.POST['username2']
            comment1 = request.POST['remarque']
            title_tournoi = request.POST['title_tournoi']
            categorie_tournoi = request.POST['categorie_tournoi']
            if categorie_tournoi == "-":
                categorie_tournoi = title_tournoi
            # On recupere le tournoi en fonction du titre et de la categorie
            t = TournoiTitle.objects.get(nom=title_tournoi)
            c = TournoiCategorie.objects.get(nom=categorie_tournoi)
            tournois = Tournoi.objects.get(titre=t, categorie=c)
            extra = request.POST.getlist('extra')
            # On recupere les extras pris par l'utilisateur
            extra1 = list()
            for elem in extra:
                extra1.append(Extra.objects.get(id=elem))
            # On en déduit les extras non pris par l'utilisateur
            extranot1 = list()
            Ex = Extra.objects.all()
            for elem in Ex:
                contained = False
                for el in extra1:
                    if elem.id == el.id:
                        contained = True
                if contained == False:
                    extranot1.append(Extra.objects.get(id=elem.id))

            # On vérifie que l'utilisateur a bien rentré un deuxieme joueur
            if (username2 == ""):
                errorAdd = u"Veuillez rajouter un deuxième joueur pour votre pair"
                return render(request, 'inscriptionTournoi.html', locals())

            # On véririe qu'il ne s'est pas entré lui meme
            user1 = User.objects.get(username=request.user.username)
            user2 = User.objects.get(username=username2)

            if (user1 == user2):
                errorAdd = "Vous ne pouvez pas faire une pair avec vous meme"
                return render(request, 'inscriptionTournoi.html', locals())

            # Série de vérification pour que l'utilisateur ou son partenaire ne
            # soit pas inscrit dans un tournoi du meme jour
            user1Tournoi1 = user1.user1.all()
            user1Tournoi2 = user1.user2.all()

            user2Tournoi1 = user2.user1.all()
            user2Tournoi2 = user2.user2.all()

            for elem in user1Tournoi1:
                if(elem.tournoi.titre.jour == tournois.titre.jour):
                    errorAdd = u"Vous êtes déjà inscrit à un tournoi ce jour!"
                    return render(request, 'inscriptionTournoi.html', locals())

            for elem in user1Tournoi2:
                if(elem.tournoi.titre.jour == tournois.titre.jour):
                    errorAdd = u"Vous êtes déjà inscrit à un tournoi ce jour!"
                    return render(request, 'inscriptionTournoi.html', locals())

            for elem in user2Tournoi1:
                if(elem.tournoi.titre.jour == tournois.titre.jour and elem.confirm):
                    errorAdd = u"Le joueur 2 est déjà inscrit dans un tournoi ce jour!"
                    return render(request, 'inscriptionTournoi.html', locals())

            for elem in user2Tournoi2:
                if elem.tournoi.titre.jour == tournois.titre.jour and elem.confirm:
                    errorAdd = u"Le joueur 2 est déjà inscrit dans un tournoi ce jour!"
                    return render(request, 'inscriptionTournoi.html', locals())

            # On crée la pair
            pair = Pair(tournoi=tournois, user1=user1, user2=user2,
                        comment1=comment1, confirm=False, valid=False, pay=False)
            pair.save()
            # On rajoute les extras
            for elem in extra:
                ext = Extra.objects.get(id=elem)
                pair.extra1.add(ext)

            # Send mail
            send_confirmation_email_pair_registered(Participant.objects.get(
                user=pair.user1), Participant.objects.get(user=pair.user2))

            pair.save()
            return redirect(reverse(tournoi))

    if request.user.is_authenticated():
        extranot1 = Extra.objects.all()
        return render(request, 'inscriptionTournoi.html', locals())
    return redirect(reverse(home))
def view(request):
    page = 1
    pageLength = 10
    recherche = ""
    sexe = ""
    age_min = 0
    age_max = 100
    in_paire = ""
    veteran = ""
    if request.method == 'POST':
        page = request.POST['page']
        pageLength = int(request.POST['pagelength'])
        recherche = request.POST['rechercheField'].strip()
        sexe = request.POST['sex_selector']
        in_paire = request.POST['inpair']
        veteran = request.POST['veteran']
        age_min = int(request.POST['agemin'])
        age_max = int(request.POST['agemax'])

    Use = User.objects.all().order_by('username')
    users_logs = LogActivity.objects.filter(section="Utilisateur").order_by('-date')[:15]

    # recherche sexe
    if sexe != "":
        Use = Use.filter(participant__titre=sexe)
    # recherche veteran
    if veteran != "":
        if veteran == "True":
            Use = Use.filter(participant__oldparticipant=True)
        else:
            Use = Use.filter(participant__oldparticipant=False)

    date_min = yearsago(age_min)
    date_max = yearsago(age_max)

    # Recherche age min
    Use = Use.filter(participant__datenaissance__lte=date_min)

    # Recherceh age max
    Use = Use.filter(participant__datenaissance__gte=date_max)

    #recherche in paire
    if in_paire != "":
        if in_paire == "True":
            Use = Use.filter(Q(user1__confirm=True) | Q(user2__confirm=True))
        else:
            Use = Use.filter(
                ~(Q(user1__confirm=True) | Q(user2__confirm=True)))

    # recherche firld
    if recherche != "":
        Use = Use.filter(Q(username__icontains=recherche) | Q(
                participant__nom__icontains=recherche) | Q(participant__prenom__icontains=recherche))

    Use = Use.order_by("username")
    length = len(Use)
    debut = ((int(page) - 1) * pageLength) + 1
    fin = debut + (pageLength - 1)
    Use = Use[debut - 1:fin]

    ageRange = range(0, 100)

    today = date.today()
    for u in Use:
        born = u.participant.datenaissance
        u.age = today.year - born.year - \
            ((today.month, today.day) < (born.month, born.day))
        u1_list = u.user1.all()
        u2_list = u.user2.all()
        inPair = False
        for p in u1_list or u2_list:
            if p.confirm:
                inPair = True
                break
        u.inpaire = inPair

    if request.method == 'POST':
        if request.POST['action'] == "CSV":
            import csv
            from django.utils.encoding import smart_str
            response = HttpResponse(content_type='text/csv')
            response['Content-Disposition'] = 'attachment; filename=Utilisateurs.csv'
            writer = csv.writer(response, csv.excel)
            # BOM (optional...Excel needs it to open UTF-8 file properly)
            response.write(u'\ufeff'.encode('utf8'))
            writer.writerow([
                smart_str(u"Username"),
                smart_str(u"Titre"),
                smart_str(u"Nom"),
                smart_str(u"Prénom"),
                smart_str(u"Rue"),
                smart_str(u"Numéro"),
                smart_str(u"Boite"),
                smart_str(u"Codepostal"),
                smart_str(u"Localité"),
                smart_str(u"Latitude"),
                smart_str(u"Longitude"),
                smart_str(u"Téléphone"),
                smart_str(u"Fax"),
                smart_str(u"GSM"),
                smart_str(u"Date de naissance"),
                smart_str(u"Classement"),
                smart_str(u"Ancien participant"),
                smart_str(u"Classement vérifié"),
                smart_str(u"Compte activé")
            ])
            for obj in Use:
                writer.writerow([
                    smart_str(obj.username),
                    smart_str(obj.participant.titre),
                    smart_str(obj.participant.nom),
                    smart_str(obj.participant.prenom),
                    smart_str(obj.participant.rue),
                    smart_str(obj.participant.numero),
                    smart_str(obj.participant.boite),
                    smart_str(obj.participant.codepostal),
                    smart_str(obj.participant.localite),
                    smart_str(obj.participant.latitude),
                    smart_str(obj.participant.longitude),
                    smart_str(obj.participant.telephone),
                    smart_str(obj.participant.fax),
                    smart_str(obj.participant.gsm),
                    smart_str(obj.participant.datenaissance),
                    smart_str(obj.participant.classement),
                    smart_str(obj.participant.oldparticipant),
                    smart_str(obj.participant.isClassementVerified),
                    smart_str(obj.participant.isAccountActivated),
                ])
            return response
        if request.POST['action'] == "addr_list":
            import csv
            from django.utils.encoding import smart_str
            response = HttpResponse(content_type='text/csv')
            response['Content-Disposition'] = 'attachment; filename=Adresses.csv'
            writer = csv.writer(response, csv.excel)
            # BOM (optional...Excel needs it to open UTF-8 file properly)
            response.write(u'\ufeff'.encode('utf8'))
            writer.writerow([
                smart_str(u"Adresses"),
                smart_str(u"Personnes")
            ])
            adresses_personnes = {}
            for usr in Use:
                if usr.participant.getAdresse() not in adresses_personnes:
                    adresses_personnes[usr.participant.getAdresse()] = usr.participant.fullName()
                else:
                    adresses_personnes[usr.participant.getAdresse()] += u"," +usr.participant.fullName()
            for adresses, personnes in adresses_personnes.iteritems():
                writer.writerow([
                smart_str(adresses),
                smart_str(personnes)
                ])
            return response


    if request.user.is_authenticated():
        return render(request, 'staffUser.html', locals())
    return redirect(reverse(home))