页面锁定应用程序在有人编辑页面时阻止用户编辑页面。该应用程序针对django管理实现定制。
项目描述
警告
此存储库已存档且不再维护。
Django Admin Page Lock
Django Admin页面锁定允许开发者实现可定制的页面锁定。使用Admin页面锁定,只有指定的(通常是第一个)用户会收到他们的常规权限分配,包括编辑权限(如果用户可用)。后续用户只能获得与第一个用户相比有限的权限,确保用户在锁定激活并由其他用户拥有时不会获得编辑该对象的权限。您可以将页面锁定数据存储在您的应用程序定义的数据库中。
在我们的博客上了解更多信息。
用例
FirstUser
登录页面。FirstUser
现在拥有全部权限(编辑),并且是锁的拥有者。AnyOtherUser
可以查看页面,但不能使用全部权限(无法编辑)。FirstUser
离开页面。- 接下来进入或刷新的人现在拥有全部权限(编辑)并且是锁的拥有者。
功能
- 数据存储有两种模式:
redis
或database
。 - 开发者可以禁用全部锁定功能。
- 被锁页面的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.html
、change_form.html
和 change_list.html
应该覆盖大多数用例。
在所选模板上,您有两个选项
- 将以下代码添加到模板中,这为您提供了更多的自定义空间。
{% 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>
- 使用模板标签
page_lock_bar_bootstrap
或page_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
中,并依赖于所选模型。
乍一看,可能会认为GetPageInfo
和OpenPageConnection
是相同的,但第一个的功能不会改变任何内容,而第二个则会。
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
;
即将实现
- 用户A访问了一个页面。该页面对该用户已锁定。
- 用户B尝试打开该页面。
- 用户B被重定向到着陆页(主页、创建新页面等)。
用途
- 在Showmax,我们将此包作为我们内容管理系统的一部分使用。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分发
构建分发
django-admin-page-lock-2.1.7.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 887adcc04093bbb5bc53aab3e9f3b670cb05c713397925e255f1e89539a5a4b1 |
|
MD5 | 75d65177af9269a92df3004db064d6c2 |
|
BLAKE2b-256 | 626c0e95dc88deb274e00facaac59b956df4eb970567cce6f27a0c39d6a57cc6 |
django-admin_page_lock-2.1.7-py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | d414e6ca59baecbcc1fd573dda08ae11976a242aba257a58d48cb140a7a3da9a |
|
MD5 | 9211b26945b22745cc28543e4cc36796 |
|
BLAKE2b-256 | 952e0f49d7d503cc88f583900513180c77a41e35aea4ab3074d81dcf2de0ce5f |