diff --git a/README.md b/README.md index 966bf642d6a9701f5717c7c56ab5dea6f7963ad4..9363e93342d212380a798bd3d8186efbeb1d2432 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ DJANGO 数据库增强 ================ -[![Django Kelove Setting Version](https://img.shields.io/badge/stable-v0.1.2-blue.svg)](https://gitee.com/itxq/django-kelove-database) +[![Django Kelove Setting Version](https://img.shields.io/badge/stable-v0.1.3-blue.svg)](https://gitee.com/itxq/django-kelove-database) [![Python Version](https://img.shields.io/badge/Python-3.6+-blue.svg)](https://www.python.org/) [![Django Version](https://img.shields.io/badge/Django-v3.1+-important.svg)](https://www.djangoproject.com/) [![LICENSE](https://img.shields.io/badge/license-Apache%202.0-brightgreen.svg)](https://gitee.com/itxq/django-kelove-database/blob/master/LICENSE) diff --git a/django_kelove_database/admin.py b/django_kelove_database/admin.py index a96514b87dcb229f1548809d34c9548b9c929429..2f3552a3d0efb44ca077002394f8bb2eb064ffc2 100644 --- a/django_kelove_database/admin.py +++ b/django_kelove_database/admin.py @@ -3,7 +3,13 @@ admin.py By IT小强xqitw.cn At 2/2/21 10:53 AM """ - +from django.conf import settings +from django.contrib.auth import get_permission_codename +from django.core.exceptions import PermissionDenied +from django.http import HttpResponseRedirect +from django.shortcuts import render +from django.urls import path, reverse, NoReverseMatch +from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from django.contrib.admin import ModelAdmin, site @@ -16,16 +22,19 @@ class CkfinderResource(ModelAdmin): """ list_display = ( - 'name', + 'pk', 'adapter', + 'name', 'max_size', 'path', 'url', 'allowed_extensions', 'denied_extensions', 'enabled', - 'verify_permissions' + 'verify_permissions', ) + list_display_links = ('pk', 'adapter') + list_editable = ('name', 'max_size', 'enabled', 'verify_permissions') list_filter = ('adapter', 'enabled', 'verify_permissions') search_fields = ('name', 'adapter') @@ -72,6 +81,59 @@ class CkfinderResource(ModelAdmin): }), ) + def get_list_display(self, request): + list_display = list(set(super().get_list_display(request))) + if 'action_list' in list_display: + list_display.remove('action_list') + if self.has_ckfinder_manage_permission(request=request): + list_display.append('action_list') + return list_display + + def get_urls(self): + info = self.model._meta.app_label, self.model._meta.model_name + urls = super().get_urls() + urls = [ + path('ckfinder/', self.ckfinder_view, name='%s_%s_ckfinder' % info) + ] + urls + return urls + + def ckfinder_view(self, request, **kwargs): + """ + ckfinder 管理页面 + :param request: + :param kwargs: + :return: + """ + if not request.user.is_authenticated: + try: + login_url = reverse(settings.LOGIN_URL) + except NoReverseMatch: + login_url = reverse('admin:login') + return HttpResponseRedirect(login_url) + if not self.has_ckfinder_manage_permission(request): + raise PermissionDenied + + return render(request=request, template_name='kelove_database/ckfinder/ckfinder.html', context={ + "ck_finder_api_url": reverse('django_kelove_database:ckfinder_api'), + "ck_finder_api_display_folders_panel": 0 + }) + + def has_ckfinder_manage_permission(self, request): + """ + 判断是否有管理权限 + """ + opts = self.opts + codename = get_permission_codename('manage', opts) + return request.user.has_perm("%s.%s" % (opts.app_label, codename)) + + def action_list(self, obj): + return mark_safe('{title}'.format( + url=reverse('admin:django_kelove_database_ckfinderresource_ckfinder'), + title='管理' + )) + + action_list.short_description = '操作' + if not site.is_registered(models.CkfinderResource): site.register(models.CkfinderResource, CkfinderResource) diff --git a/django_kelove_database/ckfinder/adapter.py b/django_kelove_database/ckfinder/adapter.py index 78fe12a4a3e46ca0937efdc7ae0a7f97fb2b7052..9d8ef4297b924c38d6f001a82ee3c6d16b8f681a 100644 --- a/django_kelove_database/ckfinder/adapter.py +++ b/django_kelove_database/ckfinder/adapter.py @@ -577,7 +577,7 @@ class LocalAdapter(AdapterInterface, ABC): return os.path.getsize(path) / 1024 def get_file_date(self, path: str) -> str: - return time.strftime("%Y%m%d%H:%M:%S", time.localtime(os.path.getmtime(path))) + return time.strftime("%Y%m%d%H%M%S", time.localtime(os.path.getmtime(path))) def get_file_mimetype(self, path: str) -> str: return mimetypes.guess_type(path)[0] diff --git a/django_kelove_database/migrations/0003_alter_ckfinderresource_options.py b/django_kelove_database/migrations/0003_alter_ckfinderresource_options.py new file mode 100644 index 0000000000000000000000000000000000000000..ac4f1e7a9fc45cb73916f3cae394894128e51ba2 --- /dev/null +++ b/django_kelove_database/migrations/0003_alter_ckfinderresource_options.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.4 on 2021-06-04 10:28 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('django_kelove_database', '0002_alter_ckfinderresource_id'), + ] + + operations = [ + migrations.AlterModelOptions( + name='ckfinderresource', + options={'permissions': (('manage_ckfinderresource', '文件管理'),), 'verbose_name': 'Ckfinder 资源', 'verbose_name_plural': 'Ckfinder 资源'}, + ), + ] diff --git a/django_kelove_database/models.py b/django_kelove_database/models.py index 0aea8bac5607c65b991ec76c176d05734be97059..48e94eabf51fd04301e3c5ae1c8aadb624d85e4a 100644 --- a/django_kelove_database/models.py +++ b/django_kelove_database/models.py @@ -240,6 +240,9 @@ class CkfinderResource(models.Model): } def verify_permission(self, permissions, action): + has_manage_permission = self.get_permission_code('manage_ckfinderresource', with_pk=False) + if has_manage_permission in permissions: + return True if not self.verify_permissions: return getattr(self, action) return self.get_permission_code(action) in permissions @@ -277,18 +280,21 @@ class CkfinderResource(models.Model): content_type=content_type, ).delete() - def get_permission_codename(self, action): + def get_permission_codename(self, action, with_pk=True): + if not with_pk: + return action resource_pk = self.pk return f'{action}_{resource_pk}' - def get_permission_code(self, action): + def get_permission_code(self, action, with_pk=True): """ 获取配置权限代码(包括app label) + :param with_pk: :param action: :return: """ - return "%s.%s" % (self._meta.app_label, self.get_permission_codename(action)) + return "%s.%s" % (self._meta.app_label, self.get_permission_codename(action=action, with_pk=with_pk)) def get_resource(self): """ @@ -329,9 +335,15 @@ class CkfinderResource(models.Model): extensions = str(extensions).split(',') if extensions else [] return [str(extension).lower() for extension in extensions] + def __str__(self): + return f'{self.name}({self.get_adapter_display()})' + class Meta: verbose_name = _('Ckfinder 资源') verbose_name_plural = _('Ckfinder 资源') + permissions = ( + ('manage_ckfinderresource', '文件管理'), + ) @receiver(post_save, sender=CkfinderResource) diff --git a/pyproject.toml b/pyproject.toml index 2d52d3573f65edeff48b4bde30647471d5ecbedd..16d67fdfbd6546b2d31e2546707ae6f4fed31f8f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "django-kelove-database" -version = "0.1.2" +version = "0.1.3" description = "DJANGO 数据库增强插件" @@ -50,9 +50,9 @@ pillow = "^8.0" mysqlclient = "^2.0.3" [[tool.poetry.source]] -name = "tencent" +name = "aliyun" default = true -url = "https://mirrors.cloud.tencent.com/pypi/simple/" +url = "https://mirrors.aliyun.com/pypi/simple/" [build-system] requires = ["poetry-core>=1.0.0"]