mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-23 11:53:12 +00:00
Gros nettoyage de code + virer les filtres sur l'état de connexion
This commit is contained in:
parent
60c77de27a
commit
d37099f11c
3 changed files with 234 additions and 141 deletions
|
@ -22,19 +22,76 @@
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.db.models import Q
|
from django.db import models
|
||||||
from simple_search import BaseSearchForm
|
from django import forms
|
||||||
|
from django.forms import Form
|
||||||
|
from django.forms import ModelForm
|
||||||
|
|
||||||
from users.models import User, School
|
CHOICES_USER = (
|
||||||
|
('0', 'Actifs'),
|
||||||
class UserSearchForm(BaseSearchForm):
|
('1', 'Désactivés'),
|
||||||
class Meta:
|
('2', 'Archivés'),
|
||||||
base_qs = User.objects
|
|
||||||
search_fields = ('^name', 'description', 'specifications', '=id')
|
|
||||||
|
|
||||||
# assumes a fulltext index has been defined on the fields
|
|
||||||
# 'name,description,specifications,id'
|
|
||||||
fulltext_indexes = (
|
|
||||||
('name', 2), # name matches are weighted higher
|
|
||||||
('name,description,specifications,id', 1),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
CHOICES_AFF = (
|
||||||
|
('0', 'Utilisateurs'),
|
||||||
|
('1', 'Machines'),
|
||||||
|
('2', 'Factures'),
|
||||||
|
('3', 'Bannissements'),
|
||||||
|
('4', 'Accès à titre gracieux'),
|
||||||
|
('6', 'Switchs'),
|
||||||
|
('5', 'Ports'),
|
||||||
|
)
|
||||||
|
|
||||||
|
def initial_choices(c):
|
||||||
|
return [i[0] for i in c]
|
||||||
|
|
||||||
|
|
||||||
|
class SearchForm(Form):
|
||||||
|
q = forms.CharField(label = 'Search', max_length = 100)
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
cleaned_data = super(SearchForm, self).clean()
|
||||||
|
q = cleaned_data.get('q', '')
|
||||||
|
|
||||||
|
|
||||||
|
class SearchFormPlus(Form):
|
||||||
|
q = forms.CharField(
|
||||||
|
label = 'Search',
|
||||||
|
max_length = 100,
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
u = forms.MultipleChoiceField(
|
||||||
|
label="Filtre utilisateurs",
|
||||||
|
required=False,
|
||||||
|
widget=forms.CheckboxSelectMultiple,
|
||||||
|
choices=CHOICES_USER,
|
||||||
|
initial=initial_choices(CHOICES_USER)
|
||||||
|
)
|
||||||
|
a = forms.MultipleChoiceField(
|
||||||
|
label="Filtre affichage",
|
||||||
|
required=False,
|
||||||
|
widget=forms.CheckboxSelectMultiple,
|
||||||
|
choices=CHOICES_AFF,
|
||||||
|
initial=initial_choices(CHOICES_AFF)
|
||||||
|
)
|
||||||
|
s = forms.DateField(
|
||||||
|
required=False,
|
||||||
|
label="Date de début",
|
||||||
|
help_text='DD/MM/YYYY',
|
||||||
|
input_formats=['%d/%m/%Y']
|
||||||
|
)
|
||||||
|
e = forms.DateField(
|
||||||
|
required=False,
|
||||||
|
help_text='DD/MM/YYYY',
|
||||||
|
input_formats=['%d/%m/%Y'],
|
||||||
|
label="Date de fin"
|
||||||
|
)
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
cleaned_data = super(SearchFormPlus, self).clean()
|
||||||
|
q = cleaned_data.get('q')
|
||||||
|
u = cleaned_data.get('u')
|
||||||
|
a = cleaned_data.get('a')
|
||||||
|
s = cleaned_data.get('s')
|
||||||
|
e = cleaned_data.get('e')
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
# -*- mode: python; coding: utf-8 -*-
|
|
||||||
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
|
||||||
# se veut agnostique au réseau considéré, de manière à être installable en
|
|
||||||
# quelques clics.
|
|
||||||
#
|
|
||||||
# Copyright © 2017 Gabriel Détraz
|
|
||||||
# Copyright © 2017 Goulven Kermarec
|
|
||||||
# Copyright © 2017 Augustin Lemesle
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import models
|
|
||||||
from django import forms
|
|
||||||
from django.forms import Form
|
|
||||||
from django.forms import ModelForm
|
|
||||||
|
|
||||||
CHOICES_USER = (
|
|
||||||
('0', 'Actifs'),
|
|
||||||
('1', 'Désactivés'),
|
|
||||||
('2', 'Archivés'),
|
|
||||||
)
|
|
||||||
|
|
||||||
CHOICES_CO = (
|
|
||||||
(1, 'Active'),
|
|
||||||
("", 'Désactivée'),
|
|
||||||
)
|
|
||||||
|
|
||||||
CHOICES_AFF = (
|
|
||||||
('0', 'Utilisateurs'),
|
|
||||||
('1', 'Machines'),
|
|
||||||
('2', 'Factures'),
|
|
||||||
('3', 'Bannissements'),
|
|
||||||
('4', 'Accès à titre gracieux'),
|
|
||||||
('6', 'Switchs'),
|
|
||||||
('5', 'Ports'),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class SearchForm(Form):
|
|
||||||
query = forms.CharField(label = 'Search', max_length = 100)
|
|
||||||
|
|
||||||
class SearchFormPlus(Form):
|
|
||||||
query = forms.CharField(label = 'Search', max_length = 100, required=False)
|
|
||||||
user_state = forms.MultipleChoiceField(label="Filtre utilisateurs", required=False, widget =forms.CheckboxSelectMultiple,choices=CHOICES_USER)
|
|
||||||
co_state = forms.MultipleChoiceField(label="Filtre connexion", required=False, widget =forms.CheckboxSelectMultiple,choices=CHOICES_CO)
|
|
||||||
aff = forms.MultipleChoiceField(label="Filtre affichage", required=False, widget =forms.CheckboxSelectMultiple,choices=CHOICES_AFF)
|
|
||||||
start = forms.DateField(required=False, label="Date de début", help_text='DD/MM/YYYY', input_formats=['%d/%m/%Y'])
|
|
||||||
end = forms.DateField(required=False, help_text='DD/MM/YYYY', input_formats=['%d/%m/%Y'], label="Date de fin")
|
|
230
search/views.py
230
search/views.py
|
@ -37,93 +37,191 @@ from users.models import User, Ban, Whitelist
|
||||||
from machines.models import Machine, Interface
|
from machines.models import Machine, Interface
|
||||||
from topologie.models import Port, Switch
|
from topologie.models import Port, Switch
|
||||||
from cotisations.models import Facture
|
from cotisations.models import Facture
|
||||||
from search.models import SearchForm, SearchFormPlus
|
|
||||||
from preferences.models import GeneralOption
|
from preferences.models import GeneralOption
|
||||||
|
from search.forms import (
|
||||||
|
SearchForm,
|
||||||
|
SearchFormPlus,
|
||||||
|
CHOICES_USER,
|
||||||
|
CHOICES_AFF,
|
||||||
|
initial_choices
|
||||||
|
)
|
||||||
|
|
||||||
def search_result(search_form, type, request):
|
def get_results(query, request, filters={}):
|
||||||
start = None
|
start = filters.get('s', None)
|
||||||
end = None
|
end = filters.get('e', None)
|
||||||
user_state = []
|
user_state = filters.get('u', initial_choices(CHOICES_USER))
|
||||||
co_state = []
|
aff = filters.get('a', initial_choices(CHOICES_AFF))
|
||||||
aff = []
|
|
||||||
if(type):
|
options, created = GeneralOption.objects.get_or_create()
|
||||||
aff = search_form.cleaned_data['aff']
|
max_result = options.search_display_page
|
||||||
co_state = search_form.cleaned_data['co_state']
|
|
||||||
user_state = search_form.cleaned_data['user_state']
|
user_state_filter = Q()
|
||||||
start = search_form.cleaned_data['start']
|
|
||||||
end = search_form.cleaned_data['end']
|
|
||||||
date_query = Q()
|
|
||||||
if aff==[]:
|
|
||||||
aff = ['0','1','2','3','4','5','6']
|
|
||||||
if start != None:
|
|
||||||
date_query = date_query & Q(date__gte=start)
|
|
||||||
if end != None:
|
|
||||||
date_query = date_query & Q(date__lte=end)
|
|
||||||
search = search_form.cleaned_data['query']
|
|
||||||
query1 = Q()
|
|
||||||
for s in user_state:
|
for s in user_state:
|
||||||
query1 = query1 | Q(state = s)
|
user_state_filter |= Q(state = s)
|
||||||
|
|
||||||
connexion = []
|
connexion = []
|
||||||
|
|
||||||
recherche = {'users_list': None, 'machines_list' : [], 'facture_list' : None, 'ban_list' : None, 'white_list': None, 'port_list': None, 'switch_list': None}
|
results = {
|
||||||
|
'users_list': User.objects.none(),
|
||||||
|
'machines_list' : Machine.objects.none(),
|
||||||
|
'facture_list' : Facture.objects.none(),
|
||||||
|
'ban_list' : Ban.objects.none(),
|
||||||
|
'white_list': Whitelist.objects.none(),
|
||||||
|
'port_list': Port.objects.none(),
|
||||||
|
'switch_list': Switch.objects.none()
|
||||||
|
}
|
||||||
|
|
||||||
if request.user.has_perms(('cableur',)):
|
users_filter = Q(
|
||||||
query = Q(user__pseudo__icontains = search) | Q(user__adherent__name__icontains = search) | Q(user__surname__icontains = search)
|
user__pseudo__icontains = query
|
||||||
else:
|
) | Q(
|
||||||
query = (Q(user__pseudo__icontains = search) | Q(user__adherent__name__icontains = search) | Q(user__surname__icontains = search)) & Q(user = request.user)
|
user__adherent__name__icontains = query
|
||||||
|
) | Q(
|
||||||
|
user__surname__icontains = query
|
||||||
for i in aff:
|
)
|
||||||
if i == '0':
|
|
||||||
query_user_list = Q(adherent__room__name__icontains = search) | Q(club__room__name__icontains = search) | Q(pseudo__icontains = search) | Q(adherent__name__icontains = search) | Q(surname__icontains = search) & query1
|
|
||||||
if request.user.has_perms(('cableur',)):
|
|
||||||
recherche['users_list'] = User.objects.filter(query_user_list).order_by('state', 'surname').distinct()
|
|
||||||
else :
|
|
||||||
recherche['users_list'] = User.objects.filter(query_user_list & Q(id=request.user.id)).order_by('state', 'surname').distinct()
|
|
||||||
if i == '1':
|
|
||||||
query_machine_list = Q(machine__user__pseudo__icontains = search) | Q(machine__user__adherent__name__icontains = search) | Q(machine__user__surname__icontains = search) | Q(mac_address__icontains = search) | Q(ipv4__ipv4__icontains = search) | Q(domain__name__icontains = search) | Q(domain__related_domain__name__icontains = search)
|
|
||||||
if request.user.has_perms(('cableur',)):
|
|
||||||
data = Interface.objects.filter(query_machine_list).distinct()
|
|
||||||
else:
|
|
||||||
data = Interface.objects.filter(query_machine_list & Q(machine__user__id = request.user.id)).distinct()
|
|
||||||
for d in data:
|
|
||||||
recherche['machines_list'].append(d.machine)
|
|
||||||
if i == '2':
|
|
||||||
recherche['facture_list'] = Facture.objects.filter(query & date_query).distinct()
|
|
||||||
if i == '3':
|
|
||||||
recherche['ban_list'] = Ban.objects.filter(query).distinct()
|
|
||||||
if i == '4':
|
|
||||||
recherche['white_list'] = Whitelist.objects.filter(query).distinct()
|
|
||||||
if i == '5':
|
|
||||||
recherche['port_list'] = Port.objects.filter(details__icontains = search).distinct()
|
|
||||||
if not request.user.has_perms(('cableur',)):
|
if not request.user.has_perms(('cableur',)):
|
||||||
recherche['port_list'] = None
|
users_filter &= Q(user = request.user)
|
||||||
if i == '6':
|
|
||||||
recherche['switch_list'] = Switch.objects.filter(details__icontains = search).distinct()
|
# Users
|
||||||
|
if '0' in aff:
|
||||||
|
filter_user_list = Q(
|
||||||
|
adherent__room__name__icontains = query
|
||||||
|
) | Q(
|
||||||
|
club__room__name__icontains = query
|
||||||
|
) | Q(
|
||||||
|
pseudo__icontains = query
|
||||||
|
) | Q(
|
||||||
|
adherent__name__icontains = query
|
||||||
|
) | Q(
|
||||||
|
surname__icontains = query
|
||||||
|
) & user_state_filter
|
||||||
if not request.user.has_perms(('cableur',)):
|
if not request.user.has_perms(('cableur',)):
|
||||||
recherche['switch_list'] = None
|
filter_user_list &= Q(id=request.user.id)
|
||||||
options, created = GeneralOption.objects.get_or_create()
|
results['users_list'] = User.objects.filter(
|
||||||
search_display_page = options.search_display_page
|
filter_user_list
|
||||||
|
).order_by('state', 'surname').distinct()[:max_result]
|
||||||
|
|
||||||
for r in recherche:
|
# Machines
|
||||||
if recherche[r] != None:
|
if '1' in aff:
|
||||||
recherche[r] = recherche[r][:search_display_page]
|
filter_machine_list = Q(
|
||||||
|
user__pseudo__icontains = query
|
||||||
|
) | Q(
|
||||||
|
user__adherent__name__icontains = query
|
||||||
|
) | Q(
|
||||||
|
user__surname__icontains = query
|
||||||
|
) | Q(
|
||||||
|
interface__mac_address__icontains = query
|
||||||
|
) | Q(
|
||||||
|
interface__ipv4__ipv4__icontains = query
|
||||||
|
) | Q(
|
||||||
|
interface__domain__name__icontains = query
|
||||||
|
) | Q(
|
||||||
|
interface__domain__related_domain__name__icontains = query
|
||||||
|
)
|
||||||
|
if not request.user.has_perms(('cableur',)):
|
||||||
|
filter_machine_list &= Q(machine__user__id=request.user.id)
|
||||||
|
results['machines_list'] = Machine.objects.filter(
|
||||||
|
filter_machine_list
|
||||||
|
).order_by('name').distinct()[:max_result]
|
||||||
|
|
||||||
recherche.update({'max_result': search_display_page})
|
# Factures
|
||||||
|
if '2' in aff:
|
||||||
|
date_filter = Q()
|
||||||
|
if start != None:
|
||||||
|
date_filter &= Q(date__gte=start)
|
||||||
|
if end != None:
|
||||||
|
date_filter &= Q(date__lte=end)
|
||||||
|
results['facture_list'] = Facture.objects.filter(
|
||||||
|
users_filter & date_filter
|
||||||
|
).order_by('date').distinct()[:max_result]
|
||||||
|
|
||||||
return recherche
|
# Bans
|
||||||
|
if '3' in aff:
|
||||||
|
date_filter = Q()
|
||||||
|
if start != None:
|
||||||
|
date_filter &= (
|
||||||
|
Q(date_start__gte=start) & Q(date_end__gte=start)
|
||||||
|
) | (
|
||||||
|
Q(date_start__lte=start) & Q(date_end__gte=start)
|
||||||
|
) | (
|
||||||
|
Q(date_start__gte=start) & Q(date_end__lte=start)
|
||||||
|
)
|
||||||
|
if end != None:
|
||||||
|
date_filter &= (
|
||||||
|
Q(date_start__lte=end) & Q(date_end__lte=end)
|
||||||
|
) | (
|
||||||
|
Q(date_start__lte=end) & Q(date_end__gte=end)
|
||||||
|
) | (
|
||||||
|
Q(date_start__gte=end) & Q(date_end__lte=end)
|
||||||
|
)
|
||||||
|
results['ban_list'] = Ban.objects.filter(
|
||||||
|
users_filter & date_filter
|
||||||
|
).order_by('date_end').distinct()[:max_result]
|
||||||
|
|
||||||
|
# Whitelists
|
||||||
|
if '4' in aff:
|
||||||
|
date_filter = Q()
|
||||||
|
if start != None:
|
||||||
|
date_filter &= (
|
||||||
|
Q(date_start__gte=start) & Q(date_end__gte=start)
|
||||||
|
) | (
|
||||||
|
Q(date_start__lte=start) & Q(date_end__gte=start)
|
||||||
|
) | (
|
||||||
|
Q(date_start__gte=start) & Q(date_end__lte=start)
|
||||||
|
)
|
||||||
|
if end != None:
|
||||||
|
date_filter &= (
|
||||||
|
Q(date_start__lte=end) & Q(date_end__lte=end)
|
||||||
|
) | (
|
||||||
|
Q(date_start__lte=end) & Q(date_end__gte=end)
|
||||||
|
) | (
|
||||||
|
Q(date_start__gte=end) & Q(date_end__lte=end)
|
||||||
|
)
|
||||||
|
results['white_list'] = Whitelist.objects.filter(
|
||||||
|
users_filter & date_filter
|
||||||
|
).order_by('date_end').distinct()[:max_result]
|
||||||
|
|
||||||
|
# Switch ports
|
||||||
|
if '5' in aff and request.user.has_perms(('cableur',)):
|
||||||
|
results['port_list'] = Port.objects.filter(
|
||||||
|
details__icontains=query
|
||||||
|
).order_by('switch', 'port').distinct()[:max_result]
|
||||||
|
|
||||||
|
# Switches
|
||||||
|
if '6' in aff and request.user.has_perms(('cableur')):
|
||||||
|
results['switch_list'] = Switch.objects.filter(
|
||||||
|
details__icontains=query
|
||||||
|
).order_by('stack', 'stack_member_id').distinct()[:max_result]
|
||||||
|
|
||||||
|
results.update({'max_result': max_result})
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def search(request):
|
def search(request):
|
||||||
search_form = SearchForm(request.GET or None)
|
search_form = SearchForm(request.GET or None)
|
||||||
if search_form.is_valid():
|
if search_form.is_valid():
|
||||||
return render(request, 'search/index.html', search_result(search_form, False, request))
|
return render(
|
||||||
|
request,
|
||||||
|
'search/index.html',
|
||||||
|
get_results(
|
||||||
|
search_form.cleaned_data.get('q', ''),
|
||||||
|
request,
|
||||||
|
search_form.cleaned_data
|
||||||
|
)
|
||||||
|
)
|
||||||
return render(request, 'search/search.html', {'search_form' : search_form})
|
return render(request, 'search/search.html', {'search_form' : search_form})
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def searchp(request):
|
def searchp(request):
|
||||||
search_form = SearchFormPlus(request.GET or None)
|
search_form = SearchFormPlus(request.GET or None)
|
||||||
if search_form.is_valid():
|
if search_form.is_valid():
|
||||||
return render(request, 'search/index.html', search_result(search_form, True, request))
|
return render(
|
||||||
|
request,
|
||||||
|
'search/index.html',
|
||||||
|
get_results(
|
||||||
|
search_form.cleaned_data.get('q', ''),
|
||||||
|
request,
|
||||||
|
search_form.cleaned_data
|
||||||
|
)
|
||||||
|
)
|
||||||
return render(request, 'search/search.html', {'search_form' : search_form})
|
return render(request, 'search/search.html', {'search_form' : search_form})
|
||||||
|
|
Loading…
Reference in a new issue