mirror of https://gitlab.federez.net/re2o/re2o
5 changed files with 144 additions and 85 deletions
@ -0,0 +1,136 @@ |
|||
# -*- 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. |
|||
|
|||
# -*- coding: utf-8 -*- |
|||
# David Sinquin, Gabriel Détraz, Goulven Kermarec |
|||
""" |
|||
Regroupe les fonctions transversales utiles |
|||
|
|||
Fonction : |
|||
- récupérer tous les utilisateurs actifs |
|||
- récupérer toutes les machines |
|||
- récupérer tous les bans |
|||
etc |
|||
""" |
|||
|
|||
|
|||
from __future__ import unicode_literals |
|||
|
|||
|
|||
from django.utils import timezone |
|||
from django.db.models import Q |
|||
|
|||
from cotisations.models import Cotisation, Facture, Paiement, Vente |
|||
from machines.models import Domain, Interface, Machine |
|||
from users.models import User, Ban, Whitelist |
|||
from preferences.models import Service |
|||
|
|||
DT_NOW = timezone.now() |
|||
|
|||
|
|||
def all_adherent(search_time=DT_NOW): |
|||
""" Fonction renvoyant tous les users adherents. Optimisee pour n'est |
|||
qu'une seule requete sql |
|||
Inspecte les factures de l'user et ses cotisation, regarde si elles |
|||
sont posterieur à now (end_time)""" |
|||
return User.objects.filter( |
|||
facture__in=Facture.objects.filter( |
|||
vente__in=Vente.objects.filter( |
|||
cotisation__in=Cotisation.objects.filter( |
|||
vente__in=Vente.objects.filter( |
|||
facture__in=Facture.objects.all().exclude(valid=False) |
|||
) |
|||
).filter(date_end__gt=search_time) |
|||
) |
|||
) |
|||
).distinct() |
|||
|
|||
|
|||
def all_baned(search_time=DT_NOW): |
|||
""" Fonction renvoyant tous les users bannis """ |
|||
return User.objects.filter( |
|||
ban__in=Ban.objects.filter( |
|||
date_end__gt=search_time |
|||
) |
|||
).distinct() |
|||
|
|||
|
|||
def all_whitelisted(search_time=DT_NOW): |
|||
""" Fonction renvoyant tous les users whitelistes """ |
|||
return User.objects.filter( |
|||
whitelist__in=Whitelist.objects.filter( |
|||
date_end__gt=search_time |
|||
) |
|||
).distinct() |
|||
|
|||
|
|||
def all_has_access(search_time=DT_NOW): |
|||
""" Renvoie tous les users beneficiant d'une connexion |
|||
: user adherent ou whiteliste et non banni """ |
|||
return User.objects.filter( |
|||
Q(state=User.STATE_ACTIVE) & |
|||
~Q(ban__in=Ban.objects.filter(date_end__gt=search_time)) & |
|||
(Q(whitelist__in=Whitelist.objects.filter(date_end__gt=search_time)) | |
|||
Q(facture__in=Facture.objects.filter( |
|||
vente__in=Vente.objects.filter( |
|||
cotisation__in=Cotisation.objects.filter( |
|||
vente__in=Vente.objects.filter( |
|||
facture__in=Facture.objects.all() |
|||
.exclude(valid=False) |
|||
) |
|||
).filter(date_end__gt=search_time) |
|||
) |
|||
))) |
|||
).distinct() |
|||
|
|||
|
|||
def all_active_interfaces(): |
|||
"""Renvoie l'ensemble des machines autorisées à sortir sur internet """ |
|||
return Interface.objects.filter( |
|||
machine__in=Machine.objects.filter( |
|||
user__in=all_has_access() |
|||
).filter(active=True) |
|||
).select_related('domain').select_related('machine')\ |
|||
.select_related('type').select_related('ipv4')\ |
|||
.select_related('domain__extension').select_related('ipv4__ip_type')\ |
|||
.distinct() |
|||
|
|||
|
|||
def all_active_assigned_interfaces(): |
|||
""" Renvoie l'ensemble des machines qui ont une ipv4 assignées et |
|||
disposant de l'accès internet""" |
|||
return all_active_interfaces().filter(ipv4__isnull=False) |
|||
|
|||
|
|||
def all_active_interfaces_count(): |
|||
""" Version light seulement pour compter""" |
|||
return Interface.objects.filter( |
|||
machine__in=Machine.objects.filter( |
|||
user__in=all_has_access() |
|||
).filter(active=True) |
|||
) |
|||
|
|||
|
|||
def all_active_assigned_interfaces_count(): |
|||
""" Version light seulement pour compter""" |
|||
return all_active_interfaces_count().filter(ipv4__isnull=False) |
|||
Loading…
Reference in new issue