Skip to content

Instantly share code, notes, and snippets.

@rg3915
Created November 17, 2018 05:55
Show Gist options
  • Select an option

  • Save rg3915/b5df013994f4194420f9f57a78541d89 to your computer and use it in GitHub Desktop.

Select an option

Save rg3915/b5df013994f4194420f9f57a78541d89 to your computer and use it in GitHub Desktop.
Django Class methods override
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