|
|
|
@ -24,12 +24,12 @@ |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
# David Sinquin, Gabriel Détraz, Lara Kermarec |
|
|
|
""" |
|
|
|
Regroupe les fonctions transversales utiles |
|
|
|
A group of very usefull functions for re2o core |
|
|
|
|
|
|
|
Fonction : |
|
|
|
- récupérer tous les utilisateurs actifs |
|
|
|
- récupérer toutes les machines |
|
|
|
- récupérer tous les bans |
|
|
|
Functions: |
|
|
|
- find all active users |
|
|
|
- find all active interfaces |
|
|
|
- find all bans |
|
|
|
etc |
|
|
|
""" |
|
|
|
|
|
|
|
@ -47,7 +47,14 @@ from preferences.models import AssoOption |
|
|
|
|
|
|
|
|
|
|
|
def get_group_having_permission(*permission_name): |
|
|
|
"""Returns every group having the permission `permission_name` |
|
|
|
"""Return all django groups having this permission |
|
|
|
|
|
|
|
Parameters: |
|
|
|
permission name (string): Permission name |
|
|
|
|
|
|
|
Returns: |
|
|
|
re2o groups: Groups having this permission |
|
|
|
|
|
|
|
""" |
|
|
|
groups = set() |
|
|
|
for name in permission_name: |
|
|
|
@ -60,10 +67,19 @@ def get_group_having_permission(*permission_name): |
|
|
|
|
|
|
|
|
|
|
|
def all_adherent(search_time=None, including_asso=True): |
|
|
|
""" 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 all people who have a valid membership at org. Optimised to make only one |
|
|
|
sql query. Build a filter and then apply it to User. Check for each user if a valid |
|
|
|
membership is registered at the desired search_time. |
|
|
|
|
|
|
|
Parameters: |
|
|
|
search_time (django datetime): Datetime to perform this search, |
|
|
|
if not provided, search_time will be set à timezone.now() |
|
|
|
including_asso (boolean): Decide if org itself is included in results |
|
|
|
|
|
|
|
Returns: |
|
|
|
django queryset: Django queryset containing all users with valid membership |
|
|
|
|
|
|
|
""" |
|
|
|
if search_time is None: |
|
|
|
search_time = timezone.now() |
|
|
|
filter_user = Q( |
|
|
|
@ -86,7 +102,18 @@ def all_adherent(search_time=None, including_asso=True): |
|
|
|
|
|
|
|
|
|
|
|
def all_baned(search_time=None): |
|
|
|
""" Fonction renvoyant tous les users bannis """ |
|
|
|
"""Return all people who are banned at org. Optimised to make only one |
|
|
|
sql query. Build a filter and then apply it to User. Check for each user |
|
|
|
banned at the desired search_time. |
|
|
|
|
|
|
|
Parameters: |
|
|
|
search_time (django datetime): Datetime to perform this search, |
|
|
|
if not provided, search_time will be set à timezone.now() |
|
|
|
|
|
|
|
Returns: |
|
|
|
django queryset: Django queryset containing all users banned |
|
|
|
|
|
|
|
""" |
|
|
|
if search_time is None: |
|
|
|
search_time = timezone.now() |
|
|
|
return User.objects.filter( |
|
|
|
@ -97,7 +124,18 @@ def all_baned(search_time=None): |
|
|
|
|
|
|
|
|
|
|
|
def all_whitelisted(search_time=None): |
|
|
|
""" Fonction renvoyant tous les users whitelistes """ |
|
|
|
"""Return all people who have a free access at org. Optimised to make only one |
|
|
|
sql query. Build a filter and then apply it to User. Check for each user with a |
|
|
|
whitelisted free access at the desired search_time. |
|
|
|
|
|
|
|
Parameters: |
|
|
|
search_time (django datetime): Datetime to perform this search, |
|
|
|
if not provided, search_time will be set à timezone.now() |
|
|
|
|
|
|
|
Returns: |
|
|
|
django queryset: Django queryset containing all users whitelisted |
|
|
|
|
|
|
|
""" |
|
|
|
if search_time is None: |
|
|
|
search_time = timezone.now() |
|
|
|
return User.objects.filter( |
|
|
|
@ -108,11 +146,19 @@ def all_whitelisted(search_time=None): |
|
|
|
|
|
|
|
|
|
|
|
def all_has_access(search_time=None, including_asso=True): |
|
|
|
""" Return all connected users : active users and whitelisted + |
|
|
|
asso_user defined in AssoOption pannel |
|
|
|
---- |
|
|
|
Renvoie tous les users beneficiant d'une connexion |
|
|
|
: user adherent et whiteliste non banni plus l'utilisateur asso""" |
|
|
|
"""Return all people who have an valid internet access at org. Optimised to make |
|
|
|
only one sql query. Build a filter and then apply it to User. Return users |
|
|
|
with a whitelist, or a valid paid access, except banned users. |
|
|
|
|
|
|
|
Parameters: |
|
|
|
search_time (django datetime): Datetime to perform this search, |
|
|
|
if not provided, search_time will be set à timezone.now() |
|
|
|
including_asso (boolean): Decide if org itself is included in results |
|
|
|
|
|
|
|
Returns: |
|
|
|
django queryset: Django queryset containing all valid connection users |
|
|
|
|
|
|
|
""" |
|
|
|
if search_time is None: |
|
|
|
search_time = timezone.now() |
|
|
|
filter_user = ( |
|
|
|
@ -153,7 +199,20 @@ def all_has_access(search_time=None, including_asso=True): |
|
|
|
|
|
|
|
|
|
|
|
def filter_active_interfaces(interface_set): |
|
|
|
"""Filtre les machines autorisées à sortir sur internet dans une requête""" |
|
|
|
"""Return a filter for filtering all interfaces of people who have an valid |
|
|
|
internet access at org. |
|
|
|
Call all_active_interfaces and then apply filter of theses active users on an |
|
|
|
interfaces_set |
|
|
|
|
|
|
|
Parameters: |
|
|
|
interface_set (django queryset): A queryset of interfaces to perform filter |
|
|
|
|
|
|
|
Returns: |
|
|
|
django filter: Django filter to apply to an interfaces queryset, |
|
|
|
will return when applied all active interfaces, related with |
|
|
|
a user with valid membership |
|
|
|
|
|
|
|
""" |
|
|
|
return ( |
|
|
|
interface_set.filter( |
|
|
|
machine__in=Machine.objects.filter(user__in=all_has_access()).filter( |
|
|
|
@ -171,12 +230,38 @@ def filter_active_interfaces(interface_set): |
|
|
|
|
|
|
|
|
|
|
|
def filter_complete_interfaces(interface_set): |
|
|
|
"""Appel la fonction précédente avec un prefetch_related ipv6 en plus""" |
|
|
|
"""Return a filter for filtering all interfaces of people who have an valid |
|
|
|
internet access at org. |
|
|
|
Call all_active_interfaces and then apply filter of theses active users on an |
|
|
|
interfaces_set. Less efficient than filter_active_interfaces, with a prefetch_related |
|
|
|
on ipv6 |
|
|
|
|
|
|
|
Parameters: |
|
|
|
interface_set (django queryset): A queryset of interfaces to perform filter |
|
|
|
|
|
|
|
Returns: |
|
|
|
django filter: Django filter to apply to an interfaces queryset, |
|
|
|
will return when applied all active interfaces, related with |
|
|
|
a user with valid membership |
|
|
|
|
|
|
|
""" |
|
|
|
return filter_active_interfaces(interface_set).prefetch_related("ipv6list") |
|
|
|
|
|
|
|
|
|
|
|
def all_active_interfaces(full=False): |
|
|
|
"""Renvoie l'ensemble des machines autorisées à sortir sur internet """ |
|
|
|
"""Return a filter for filtering all interfaces of people who have an valid |
|
|
|
internet access at org. |
|
|
|
Call filter_active_interfaces or filter_complete_interfaces. |
|
|
|
|
|
|
|
Parameters: |
|
|
|
full (boolean): A queryset of interfaces to perform filter. If true, will perform |
|
|
|
a complete filter with filter_complete_interfaces |
|
|
|
|
|
|
|
Returns: |
|
|
|
django queryset: Django queryset containing all active interfaces, related with |
|
|
|
a user with valid membership |
|
|
|
|
|
|
|
""" |
|
|
|
if full: |
|
|
|
return filter_complete_interfaces(Interface.objects) |
|
|
|
else: |
|
|
|
@ -184,13 +269,30 @@ def all_active_interfaces(full=False): |
|
|
|
|
|
|
|
|
|
|
|
def all_active_assigned_interfaces(full=False): |
|
|
|
""" Renvoie l'ensemble des machines qui ont une ipv4 assignées et |
|
|
|
disposant de l'accès internet""" |
|
|
|
"""Return all interfaces of people who have an valid internet access at org, |
|
|
|
and with valid ipv4. |
|
|
|
Call filter_active_interfaces or filter_complete_interfaces, with parameter full. |
|
|
|
|
|
|
|
Parameters: |
|
|
|
full (boolean): A queryset of interfaces to perform filter. If true, will perform |
|
|
|
a complete filter with filter_complete_interfaces |
|
|
|
|
|
|
|
Returns: |
|
|
|
django queryset: Django queryset containing all active interfaces, related with |
|
|
|
a user with valid membership, and with valid assigned ipv4 address |
|
|
|
|
|
|
|
""" |
|
|
|
return all_active_interfaces(full=full).filter(ipv4__isnull=False) |
|
|
|
|
|
|
|
|
|
|
|
def all_active_interfaces_count(): |
|
|
|
""" Version light seulement pour compter""" |
|
|
|
"""Counts all interfaces of people who have an valid internet access at org. |
|
|
|
|
|
|
|
Returns: |
|
|
|
int: Number of all active interfaces, related with |
|
|
|
a user with valid membership. |
|
|
|
|
|
|
|
""" |
|
|
|
return Interface.objects.filter( |
|
|
|
machine__in=Machine.objects.filter(user__in=all_has_access()).filter( |
|
|
|
active=True |
|
|
|
@ -199,12 +301,26 @@ def all_active_interfaces_count(): |
|
|
|
|
|
|
|
|
|
|
|
def all_active_assigned_interfaces_count(): |
|
|
|
""" Version light seulement pour compter""" |
|
|
|
"""Counts all interfaces of people who have an valid internet access at org, |
|
|
|
and with valid ipv4. |
|
|
|
|
|
|
|
Returns: |
|
|
|
int: Number of all active interfaces, related with |
|
|
|
a user with valid membership, and with valid assigned ipv4 address |
|
|
|
|
|
|
|
""" |
|
|
|
return all_active_interfaces_count().filter(ipv4__isnull=False) |
|
|
|
|
|
|
|
|
|
|
|
def remove_user_room(room, force=True): |
|
|
|
""" Déménage de force l'ancien locataire de la chambre """ |
|
|
|
"""Remove the previous user of that room. If force, will not perform a check |
|
|
|
of membership on him before doing it |
|
|
|
|
|
|
|
Parameters: |
|
|
|
room (Room instance): Room to make free of user |
|
|
|
force (boolean): If true, bypass membership check |
|
|
|
|
|
|
|
""" |
|
|
|
try: |
|
|
|
user = Adherent.objects.get(room=room) |
|
|
|
except Adherent.DoesNotExist: |
|
|
|
|