Projet

Général

Profil

0003-delegate-role-permission-checking-to-mellon-if-possi.patch

Valentin Deniaud, 23 avril 2019 11:41

Télécharger (8,02 ko)

Voir les différences:

Subject: [PATCH 3/4] delegate role permission checking to mellon if possible

 chrono/agendas/models.py | 33 +++++++++++++++++++++++----------
 chrono/exceptions.py     |  4 ++++
 chrono/manager/views.py  | 33 +++++++++++++++++++++------------
 chrono/urls_utils.py     |  7 +++++++
 4 files changed, 55 insertions(+), 22 deletions(-)
 create mode 100644 chrono/exceptions.py
chrono/agendas/models.py
35 35

  
36 36
from jsonfield import JSONField
37 37

  
38
from ..interval import Intervals
38
from chrono.exceptions import RoleNotInSession
39
from chrono.interval import Intervals
40

  
41

  
42
try:
43
    from mellon.utils import user_has_role
44
except ImportError:
45
    def user_has_role(request, role_id):
46
        return request.user.groups.filter(id=role_id).exists()
39 47

  
40 48

  
41 49
AGENDA_KINDS = (
......
93 101
    def get_absolute_url(self):
94 102
        return reverse('chrono-manager-agenda-view', kwargs={'pk': self.id})
95 103

  
96
    def can_be_managed(self, user):
97
        if user.is_staff:
104
    def can_be_managed(self, request):
105
        if request.user.is_staff:
98 106
            return True
99
        group_ids = [x.id for x in user.groups.all()]
100
        return bool(self.edit_role_id in group_ids)
107
        return user_has_role(request, self.edit_role_id)
101 108

  
102
    def can_be_viewed(self, user):
103
        if self.can_be_managed(user):
104
            return True
105
        group_ids = [x.id for x in user.groups.all()]
106
        return bool(self.view_role_id in group_ids)
109
    def can_be_viewed(self, request):
110
        raised_exception = None
111
        try:
112
            if self.can_be_managed(request):
113
                return True
114
        except RoleNotInSession as e:
115
            raised_exception = e
116
        has_role = user_has_role(request, self.view_role_id)
117
        if not has_role and raised_exception:
118
            raise raised_exception
119
        return has_role
107 120

  
108 121
    def get_base_meeting_duration(self):
109 122
        durations = [x.duration for x in MeetingType.objects.filter(agenda=self)]
chrono/exceptions.py
1
try:
2
    from mellon.exceptions import RoleNotInSession
3
except ImportError:
4
    RoleNotInSession = Exception
chrono/manager/views.py
35 35
from chrono.agendas.models import (Agenda, Event, MeetingType, TimePeriod,
36 36
                                   Booking, Desk, TimePeriodException,
37 37
                                   ICSError, AgendaImportError)
38
from chrono.exceptions import RoleNotInSession
38 39

  
39 40
from .forms import (AgendaAddForm, AgendaEditForm, EventForm, NewMeetingTypeForm, MeetingTypeForm,
40 41
                    TimePeriodForm, ImportEventsForm, NewDeskForm, DeskForm, TimePeriodExceptionForm,
......
130 131

  
131 132
    def get_object(self, queryset=None):
132 133
        obj = super(AgendaEditView, self).get_object(queryset=queryset)
133
        if not obj.can_be_managed(self.request.user):
134
        if not obj.can_be_managed(self.request):
134 135
            raise PermissionDenied()
135 136
        return obj
136 137

  
......
176 177
            agenda = Agenda.objects.get(id=kwargs.get('pk'))
177 178
        except Agenda.DoesNotExist:
178 179
            raise Http404()
179
        if not agenda.can_be_viewed(self.request.user):
180
        if not agenda.can_be_viewed(self.request):
180 181
            raise PermissionDenied()
181 182

  
182 183
        if agenda.kind == 'meetings':
......
206 207
        self.agenda = get_object_or_404(Agenda, id=kwargs.get('pk'))
207 208
        if self.agenda.kind != 'meetings':
208 209
            raise Http404()
209
        if not self.agenda.can_be_viewed(request.user):
210
        if not self.agenda.can_be_viewed(request):
210 211
            raise PermissionDenied()
211 212

  
212 213
        # specify 6am time to get the expected timezone on daylight saving time
......
443 444
            self.agenda = Agenda.objects.get(id=kwargs.get('pk'))
444 445
        except Agenda.DoesNotExist:
445 446
            raise Http404()
446
        if not self.agenda.can_be_managed(request.user):
447
        if not self.agenda.can_be_managed(request):
447 448
            raise PermissionDenied()
448 449
        return super(ManagedAgendaMixin, self).dispatch(request, *args, **kwargs)
449 450

  
......
466 467

  
467 468
    def dispatch(self, request, *args, **kwargs):
468 469
        self.agenda = self.get_object().agenda
469
        if not self.agenda.can_be_managed(request.user):
470
        if not self.agenda.can_be_managed(request):
470 471
            raise PermissionDenied()
471 472
        return super(ManagedAgendaSubobjectMixin, self).dispatch(request, *args, **kwargs)
472 473

  
......
487 488
            self.desk = Desk.objects.get(id=kwargs.get('pk'))
488 489
        except Desk.DoesNotExist:
489 490
            raise Http404()
490
        if not self.desk.agenda.can_be_managed(request.user):
491
        if not self.desk.agenda.can_be_managed(request):
491 492
            raise PermissionDenied()
492 493
        return super(ManagedDeskMixin, self).dispatch(request, *args, **kwargs)
493 494

  
......
511 512

  
512 513
    def dispatch(self, request, *args, **kwargs):
513 514
        self.desk = self.get_object().desk
514
        if not self.desk.agenda.can_be_managed(request.user):
515
        if not self.desk.agenda.can_be_managed(request):
515 516
            raise PermissionDenied()
516 517
        return super(ManagedDeskSubobjectMixin, self).dispatch(request, *args, **kwargs)
517 518

  
......
534 535
            self.agenda = Agenda.objects.get(id=kwargs.get('pk'))
535 536
        except Agenda.DoesNotExist:
536 537
            raise Http404()
537
        if not self.agenda.can_be_managed(request.user):
538
            # "events" agendas settings page can be access by user with the
539
            # view permission as there are no other "view" page for this type
540
            # of agenda.
541
            if self.agenda.kind != 'events' or not self.agenda.can_be_viewed(request.user):
538
        # Do something different here as "events" agendas settings page can be
539
        # access by user with the view permission as there are no other "view"
540
        # page for this type of agenda.
541
        raised_exception = None
542
        try:
543
            can_be_managed = self.agenda.can_be_managed(request)
544
        except RoleNotInSession as e:
545
            raised_exception = e
546
            can_be_managed = False
547
        if not can_be_managed:
548
            if self.agenda.kind != 'events' or not self.agenda.can_be_viewed(request):
549
                if raised_exception:
550
                    raise raised_exception
542 551
                raise PermissionDenied()
543 552
        return super(DetailView, self).dispatch(request, *args, **kwargs)
544 553

  
chrono/urls_utils.py
23 23

  
24 24
from .agendas.models import Agenda
25 25

  
26
try:
27
    from mellon.utils import check_session_roles
28
except ImportError:
29
    check_session_roles = None
30

  
26 31

  
27 32
class DecoratedURLPattern(RegexURLPattern):
28 33
    def resolve(self, *args, **kwargs):
......
66 71
        return False
67 72
    actual_decorator = user_passes_test(check_manager, login_url=login_url)
68 73
    if function:
74
        if check_session_roles:
75
            return check_session_roles(actual_decorator(function))
69 76
        return actual_decorator(function)
70 77
    return actual_decorator
71
-