Revision 0bd9c069
Retrait des modifications liées à la fusion de la branche nested_sets du trunk (révisions r6116, r6121 et r6129).
Le nouveau mécanisme nécessite encore des ajustements pour être utilisable.
git-svn-id: https://vigilo-dev.si.c-s.fr/svn@6135 b22e2e97-25c9-44ff-b637-2e5ceca36478
vigiboard/controllers/root.py | ||
---|---|---|
31 | 31 |
from pylons.i18n import ugettext as _, lazy_ugettext as l_ |
32 | 32 |
from sqlalchemy import asc |
33 | 33 |
from sqlalchemy.sql import func |
34 |
from sqlalchemy.orm import aliased |
|
35 | 34 |
from repoze.what.predicates import Any, All, in_group, \ |
36 | 35 |
has_permission, not_anonymous, \ |
37 | 36 |
NotAuthorizedError |
... | ... | |
42 | 41 |
from vigilo.models.tables import Event, EventHistory, CorrEvent, Host, \ |
43 | 42 |
SupItem, SupItemGroup, LowLevelService, \ |
44 | 43 |
StateName, State |
44 |
from vigilo.models.tables.grouphierarchy import GroupHierarchy |
|
45 | 45 |
from vigilo.models.functions import sql_escape_like |
46 | 46 |
from vigilo.models.tables.secondary_tables import EVENTSAGGREGATE_TABLE |
47 | 47 |
|
... | ... | |
147 | 147 |
|
148 | 148 |
# Application des filtres si nécessaire |
149 | 149 |
if supitemgroup: |
150 |
base = DBSession.query(SupItemGroup).get(supitemgroup) |
|
151 |
if base: |
|
152 |
search['supitemgroup'] = supitemgroup |
|
153 |
sig = aliased(SupItemGroup) |
|
154 |
aggregates.add_join( |
|
155 |
(sig, aggregates.items.c.idsupitemgroup == sig.idgroup), |
|
156 |
) |
|
157 |
aggregates.add_filter(sig.left >= base.left) |
|
158 |
aggregates.add_filter(sig.right <= base.right) |
|
150 |
search['supitemgroup'] = supitemgroup |
|
151 |
aggregates.add_join((GroupHierarchy, GroupHierarchy.idchild == |
|
152 |
aggregates.items.c.idsupitemgroup)) |
|
153 |
aggregates.add_filter(GroupHierarchy.idparent == supitemgroup) |
|
159 | 154 |
|
160 | 155 |
if host: |
161 | 156 |
search['host_'] = host |
162 | 157 |
host = sql_escape_like(host) |
163 |
aggregates.add_filter(aggregates.items.c.hostname.ilike(host)) |
|
158 |
aggregates.add_filter(aggregates.items.c.hostname.ilike( |
|
159 |
'%s' % host)) |
|
164 | 160 |
|
165 | 161 |
if service: |
166 | 162 |
search['service'] = service |
167 | 163 |
service = sql_escape_like(service) |
168 |
aggregates.add_filter(aggregates.items.c.servicename.ilike(service)) |
|
164 |
aggregates.add_filter(aggregates.items.c.servicename.ilike( |
|
165 |
'%s' % service)) |
|
169 | 166 |
|
170 | 167 |
if output: |
171 | 168 |
search['output'] = output |
172 | 169 |
output = sql_escape_like(output) |
173 |
aggregates.add_filter(Event.message.ilike(output)) |
|
170 |
aggregates.add_filter(Event.message.ilike('%s' % output))
|
|
174 | 171 |
|
175 | 172 |
if trouble_ticket: |
176 | 173 |
search['tt'] = trouble_ticket |
177 | 174 |
trouble_ticket = sql_escape_like(trouble_ticket) |
178 |
aggregates.add_filter(CorrEvent.trouble_ticket.ilike(trouble_ticket)) |
|
175 |
aggregates.add_filter(CorrEvent.trouble_ticket.ilike( |
|
176 |
'%s' % trouble_ticket)) |
|
179 | 177 |
|
180 | 178 |
if from_date: |
181 | 179 |
search['from_date'] = from_date.lower() |
... | ... | |
207 | 205 |
else: |
208 | 206 |
aggregates.add_filter(CorrEvent.timestamp_active <= to_date) |
209 | 207 |
|
210 |
|
|
211 | 208 |
# Calcul des éléments à afficher et du nombre de pages possibles |
212 | 209 |
total_rows = aggregates.num_rows() |
213 | 210 |
items_per_page = int(config['vigiboard_items_per_page']) |
... | ... | |
752 | 749 |
if parent_id is None: |
753 | 750 |
return self.get_root_host_groups() |
754 | 751 |
|
755 |
parent = DBSession.query(SupItemGroup).get(parent_id) |
|
752 |
# TODO: Utiliser un schéma de validation |
|
753 |
parent_id = int(parent_id) |
|
756 | 754 |
|
757 | 755 |
# On vérifie si le groupe parent fait partie des |
758 | 756 |
# groupes auxquel l'utilisateur a accès, et on |
759 | 757 |
# retourne une liste vide dans le cas contraire |
760 | 758 |
is_manager = in_group('managers').is_met(request.environ) |
759 |
if not is_manager: |
|
760 |
direct_access = False |
|
761 |
user = get_current_user() |
|
762 |
user_groups = dict(user.supitemgroups()) |
|
763 |
# On regarde d'abord si le groupe fait partie de ceux |
|
764 |
# auquels l'utilisateur a explicitement accès, ou s'il |
|
765 |
# est un parent des groupes auxquels l'utilisateur a accès |
|
766 |
if parent_id in user_groups.keys(): |
|
767 |
direct_access = user_groups[parent_id] |
|
768 |
# Dans le cas contraire, on vérifie si le groupe est un |
|
769 |
# sous-groupe des groupes auxquels l'utilisateur a accès |
|
770 |
else: |
|
771 |
id_list = [ug for ug in user_groups.keys() if user_groups[ug]] |
|
772 |
child_groups = DBSession.query(SupItemGroup.idgroup |
|
773 |
).distinct( |
|
774 |
).join( |
|
775 |
(GroupHierarchy, |
|
776 |
GroupHierarchy.idchild == SupItemGroup.idgroup), |
|
777 |
).filter(GroupHierarchy.idparent.in_(id_list) |
|
778 |
).filter(GroupHierarchy.hops > 0 |
|
779 |
).all() |
|
780 |
for ucg in child_groups: |
|
781 |
if ucg.idgroup == parent_id: |
|
782 |
direct_access = True |
|
783 |
break |
|
784 |
# Sinon, l'utilisateur n'a pas accès à ce groupe |
|
785 |
else: |
|
786 |
return dict(groups = [], leaves = []) |
|
761 | 787 |
|
762 | 788 |
# On récupère la liste des groupes dont |
763 | 789 |
# l'identifiant du parent est passé en paramètre |
764 | 790 |
db_groups = DBSession.query( |
765 | 791 |
SupItemGroup |
766 |
).filter(SupItemGroup.depth == parent.depth + 1 |
|
767 |
).filter(SupItemGroup.left > parent.left |
|
768 |
).filter(SupItemGroup.right < parent.right |
|
792 |
).join( |
|
793 |
(GroupHierarchy, GroupHierarchy.idchild == \ |
|
794 |
SupItemGroup.idgroup), |
|
795 |
).filter(GroupHierarchy.hops == 1 |
|
796 |
).filter(GroupHierarchy.idparent == parent_id |
|
769 | 797 |
).order_by(SupItemGroup.name.asc()) |
770 |
|
|
771 |
if not is_manager: |
|
772 |
user = get_current_user() |
|
773 |
user_groups = [g[0] for g in user.supitemgroups() if g[1]] |
|
774 |
db_groups = db_groups.filter(SupItemGroup.idgroup.in_(user_groups)) |
|
775 |
|
|
798 |
if not is_manager and not direct_access: |
|
799 |
id_list = [ug for ug in user_groups.keys()] |
|
800 |
db_groups = db_groups.filter( |
|
801 |
SupItemGroup.idgroup.in_(id_list)) |
|
776 | 802 |
groups = [] |
777 | 803 |
for group in db_groups.all(): |
778 | 804 |
groups.append({ |
... | ... | |
791 | 817 |
@rtype : C{dict} of C{list} of C{dict} of C{mixed} |
792 | 818 |
""" |
793 | 819 |
|
794 |
root_groups = SupItemGroup.get_top_groups() |
|
820 |
# On récupère tous les groupes qui ont un parent. |
|
821 |
children = DBSession.query( |
|
822 |
SupItemGroup, |
|
823 |
).distinct( |
|
824 |
).join( |
|
825 |
(GroupHierarchy, GroupHierarchy.idchild == SupItemGroup.idgroup) |
|
826 |
).filter(GroupHierarchy.hops > 0) |
|
827 |
|
|
828 |
# Ensuite on les exclut de la liste des groupes, |
|
829 |
# pour ne garder que ceux qui sont au sommet de |
|
830 |
# l'arbre et qui constituent nos "root groups". |
|
831 |
root_groups = DBSession.query( |
|
832 |
SupItemGroup, |
|
833 |
).except_(children |
|
834 |
).order_by(SupItemGroup.name) |
|
795 | 835 |
|
796 | 836 |
# On filtre ces groupes racines afin de ne |
797 | 837 |
# retourner que ceux auquels l'utilisateur a accès |
798 | 838 |
user = get_current_user() |
799 | 839 |
is_manager = in_group('managers').is_met(request.environ) |
800 | 840 |
if not is_manager: |
801 |
user_groups = [sig[0] for sig in user.supitemgroups()] |
|
802 |
for root_group in root_groups: |
|
803 |
if root_group.idgroup not in user_groups: |
|
804 |
root_groups.remove(root_group) |
|
841 |
user_groups = [ug[0] for ug in user.supitemgroups()] |
|
842 |
root_groups = root_groups.filter( |
|
843 |
SupItemGroup.idgroup.in_(user_groups)) |
|
805 | 844 |
|
806 | 845 |
groups = [] |
807 |
for group in root_groups: |
|
846 |
for group in root_groups.all():
|
|
808 | 847 |
groups.append({ |
809 | 848 |
'id' : group.idgroup, |
810 | 849 |
'name' : group.name, |
Also available in: Unified diff