跳转到主要内容

页面锁定应用程序在有人编辑页面时阻止用户编辑页面。该应用程序针对django管理实现定制。

项目描述

警告

此存储库已存档且不再维护。

Django Admin Page Lock

Django Admin页面锁定允许开发者实现可定制的页面锁定。使用Admin页面锁定,只有指定的(通常是第一个)用户会收到他们的常规权限分配,包括编辑权限(如果用户可用)。后续用户只能获得与第一个用户相比有限的权限,确保用户在锁定激活并由其他用户拥有时不会获得编辑该对象的权限。您可以将页面锁定数据存储在您的应用程序定义的数据库中。

我们的博客上了解更多信息。

用例

  1. FirstUser 登录页面。 FirstUser 现在拥有全部权限(编辑),并且是锁的拥有者。
  2. AnyOtherUser 可以查看页面,但不能使用全部权限(无法编辑)。
  3. FirstUser 离开页面。
  4. 接下来进入或刷新的人现在拥有全部权限(编辑)并且是锁的拥有者。

功能

  • 数据存储有两种模式:redisdatabase
  • 开发者可以禁用全部锁定功能。
  • 被锁页面的URL可以带或不带URL参数。
  • 锁定历史可以保存(例如时间、用户名)。
  • 非常可定制。

要求

  • Django 1.8, 1.9, 1.11, 2.0, 2.1, 2.2;
  • Python 2.7, 3.6, 3.7, 3.8, 3.9。

安装

以下每个步骤都需要配置,以便使包完全正常工作。

获取代码

源代码目前托管在GitHub上:https://github.com/Showmax/django-admin-page-lock

最新发布版本的二进制安装程序可在Python包索引(PyPI)中找到。

要使用pip安装,只需运行以下命令

pip install django-admin-page-lock

先决条件

请确保将 'admin_page_lock' 添加到您的 INSTALLED_APPS 设置中

INSTALLED_APPS = [
    # ...
    'admin_page_lock',
]

不要忘记在此更改后运行 ./manage.py migrate./manage.py syncdb

用法

模板

要启用Admin Page Lock,您需要更新要使其工作的模板。模板 base.htmlchange_form.htmlchange_list.html 应该覆盖大多数用例。

在所选模板上,您有两个选项

  1. 将以下代码添加到模板中,这为您提供了更多的自定义空间。
{% load static %}
{% load i18n %}
<html>
  <head>
    <!-- Add the page_lock.js to the template  -->
    <script src="{% static 'js/page_lock.js' %}"></script>
  </head>
  <body>
    <!-- ... -->
    <div id="page_lock_bar">
      <div id="page_lock_message_display"></div>
      <div id="page_lock_counter_display"></div>
      <button type="button" id="page_lock_refresh_button">{% trans "REFRESH" %}</button>
      <button type="button" id="page_lock_reload_button">{% trans "RELOAD" %}</button>
      <input type="hidden" id="page_lock_template_data" value="{{ page_lock_template_data }}">
      <input type="hidden" id="page_lock_api_interval" value="{{ page_lock_api_interval }}">
    </div>
    <!-- ... -->
  </body>
</html>
  1. 使用模板标签 page_lock_bar_bootstrappage_lock_bar_plain。当使用此方法时,会自动添加JavaScript。
# settings.py

TEMPLATES = [
    ...
    'OPTIONS': {
        ...
        'libraries': {
            'page_lock_bar_bootstrap': 'admin_page_lock.templatetags.page_lock_bar'
        },
    }
{% load page_lock_bar_bootstrap %}
...
{% page_lock_bar_bootstrap %}

禁用锁定逻辑

要隐藏不需要锁定逻辑的页面的锁定按钮,通过添加以下JavaScript块来更新所需的模板。

<script type="text/javascript">
  $(document).ready(function() {
      var api_interval = parseInt($('#page_lock_api_interval').val());
      if (!api_interval) {
          $('.page_lock_bar').hide();
      }
  });
</script>

隐藏特定的HTML元素

将类 page_lock_block 添加到您想从未持有锁的用户隐藏的任何HTML标签。此功能的常见用法是隐藏未持有锁的用户的提交按钮,例如

<div class="page_lock_block">
   <input type="submit" value="Submit" />
</div>

视图

要应用锁定逻辑的视图必须继承,使用

  • PageLockAdminMixin 用于Django Admin视图;
  • PageLockViewMixin 用于Django视图。
# example/models.py
from django.db import models
from admin_page_lock.mixins import PageLockViewMixin


class Example(PageLockViewMixin, models.Model):
    ...

# example/admin.py
from admin_page_lock.mixins import PageLockAdminMixin
from django.contrib import admin
from .models import Example


class ExampleAdmin(PageLockAdminMixin, admin.ModelAdmin):
    ...

URL

为了使该模块发出的请求正常工作,将以下内容添加到您网站的 urlpatterns 中

# urls.py

urlpatterns = [
    ...
    path('page_lock/', include('admin_page_lock.urls')),
]

设置参数

如果您不想使用默认参数,请在设置中重新定义参数

名称 类型 描述
API_INTERVAL 整数 js 发出的API调用之间的间隔
CAN_OPEN_MORE_TABS 布尔值 用户是否可以在一个页面中打开多个标签页
DISABLE_CRSF_TOKEN 布尔值 是否应用程序使用 CSRF 保护
DISABLE 布尔值 开关锁定逻辑
HANDLER_CLASS 字符串 如果您想定义自己的处理程序
HOMEPAGE 字符串 如果出现问题,将用户重定向到的页面
KEEP_DB_LOCKS 布尔值 保留锁定历史(仅适用于DB模型)
MESSAGES 字典 用于自定义消息(尚未实现)
TIMEOUT 整数 用户停留在页面上不刷新的时间间隔
MODEL 字符串 数据存储的位置(《redis》或《database》)
REDIS_SETTINGS 字典 应用程序 redis 的设置
URL_IGNORE_PARAMETERS 布尔值 是否考虑URL参数

APIs

以下列出了几个API。这些API被实现为既可用于前端(js)也可用于后端(python)。逻辑实现在handlers.py中,并依赖于所选模型。

乍一看,可能会认为GetPageInfoOpenPageConnection是相同的,但第一个的功能不会改变任何内容,而第二个则会。

1. ClosePageConnection

方法 名称 类型 描述
POST url 字符串 页面url
POST user_reference 字符串 用户引用(id当前部分
POST csrf_token 字符串 生成的csfr保护令牌
GET is_locked 布尔值 页面是否被锁定

2. GetPageInfo

方法 名称 类型 描述
POST url 字符串 页面url
POST user_reference 字符串 用户引用(id当前部分
POST csrf_token 字符串 生成的csfr保护令牌
GET is_locked 布尔值 页面是否被锁定
GET locked_by 字符串 锁定当前页面的用户引用
GET page_lock_settings 字典 设置的各种参数
GET reconnected 布尔值 用户是否重新连接(尚未实现)

3. OpenPageConnection

方法 名称 类型 描述
POST url 字符串 页面url
POST user_reference 字符串 用户引用(id当前部分
POST csrf_token 字符串 生成的csfr保护令牌
GET is_locked 布尔值 页面是否被锁定
GET locked_by 字符串 锁定当前页面的用户引用
GET page_lock_settings 字典 设置的各种参数
GET reconnected 布尔值 用户是否重新连接(尚未实现)

待办事项

仍有一些功能缺失。我会非常感激任何贡献。

  • 编写单元测试;
  • 完成使用CAN_OPEN_MORE_TABS设置参数;
  • 将有关从OpenPageConnection重新打开的逻辑迁移到新的APIReopenPageConnection

即将实现

  1. 用户A访问了一个页面。该页面对该用户已锁定。
  2. 用户B尝试打开该页面。
  3. 用户B被重定向到着陆页(主页、创建新页面等)。

用途

  • Showmax,我们将此包作为我们内容管理系统的一部分使用。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

django-admin-page-lock-2.1.7.tar.gz (22.7 kB 查看散列)

上传时间

构建分发

django_admin_page_lock-2.1.7-py3-none-any.whl (26.3 kB 查看散列)

上传时间 Python 3

由以下支持