from django.conf import settings from django.contrib.auth.decorators import login_required from django.urls import resolve, reverse_lazy from django.utils.decorators import method_decorator from django.views.generic import CreateView, DetailView, ListView, UpdateView from oauth2_provider.models import get_application_model from apps.gooyal_oauth2.filters import ApplicationFilter, ScopeFilter from apps.gooyal_oauth2.forms import ApplicationCreateForm, ApplicationUpdateForm, ApplicationScopeCreateForm from apps.gooyal_oauth2.models import Application, Scope from utils.views import FilterMixin @method_decorator(login_required, name='dispatch') class ApplicationCreateView(CreateView): template_name = "gooyal_oauth2/application_create.html" form_class = ApplicationCreateForm def get_success_url(self): return reverse_lazy("gooyal_oauth2:application_detail", kwargs={"pk": self.object.pk}) def form_valid(self, form): form.instance.user = self.request.user form.instance.client_type = Application.CLIENT_PUBLIC form.instance.algorithm = Application.RS256_ALGORITHM form.instance.hash_client_secret = False form.instance.authorization_grant_type = Application.GRANT_AUTHORIZATION_CODE return super().form_valid(form) @method_decorator(login_required, name='dispatch') class ApplicationUpdateView(UpdateView): template_name = "gooyal_oauth2/application_update.html" form_class = ApplicationUpdateForm def get_queryset(self): return Application.objects.filter(user=self.request.user) def get_success_url(self): return reverse_lazy("gooyal_oauth2:application_detail", kwargs={"pk": self.object.pk}) def form_valid(self, form): # form.instance.user = self.request.user # form.instance.client_type = Application.CLIENT_PUBLIC return super().form_valid(form) @method_decorator(login_required, name='dispatch') class ApplicationDetailView(DetailView): model = Application template_name = "gooyal_oauth2/application_detail.html" def get_queryset(self): return Application.objects.filter(user=self.request.user) @method_decorator(login_required, name='dispatch') class ApplicationListView(FilterMixin, ListView): model = Application template_name = "gooyal_oauth2/application_list.html" paginate_by = settings.PAGE_SIZE filterset_class = ApplicationFilter def get_ordering(self): ordering = self.request.GET.get('ordering', 'name') return ordering def get_queryset(self): qs = super().get_queryset() return qs.filter(user=self.request.user) class ApplicationScopeMixin: application = None def get_application(self): if not self.application: application_pk = self.kwargs['application_pk'] application = Application.objects.get(pk=application_pk, user=self.request.user) self.application = application return self.application def get_context_data(self, **kwargs): application = self.get_application() context_data = super().get_context_data(**kwargs) context_data['application'] = application return context_data @method_decorator(login_required, name='dispatch') class ApplicationScopeListView(ApplicationScopeMixin, FilterMixin, ListView): model = Scope template_name = "gooyal_oauth2/application_scope_list.html" paginate_by = settings.PAGE_SIZE filterset_class = ScopeFilter def get_ordering(self): ordering = self.request.GET.get('ordering', 'name') return ordering def get_queryset(self): qs = super().get_queryset() application = self.get_application() return qs.filter(application__user=self.request.user, application=application) @method_decorator(login_required, name='dispatch') class ApplicationScopeCreateView(ApplicationScopeMixin, CreateView): template_name = "gooyal_oauth2/application_scope_create.html" form_class = ApplicationScopeCreateForm model = Scope def get_queryset(self): qs = super().get_queryset() application = self.get_application() return qs.filter(application__user=self.request.user, application=application) def get_success_url(self): return reverse_lazy("gooyal_oauth2:application_scope_detail", kwargs={"pk": self.object.pk, "application_pk": self.get_application().pk}) def form_valid(self, form): form.instance.application = self.get_application() return super().form_valid(form) @method_decorator(login_required, name='dispatch') class ApplicationScopeDetailView(ApplicationScopeMixin, DetailView): model = Scope template_name = "gooyal_oauth2/application_scope_detail.html" def get_queryset(self): application = self.get_application() return Scope.objects.filter(application=application) @method_decorator(login_required, name='dispatch') class ApplicationScopeUpdateView(ApplicationScopeMixin, UpdateView): template_name = "gooyal_oauth2/application_scope_update.html" form_class = ApplicationScopeCreateForm model = Scope def get_queryset(self): qs = super().get_queryset() application = self.get_application() return qs.filter(application__user=self.request.user, application=application) def get_success_url(self): return reverse_lazy("gooyal_oauth2:application_scope_detail", kwargs={"pk": self.object.pk, "application_pk": self.get_application().pk}) def form_valid(self, form): # form.instance.user = self.request.user # form.instance.client_type = Application.CLIENT_PUBLIC return super().form_valid(form)