8
0
Fork 0
mirror of https://gitlab.federez.net/re2o/re2o synced 2024-06-02 07:52:23 +00:00
re2o/search/views.py

228 lines
7.5 KiB
Python
Raw Normal View History

2017-01-15 23:01:18 +00:00
# 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.
2016-07-02 22:27:22 +00:00
# App de recherche pour re2o
2016-07-08 10:35:53 +00:00
# Augustin lemesle, Gabriel Détraz, Goulven Kermarec
2016-07-02 22:27:22 +00:00
# Gplv2
from __future__ import unicode_literals
2016-07-02 22:27:22 +00:00
from django.shortcuts import render
2016-12-14 02:52:59 +00:00
from django.shortcuts import get_object_or_404
from django.template.context_processors import csrf
2016-07-02 22:27:22 +00:00
from django.template import Context, RequestContext, loader
2016-07-08 10:35:53 +00:00
from django.contrib.auth.decorators import login_required
2016-07-02 22:27:22 +00:00
from django.db.models import Q
2016-07-04 21:56:51 +00:00
from users.models import User, Ban, Whitelist
from machines.models import Machine, Interface
2016-07-06 21:53:44 +00:00
from topologie.models import Port, Switch
2016-07-02 22:27:22 +00:00
from cotisations.models import Facture
from preferences.models import GeneralOption
from search.forms import (
SearchForm,
SearchFormPlus,
CHOICES_USER,
CHOICES_AFF,
initial_choices
)
def get_results(query, request, filters={}):
start = filters.get('s', None)
end = filters.get('e', None)
user_state = filters.get('u', initial_choices(CHOICES_USER))
aff = filters.get('a', initial_choices(CHOICES_AFF))
options, created = GeneralOption.objects.get_or_create()
max_result = options.search_display_page
user_state_filter = Q()
for s in user_state:
user_state_filter |= Q(state = s)
connexion = []
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()
}
users_filter = Q(
user__pseudo__icontains = query
) | Q(
user__adherent__name__icontains = query
) | Q(
user__surname__icontains = query
)
if not request.user.has_perms(('cableur',)):
users_filter &= Q(user = request.user)
# 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',)):
filter_user_list &= Q(id=request.user.id)
results['users_list'] = User.objects.filter(
filter_user_list
).order_by('state', 'surname').distinct()[:max_result]
# Machines
if '1' in aff:
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]
# 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]
# 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
2016-07-04 21:56:51 +00:00
2016-07-08 10:35:53 +00:00
@login_required
2016-07-04 21:56:51 +00:00
def search(request):
search_form = SearchForm(request.GET or None)
if search_form.is_valid():
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})
2016-07-04 21:56:51 +00:00
2016-07-08 10:35:53 +00:00
@login_required
2016-07-04 21:56:51 +00:00
def searchp(request):
search_form = SearchFormPlus(request.GET or None)
if search_form.is_valid():
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})