from django.shortcuts import get_object_or_404,redirect from django.db.models import Q from django.views import generic from django.contrib import messages from rolepermissions.mixins import HasRoleMixin from django.contrib.auth.mixins import LoginRequiredMixin from django.core.urlresolvers import reverse_lazy from django.utils.translation import ugettext_lazy as _ from rolepermissions.shortcuts import assign_role from rolepermissions.verifications import has_role from .models import User from .forms import UserForm, UpdateProfileForm, UpdateUserForm, UpdateProfileFormAdmin # ================ ADMIN ======================= class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView): allowed_roles = ['system_admin'] login_url = reverse_lazy("core:home") redirect_field_name = 'next' template_name = 'list_users.html' context_object_name = 'users' paginate_by = 10 def get_queryset(self): search = self.request.GET.get('search', None) if search is None: users = User.objects.exclude(username = self.request.user.username) else: users = User.objects.filter(Q(username = search) | Q(name = search) | Q(name__icontains = search) | Q(username__icontains = search)).exclude( username = self.request.user.username) return users class Create(HasRoleMixin, LoginRequiredMixin, generic.edit.CreateView): allowed_roles = ['system_admin'] login_url = reverse_lazy("core:home") redirect_field_name = 'next' template_name = 'users/create.html' form_class = UserForm context_object_name = 'acc' success_url = reverse_lazy('users:manage') def form_valid(self, form): self.object = form.save() if self.object.type_profile == 2: assign_role(self.object, 'student') elif self.object.type_profile == 1: assign_role(self.object, 'professor') elif self.object.is_staff: assign_role(self.object, 'system_admin') self.object.save() messages.success(self.request, _('User created successfully!')) return super(Create, self).form_valid(form) class Update(HasRoleMixin, LoginRequiredMixin, generic.UpdateView): allowed_roles = ['system_admin'] login_url = reverse_lazy("core:home") redirect_field_name = 'next' template_name = 'users/update.html' slug_field = 'username' slug_url_kwarg = 'username' context_object_name = 'acc' model = User form_class = UpdateUserForm success_url = reverse_lazy('users:manage') def form_valid(self, form): self.object = form.save(commit = False) if self.object.type_profile == 2: assign_role(self.object, 'student') elif self.object.type_profile == 1: assign_role(self.object, 'professor') elif self.object.is_staff: assign_role(self.object, 'system_admin') self.object.save() messages.success(self.request, _('User edited successfully!')) return super(Update, self).form_valid(form) class View(LoginRequiredMixin, generic.DetailView): login_url = reverse_lazy("core:home") redirect_field_name = 'next' model = User context_object_name = 'acc' template_name = 'users/view.html' slug_field = 'username' slug_url_kwarg = 'username' def delete(request,username): user = get_object_or_404(User,username = username) user.delete() messages.success(request,_("User deleted Successfully!")) return redirect('users:manage') class Change_password(generic.TemplateView): template_name = 'users/change_password.html' class Remove_account(generic.TemplateView): template_name = 'users/remove_account.html' class UpdateProfile(LoginRequiredMixin, generic.edit.UpdateView): login_url = reverse_lazy("core:home") template_name = 'users/edit_profile.html' form_class = UpdateProfileForm success_url = reverse_lazy('users:profile') def get_object(self): user = get_object_or_404(User, username = self.request.user.username) return user def get_context_data(self, **kwargs): context = super(UpdateProfile, self).get_context_data(**kwargs) if has_role(self.request.user, 'system_admin'): context['form'] = UpdateProfileFormAdmin(instance = self.object) else: context['form'] = UpdateProfileForm(instance = self.object) return context def form_valid(self, form): form.save() messages.success(self.request, _('Profile edited successfully!')) return super(UpdateProfile, self).form_valid(form) class DeleteUser(LoginRequiredMixin, generic.edit.DeleteView): allowed_roles = ['student'] login_url = reverse_lazy("core:home") model = User success_url = reverse_lazy('core:index') success_message = "Deleted Successfully" def get_queryset(self): user = get_object_or_404(User, username = self.request.user.username) return user class Profile(LoginRequiredMixin, generic.DetailView): login_url = reverse_lazy("core:home") redirect_field_name = 'next' context_object_name = 'user' template_name = 'users/profile.html' def get_object(self): user = get_object_or_404(User, username = self.request.user.username) return user