Created
November 17, 2018 05:55
-
-
Save rg3915/b5df013994f4194420f9f57a78541d89 to your computer and use it in GitHub Desktop.
Django Class methods override
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from django.contrib import messages | |
| from django.contrib.auth.models import User | |
| from django.db.models import Q | |
| from django.shortcuts import render, redirect | |
| from django.urls import reverse, reverse_lazy | |
| from django.utils.encoding import force_bytes | |
| from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode | |
| from django.views import View | |
| from django.views.generic import CreateView, ListView, UpdateView, DetailView | |
| from .forms import UserForm | |
| ''' | |
| # managers.py | |
| ''' | |
| class ActiveMixin: | |
| def get_queryset(self): | |
| queryset = super(ActiveMixin, self).get_queryset() | |
| # Verifica se este usuário pertence a um grupo. | |
| groups = self.request.user.groups.all().values_list('name', flat=True) | |
| if 'simpleuser' in groups: | |
| queryset = queryset.filter(active=True) | |
| return queryset | |
| class ActiveMixin: | |
| def get_queryset(self): | |
| queryset = super(ActiveMixin, self).get_queryset() | |
| queryset = queryset.filter(active=True) | |
| return queryset | |
| class DeletedMixin: | |
| def get_queryset(self): | |
| queryset = super(DeletedMixin, self).get_queryset() | |
| queryset = queryset.filter(exist_deleted=True) | |
| return queryset | |
| class SearchMixin: | |
| def get_queryset(self): | |
| queryset = super(SearchMixin, self).get_queryset() | |
| q = self.request.GET.get('q') | |
| if q: | |
| return queryset.filter( | |
| Q(user__first_name__icontains=q) | | |
| Q(user__last_name__icontains=q) | | |
| Q(user__email__icontains=q) | |
| ) | |
| return queryset | |
| class ModelName: | |
| '''Retorna o nome do model.''' | |
| def get_context_data(self, **kwargs): | |
| context = super(ModelName, self).get_context_data(**kwargs) | |
| context['modelname'] = self.model.__name__ | |
| context['model_name'] = self.model._meta.verbose_name.title() | |
| context['model_name_plural'] = self.model._meta.verbose_name_plural.title() | |
| return context | |
| class FilterActiveMixin: | |
| def get_queryset(self): | |
| queryset = super(FilterActiveMixin, self).get_queryset() | |
| active = self.request.GET.get('active') | |
| deactive = self.request.GET.get('deactive') | |
| if active: | |
| return queryset.filter(active=True) | |
| if deactive: | |
| return queryset.filter(active=False) | |
| return queryset | |
| class RequestKwargsMixin: | |
| def get_form_kwargs(self): | |
| kwargs = super(RequestKwargsMixin, self).get_form_kwargs() | |
| if self.request: | |
| kwargs.update({'request': self.request}) | |
| return kwargs | |
| ''' | |
| # views.py | |
| ''' | |
| class FooView(View): | |
| def get(self, request): | |
| template_name = 'foo.html' | |
| return render(request, template_name) | |
| class ResetPassword(View): | |
| def get(self, request, pk, token): | |
| context = {'form': UserForm()} | |
| return render(request, 'accounts/reset_password.html', context) | |
| def post(self, request, pk, token): | |
| # Pegando o email pelo token, mas poderia ser pelo pk também. | |
| email = urlsafe_base64_decode(force_bytes(token)).decode('utf-8') | |
| password = request.POST.get('password') | |
| confirm_password = request.POST.get('confirm_password') | |
| msg_diff_pass = "As senhas não conferem." | |
| pass8 = "A senha deve conter no mínimo 8 caracteres." | |
| msg_success = "Senha alterada com sucesso." | |
| user = User.objects.filter(email=email).first() | |
| kw = {'pk': pk, 'token': token} | |
| if password != confirm_password: | |
| messages.error(request, msg_diff_pass) | |
| return redirect('accounts:reset_password', **kw) | |
| elif len(password) < 8: | |
| messages.error(request, pass8) | |
| return redirect('accounts:reset_password', **kw) | |
| else: | |
| user.set_password(password) | |
| user.save() | |
| messages.success(request, msg_success) | |
| return redirect('accounts:login') | |
| class FooList(ModelName, ListView): | |
| def get_queryset(self, *args, **kwargs): | |
| queryset = super(FooList, self).get_queryset() | |
| search = self.request.GET.get('search') | |
| if search: | |
| return queryset.filter( | |
| Q(pk__icontains=search) | | |
| Q(name__icontains=search) | |
| ) | |
| return queryset | |
| class FooCreate(CreateView): | |
| def get_form_kwargs(self): | |
| kwargs = super(FooCreate, self).get_form_kwargs() | |
| if self.request: | |
| kwargs.update({'request': self.request}) | |
| return kwargs | |
| def form_valid(self, form): | |
| self.object = form.save(commit=False) | |
| # Evita o erro: save() prohibited to prevent data loss due to unsaved | |
| # related object 'user'. | |
| form.instance.save() | |
| # Salva a cidade | |
| city = form.cleaned_data['city'] | |
| Profile.objects.create(user=form.instance, city=city) | |
| return super(FooCreate, self).form_valid(form) | |
| def form_valid(self, form): | |
| kwargs = super(FooCreate, self).form_valid(form) | |
| foo_pk = self.kwargs.get('pk') | |
| foo = Foo.objects.get(pk=foo_pk) | |
| # Associa foo a object | |
| foo.bar = self.object | |
| foo.save() | |
| return kwargs | |
| def get_success_url(self): | |
| foo_pk = self.kwargs.get('pk') | |
| kw = {'pk': foo_pk} | |
| url = reverse('namespace:foo_detail', kwargs=kw) | |
| return url |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment