Merge pull request #9 from ribaguifi/dev/django2.2

Upgrade to Django 2.2.X series
This commit is contained in:
Santiago L 2021-07-13 13:20:30 +02:00 committed by GitHub
commit 639ecdde58
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 49 additions and 75 deletions

View File

@ -23,16 +23,16 @@ def link_wrap(view, view_names):
return wrapper return wrapper
def insert_links(viewset, base_name): def insert_links(viewset, basename):
collection_links = ['api-root', '%s-list' % base_name] collection_links = ['api-root', '%s-list' % basename]
object_links = ['api-root', '%s-list' % base_name, '%s-detail' % base_name] object_links = ['api-root', '%s-list' % basename, '%s-detail' % basename]
exception_links = ['api-root'] exception_links = ['api-root']
list_links = ['api-root'] list_links = ['api-root']
retrieve_links = ['api-root', '%s-list' % base_name] retrieve_links = ['api-root', '%s-list' % basename]
# Determine any `@action` or `@link` decorated methods on the viewset # Determine any `@action` or `@link` decorated methods on the viewset
for methodname in dir(viewset): for methodname in dir(viewset):
method = getattr(viewset, methodname) method = getattr(viewset, methodname)
view_name = '%s-%s' % (base_name, methodname.replace('_', '-')) view_name = '%s-%s' % (basename, methodname.replace('_', '-'))
if hasattr(method, 'collection_bind_to_methods'): if hasattr(method, 'collection_bind_to_methods'):
list_links.append(view_name) list_links.append(view_name)
retrieve_links.append(view_name) retrieve_links.append(view_name)

View File

@ -18,33 +18,33 @@ class LogApiMixin(object):
message = _('Added.') message = _('Added.')
self.log(request, message, ADDITION, instance=self.serializer.instance) self.log(request, message, ADDITION, instance=self.serializer.instance)
return response return response
def perform_create(self, serializer): def perform_create(self, serializer):
""" stores serializer for accessing instance on create() """ """ stores serializer for accessing instance on create() """
super(LogApiMixin, self).perform_create(serializer) super(LogApiMixin, self).perform_create(serializer)
self.serializer = serializer self.serializer = serializer
def update(self, request, *args, **kwargs): def update(self, request, *args, **kwargs):
from django.contrib.admin.models import CHANGE from django.contrib.admin.models import CHANGE
response = super(LogApiMixin, self).update(request, *args, **kwargs) response = super(LogApiMixin, self).update(request, *args, **kwargs)
message = _('Changed data') message = _('Changed data')
self.log(request, message, CHANGE) self.log(request, message, CHANGE)
return response return response
def partial_update(self, request, *args, **kwargs): def partial_update(self, request, *args, **kwargs):
from django.contrib.admin.models import CHANGE from django.contrib.admin.models import CHANGE
response = super(LogApiMixin, self).partial_update(request, *args, **kwargs) response = super(LogApiMixin, self).partial_update(request, *args, **kwargs)
message = _('Changed %s') % response.data message = _('Changed %s') % response.data
self.log(request, message, CHANGE) self.log(request, message, CHANGE)
return response return response
def destroy(self, request, *args, **kwargs): def destroy(self, request, *args, **kwargs):
from django.contrib.admin.models import DELETION from django.contrib.admin.models import DELETION
message = _('Deleted') message = _('Deleted')
self.log(request, message, DELETION) self.log(request, message, DELETION)
response = super(LogApiMixin, self).destroy(request, *args, **kwargs) response = super(LogApiMixin, self).destroy(request, *args, **kwargs)
return response return response
def log(self, request, message, action, instance=None): def log(self, request, message, action, instance=None):
from django.contrib.admin.models import LogEntry from django.contrib.admin.models import LogEntry
instance = instance or self.get_object() instance = instance or self.get_object()
@ -64,21 +64,21 @@ class LinkHeaderRouter(DefaultRouter):
APIRoot = import_class(settings.ORCHESTRA_API_ROOT_VIEW) APIRoot = import_class(settings.ORCHESTRA_API_ROOT_VIEW)
APIRoot.router = self APIRoot.router = self
return APIRoot.as_view() return APIRoot.as_view()
def register(self, prefix, viewset, base_name=None): def register(self, prefix, viewset, basename=None):
""" inserts link headers on every viewset """ """ inserts link headers on every viewset """
if base_name is None: if basename is None:
base_name = self.get_default_base_name(viewset) basename = self.get_default_basename(viewset)
insert_links(viewset, base_name) insert_links(viewset, basename)
self.registry.append((prefix, viewset, base_name)) self.registry.append((prefix, viewset, basename))
def get_viewset(self, prefix_or_model): def get_viewset(self, prefix_or_model):
for _prefix, viewset, __ in self.registry: for _prefix, viewset, __ in self.registry:
if _prefix == prefix_or_model or viewset.queryset.model == prefix_or_model: if _prefix == prefix_or_model or viewset.queryset.model == prefix_or_model:
return viewset return viewset
msg = "%s does not have a regiestered viewset" % prefix_or_model msg = "%s does not have a regiestered viewset" % prefix_or_model
raise KeyError(msg) raise KeyError(msg)
def insert(self, prefix_or_model, name, field, **kwargs): def insert(self, prefix_or_model, name, field, **kwargs):
""" Dynamically add new fields to an existing serializer """ """ Dynamically add new fields to an existing serializer """
viewset = self.get_viewset(prefix_or_model) viewset = self.get_viewset(prefix_or_model)

View File

@ -260,7 +260,6 @@ PASSLIB_CONFIG = (
"default = sha512_crypt\n" "default = sha512_crypt\n"
"deprecated = django_pbkdf2_sha1, django_salted_sha1, django_salted_md5, " "deprecated = django_pbkdf2_sha1, django_salted_sha1, django_salted_md5, "
" django_des_crypt, des_crypt, hex_md5\n" " django_des_crypt, des_crypt, hex_md5\n"
"all__vary_rounds = 0.05\n"
"django_pbkdf2_sha256__min_rounds = 10000\n" "django_pbkdf2_sha256__min_rounds = 10000\n"
"sha512_crypt__min_rounds = 80000\n" "sha512_crypt__min_rounds = 80000\n"
"staff__django_pbkdf2_sha256__default_rounds = 12500\n" "staff__django_pbkdf2_sha256__default_rounds = 12500\n"

View File

@ -138,7 +138,7 @@ class TicketAdmin(ExtendedModelAdmin):
'owner__username' 'owner__username'
) )
actions = ( actions = (
mark_as_unread, mark_as_read, 'delete_selected', reject_tickets, mark_as_unread, mark_as_read, reject_tickets,
resolve_tickets, close_tickets, take_tickets resolve_tickets, close_tickets, take_tickets
) )
sudo_actions = ('delete_selected',) sudo_actions = ('delete_selected',)

View File

@ -175,16 +175,6 @@ commit.url_name = 'commit'
commit.short_description = _("Commit") commit.short_description = _("Commit")
def delete_selected(modeladmin, request, queryset):
""" Has to have same name as admin.actions.delete_selected """
related_transactions = helpers.pre_delete_processes(modeladmin, request, queryset)
response = actions.delete_selected(modeladmin, request, queryset)
if response is None:
helpers.post_delete_processes(modeladmin, request, related_transactions)
return response
delete_selected.short_description = actions.delete_selected.short_description
def report(modeladmin, request, queryset): def report(modeladmin, request, queryset):
if queryset.model == Transaction: if queryset.model == Transaction:
transactions = queryset transactions = queryset

View File

@ -179,7 +179,7 @@ class TransactionProcessAdmin(ChangeViewActionsMixin, admin.ModelAdmin):
change_view_actions = ( change_view_actions = (
actions.mark_process_as_executed, actions.abort, actions.commit, actions.report actions.mark_process_as_executed, actions.abort, actions.commit, actions.report
) )
actions = change_view_actions + (actions.delete_selected,) actions = change_view_actions
display_state = admin_colored('state', colors=PROCESS_STATE_COLORS) display_state = admin_colored('state', colors=PROCESS_STATE_COLORS)
display_created_at = admin_date('created_at', short_description=_("Created")) display_created_at = admin_date('created_at', short_description=_("Created"))
@ -233,6 +233,13 @@ class TransactionProcessAdmin(ChangeViewActionsMixin, admin.ModelAdmin):
helpers.post_delete_processes(self, request, related_transactions) helpers.post_delete_processes(self, request, related_transactions)
return response return response
def delete_queryset(self, request, queryset):
# override default admin action delete behaviour
related_transactions = helpers.pre_delete_processes(self, request, queryset)
super().delete_queryset(self, request, queryset)
helpers.post_delete_processes(self, request, related_transactions)
admin.site.register(PaymentSource, PaymentSourceAdmin) admin.site.register(PaymentSource, PaymentSourceAdmin)
admin.site.register(Transaction, TransactionAdmin) admin.site.register(Transaction, TransactionAdmin)
admin.site.register(TransactionProcess, TransactionProcessAdmin) admin.site.register(TransactionProcess, TransactionProcessAdmin)

View File

@ -5,7 +5,6 @@ from .models import Transaction
def pre_delete_processes(modeladmin, request, queryset): def pre_delete_processes(modeladmin, request, queryset):
""" Has to have same name as admin.actions.delete_selected """
if not queryset: if not queryset:
messages.warning(request, messages.warning(request,
_("No transaction process selected.")) _("No transaction process selected."))

View File

@ -128,29 +128,3 @@ def create_link(modeladmin, request, queryset):
return TemplateResponse(request, 'admin/systemusers/systemuser/create_link.html', context) return TemplateResponse(request, 'admin/systemusers/systemuser/create_link.html', context)
create_link.url_name = 'create-link' create_link.url_name = 'create-link'
create_link.tool_description = _("Create link") create_link.tool_description = _("Create link")
def delete_selected(modeladmin, request, queryset):
""" wrapper arround admin.actions.delete_selected to prevent main system users deletion """
opts = modeladmin.model._meta
app_label = opts.app_label
# Check that the user has delete permission for the actual model
if not modeladmin.has_delete_permission(request):
raise PermissionDenied
else:
accounts = []
for user in queryset:
if user.is_main:
accounts.append(user.username)
if accounts:
n = len(accounts)
messages.error(request, ungettext(
"You have selected one main system user (%(accounts)s), which can not be deleted.",
"You have selected some main system users which can not be deleted (%(accounts)s).",
n) % {
'accounts': ', '.join(accounts[:10]+['...'] if n > 10 else accounts)
}
)
return
return admin.actions.delete_selected(modeladmin, request, queryset)
delete_selected.short_description = _("Delete selected %(verbose_name_plural)s")

View File

@ -1,4 +1,4 @@
from django.contrib import admin from django.contrib import admin, messages
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from orchestra.admin import ExtendedModelAdmin, ChangePasswordAdminMixin from orchestra.admin import ExtendedModelAdmin, ChangePasswordAdminMixin
@ -7,7 +7,7 @@ from orchestra.contrib.accounts.actions import list_accounts
from orchestra.contrib.accounts.admin import SelectAccountAdminMixin from orchestra.contrib.accounts.admin import SelectAccountAdminMixin
from orchestra.contrib.accounts.filters import IsActiveListFilter from orchestra.contrib.accounts.filters import IsActiveListFilter
from .actions import set_permission, create_link, delete_selected from .actions import set_permission, create_link
from .filters import IsMainListFilter from .filters import IsMainListFilter
from .forms import SystemUserCreationForm, SystemUserChangeForm from .forms import SystemUserCreationForm, SystemUserChangeForm
from .models import SystemUser from .models import SystemUser
@ -43,18 +43,18 @@ class SystemUserAdmin(ChangePasswordAdminMixin, SelectAccountAdminMixin, Extende
form = SystemUserChangeForm form = SystemUserChangeForm
ordering = ('-id',) ordering = ('-id',)
change_view_actions = (set_permission, create_link) change_view_actions = (set_permission, create_link)
actions = (disable, enable, delete_selected, list_accounts) + change_view_actions actions = (disable, enable, list_accounts) + change_view_actions
def display_main(self, user): def display_main(self, user):
return user.is_main return user.is_main
display_main.short_description = _("Main") display_main.short_description = _("Main")
display_main.boolean = True display_main.boolean = True
def display_home(self, user): def display_home(self, user):
return user.get_home() return user.get_home()
display_home.short_description = _("Home") display_home.short_description = _("Home")
display_home.admin_order_field = 'home' display_home.admin_order_field = 'home'
def get_form(self, request, obj=None, **kwargs): def get_form(self, request, obj=None, **kwargs):
form = super(SystemUserAdmin, self).get_form(request, obj, **kwargs) form = super(SystemUserAdmin, self).get_form(request, obj, **kwargs)
form.account = self.account form.account = self.account
@ -65,9 +65,15 @@ class SystemUserAdmin(ChangePasswordAdminMixin, SelectAccountAdminMixin, Extende
formfield = form.base_fields['groups'] formfield = form.base_fields['groups']
formfield.queryset = formfield.queryset.exclude(id=obj.id) formfield.queryset = formfield.queryset.exclude(id=obj.id)
return form return form
def has_delete_permission(self, request, obj=None): def has_delete_permission(self, request, obj=None):
if obj and obj.is_main: if obj and obj.is_main:
self.message_user(request, _(
"You have selected one main system user (%(account)s), which can not be deleted.",
) % {'account': obj},
messages.ERROR,
)
return False return False
return super(SystemUserAdmin, self).has_delete_permission(request, obj) return super(SystemUserAdmin, self).has_delete_permission(request, obj)

View File

@ -1,24 +1,23 @@
Django==2.1 Django==2.2.24
django-fluent-dashboard==1.0.1 django-fluent-dashboard==1.0.1
django-admin-tools==0.9.1 django-admin-tools==0.9.1
django-extensions==2.1.1 django-extensions==3.1.3
django-celery==3.2.1 django-celery==3.2.1
celery==3.1.23 celery==3.1.23
kombu==3.0.35 kombu==3.0.35
billiard==3.3.0.23 billiard==3.3.0.23
Markdown==3.3.4 Markdown==3.3.4
djangorestframework==3.10.3 djangorestframework==3.12.4
ecdsa==0.11 Pygments==2.9.0
Pygments==1.6 django-filter==2.4.0
django-filter==2.2.0 jsonfield==3.1.0
jsonfield==0.9.22
python-dateutil>=2.7.0 python-dateutil>=2.7.0
https://github.com/glic3rinu/passlib/archive/master.zip passlib==1.7.4
django-iban==0.3.0 django-iban==0.3.0
requests requests
phonenumbers phonenumbers==8.12.27
django-countries django-countries
django-localflavor django-localflavor==3.1
amqp amqp
anyjson anyjson
pytz pytz