From a7f99fe7cf71a96b00dd5cc565efb4a9747c6522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IT=E5=B0=8F=E5=BC=BAxqitw=2Ecn?= Date: Fri, 4 Jun 2021 18:09:28 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E5=88=97=E8=A1=A8=E8=A1=8C=E5=86=85?= =?UTF-8?q?=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- django_kelove_database/admin.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/django_kelove_database/admin.py b/django_kelove_database/admin.py index a96514b..ea7e7e2 100644 --- a/django_kelove_database/admin.py +++ b/django_kelove_database/admin.py @@ -16,8 +16,9 @@ class CkfinderResource(ModelAdmin): """ list_display = ( - 'name', + 'pk', 'adapter', + 'name', 'max_size', 'path', 'url', @@ -26,6 +27,8 @@ class CkfinderResource(ModelAdmin): 'enabled', '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') -- Gitee From 27cf35f21e3dcb4b51f99a883ad938c4b1aa053c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IT=E5=B0=8F=E5=BC=BAxqitw=2Ecn?= Date: Fri, 4 Jun 2021 19:09:33 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- django_kelove_database/admin.py | 44 ++++++++++++++++++- .../0003_alter_ckfinderresource_options.py | 17 +++++++ django_kelove_database/models.py | 15 +++++-- 3 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 django_kelove_database/migrations/0003_alter_ckfinderresource_options.py diff --git a/django_kelove_database/admin.py b/django_kelove_database/admin.py index ea7e7e2..0dd9384 100644 --- a/django_kelove_database/admin.py +++ b/django_kelove_database/admin.py @@ -3,7 +3,12 @@ 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.translation import gettext_lazy as _ from django.contrib.admin import ModelAdmin, site @@ -75,6 +80,43 @@ class CkfinderResource(ModelAdmin): }), ) + 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)) + if not site.is_registered(models.CkfinderResource): site.register(models.CkfinderResource, CkfinderResource) 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 0000000..ac4f1e7 --- /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 0aea8ba..39bcc4f 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): """ @@ -332,6 +338,9 @@ class CkfinderResource(models.Model): class Meta: verbose_name = _('Ckfinder 资源') verbose_name_plural = _('Ckfinder 资源') + permissions = ( + ('manage_ckfinderresource', '文件管理'), + ) @receiver(post_save, sender=CkfinderResource) -- Gitee From c5d9856c9e34846fdf86da8e82dc3d08631436b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IT=E5=B0=8F=E5=BC=BAxqitw=2Ecn?= Date: Sun, 6 Jun 2021 10:06:06 +0800 Subject: [PATCH 3/7] __str__ --- django_kelove_database/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/django_kelove_database/models.py b/django_kelove_database/models.py index 39bcc4f..48e94ea 100644 --- a/django_kelove_database/models.py +++ b/django_kelove_database/models.py @@ -335,6 +335,9 @@ 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 资源') -- Gitee From 347536da190f8f9c2b79929ada70ab657a5e263a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IT=E5=B0=8F=E5=BC=BAxqitw=2Ecn?= Date: Wed, 9 Jun 2021 18:29:29 +0800 Subject: [PATCH 4/7] =?UTF-8?q?ckfinder=E8=BF=94=E5=9B=9E=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=A0=BC=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- django_kelove_database/ckfinder/adapter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_kelove_database/ckfinder/adapter.py b/django_kelove_database/ckfinder/adapter.py index 78fe12a..9d8ef42 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] -- Gitee From 89785459b73a2c59d4b714a827eacd7205c736c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IT=E5=B0=8F=E5=BC=BAxqitw=2Ecn?= Date: Wed, 9 Jun 2021 18:46:49 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- django_kelove_database/admin.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/django_kelove_database/admin.py b/django_kelove_database/admin.py index 0dd9384..2f3552a 100644 --- a/django_kelove_database/admin.py +++ b/django_kelove_database/admin.py @@ -9,6 +9,7 @@ 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 @@ -30,7 +31,7 @@ class CkfinderResource(ModelAdmin): 'allowed_extensions', 'denied_extensions', 'enabled', - 'verify_permissions' + 'verify_permissions', ) list_display_links = ('pk', 'adapter') list_editable = ('name', 'max_size', 'enabled', 'verify_permissions') @@ -80,6 +81,14 @@ 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() @@ -117,6 +126,14 @@ class CkfinderResource(ModelAdmin): 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) -- Gitee From 824fb2780522b5dea206c4e305a07d51a72bb938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IT=E5=B0=8F=E5=BC=BAxqitw=2Ecn?= Date: Wed, 9 Jun 2021 18:49:48 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 966bf64..9363e93 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/pyproject.toml b/pyproject.toml index 2d52d35..6437052 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 数据库增强插件" -- Gitee From b6079737eeda3e7f222e6f9181bf906c5e3b0c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IT=E5=B0=8F=E5=BC=BAxqitw=2Ecn?= Date: Wed, 9 Jun 2021 18:50:47 +0800 Subject: [PATCH 7/7] =?UTF-8?q?tencent=20--=E3=80=8Baliyun?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6437052..16d67fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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"] -- Gitee