Plone插件,用于在日历中预定物品。
项目描述
这不是Outlook或Google Calendar的替代品,而是一个在后台管理预定并在前端提供预定的系统。
更新到1.2.0
警告:seantis.reservation的1.2.0版本内部更改很大,因此您不能直接从1.0.12(2013年9月27日)之前的seantis.reservation版本升级到1.2.0。
如果您确实有这样一个旧版本,请首先安装seantis.reservation 1.1.5,运行所有升级步骤,然后安装1.2.0。
介绍
最初与瑞士苏黎世市政府共同开发,此插件旨在将不同的预定系统集成为一个灵活的解决方案。
它通过提供以下用例的方式来实现
管理公司会议室。用户自行预订房间,无需权限确认/拒绝其预订。
管理托儿所位置。父母为他们的孩子申请托儿所位置。托儿所的工作人员会审核申请人并决定谁获得位置。父母可以将申请添加到等待名单。
管理社区设施。公民可以在线查看设施的可用性并致电市政府预订设施。管理是内部进行的(可能通过现有的软件)。插件仅用于显示。
屏幕截图
构建状态
测试覆盖率
最新PyPI版本
需求
Python 2.7
Plone 4.3+(Plone 4.1和4.2必须放弃,抱歉)
Linux / Posix(Windows可能或可能不工作)
Postgresql 9.1+(旧版本将无法工作!)
1024MB+ RAM
seantis.reservation 在 IE8+、Chrome 和 Firefox 上进行了测试。IE7 不受支持!请注意,IE8 和 IE9 只有在 Plone 网站处于生产模式下才能正常工作。原因是那些浏览器会忽略第 32 个之后的每个样式表。在生产中,这些样式表会被合并。
请注意,我们严重依赖 JavaScript,因为显示的日历是通过 JavaScript 渲染的。如果您的需求是不使用 JavaScript 运行,那么这并不是您要找的设备。
展示
局限性
这些都是 seantis.reservation 当前无法完成或完成不好的事情
多语言。在您选择的任何语言中运行 seantis.reservation 都是完全可行的,尽管您可能需要为自己进行一些翻译。然而,您可能会发现运行多语言网站(语言基于每个请求设置)的能力不足或有粗糙的边缘。它应该主要工作,但我们无法保证它,也不能告诉您我们已经很好地测试了这一点。
时区。我们目前没有存储与资源相关的时区。因此,比较不同时区的不同资源是不可能的。
重复。尽管可以创建具有简单每日重复的预订,但不能修改它们,因此如果您创建了 1000 个重复项并且犯了错误,您必须删除所有项或逐一调整它们。
安装
设置说明假定了一个 Ubuntu/Debian 服务器安装,以及 Plone 的基本知识。
安装所需的软件包
sudo apt-get install git-core sudo apt-get install libxml2 libxml2-dev sudo apt-get install libxslt1.1 libxslt1-dev sudo apt-get install python2.7 python2.7-dev python-virtualenv
安装 PostgreSQL
运行安装程序
sudo apt-get install postgresql-9.3 sudo apt-get install postgresql-9.3-dev
如果找不到 9.3,请尝试 9.2 或 9.1。
如果找不到开发包,请尝试
sudo apt-get install postgresql-server-dev-all
创建数据库用户(将 your_password 替换为您的密码)。此密码以后需要使用!
sudo -u postgres psql -c "CREATE USER reservation WITH PASSWORD 'your_password'"
为您的 Plone 网站创建数据库。每个 Plone 网站应有自己的数据库,其名称与 Plone 网站标识符相同。在这里,我们稍后将使用 'reservations' 作为 Plone 网站标识符
sudo -u postgres psql -c "CREATE DATABASE reservations ENCODING 'UTF8' TEMPLATE template0"
授予预订用户所需的权限
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE reservations to reservation"
安装 Plone
将构建出配置文件下载到将存放您的 Plone 安装的文件夹。
wget -qO - https://raw.github.com/seantis/seantis.reservation/master/buildout/buildouts.sh | bash
或者如果您没有 wget(如 OS X 上)
curl https://raw.github.com/seantis/seantis.reservation/master/buildout/buildouts.sh | bash
编辑数据库连接设置数据库.cfg 文件。
nano database.cfg
通常您会希望使用以下设置在数据库.cfg 中。务必将您的用户名和密码更改为在“安装 PostgreSQL”步骤中输入的值。
dsn postgresql+psycopg2://user:password@localhost:5432/{*}
这将使用与 Plone 网站标识符相同的数据库名称。因此,如果您的 Plone 网站的标识符是 demo(即在本地的 localhost:8000/demo 上提供服务),那么数据库名称将假设为 'demo'。
下载引导脚本
wget https://raw.githubusercontent.com/seantis/seantis.reservation/master/buildout/bootstrap.py
再次,使用 curl 的替代方法
curl https://raw.githubusercontent.com/seantis/seantis.reservation/master/buildout/bootstrap.py > bootstrap.py
创建一个虚拟环境
mkdir reservations cd reservations virtualenv -p python2.7 .
引导您的环境
python2.7 bootstrap.py
运行安装程序(并让咖啡机开始工作)
bin/buildout
如果一切顺利,您现在可以启动实例
bin/instance fg
运行测试
测试是在 PostgreSQL 数据库上运行的。Seantis 预订使用 testing.postgresql,它将自动使用本地 PostgreSQL 服务器设置一个临时数据库。
这意味着测试要工作,应安装 PostgreSQL 服务器版本 9.1+。如果是这种情况,您可以按以下方式运行测试
运行开发构建
python bootstrap.py bin/buildout -c develop.cfg
然后运行测试
bin/test -s seantis.reservation
创建预订 Plone 网站
创建网站
启动实例后,导航到 Plone 根目录
https://127.0.0.1:8080
应该显示“Plone 正在运行”。在此网站上点击“创建新的 Plone 网站”。如果您使用了 develop.cfg,用户名和密码都是“admin”。
显然,您不希望在生产中使用 develop.cfg!
在“创建 Plone 网站”表单中,您应该输入 Plone 网站的名称和标题,然后勾选以下插件框
Seantis 预约 - 用于默认 Plone 主题
完成这些操作后,点击“创建 Plone 网站”
创建资源文件夹
在您刚创建的 Plone 网站上,点击“添加新...”,然后选择“文件夹”。可以使用您喜欢的任何名称。
添加资源
在新建的文件夹中,点击“显示”,然后选择“资源列表”。
这将把文件夹转换成一个专门用于显示资源的视图。
更改视图后,点击“添加新...”,然后选择“资源”。输入您喜欢的任何名称。
现在您应该看到一个日历,您可以在其中创建可能被预约的分配。在文件夹视图中向上一个层级,您可以添加更多资源并比较它们。当然还有更多东西要学习,但这只是 Seantis 预约模块的基本设置。
数据结构
要真正理解 seantis.reservation,了解一些核心概念非常重要。
资源
资源是 Dxterity 内容类型,显示日历并与 seantis.reservation 的核心进行交互。它们在 UI 方面很强大,但在数据库中只是外键。
分配
熟悉 Outlook 或 Google Calendar 的人都知道,可以点击空位添加新的预约。
但在 seantis.reservation 中并非如此。在这个模块中,可能被预约的位置必须首先标记为可预约。这被称为分配。
想法是分配可能被预约的时间。这就像宣布应该由预约管理的时间。Outlook 和 Google Calendar 默认将所有时间视为已分配和受其管理。
原因之一是,只有通过限制可用时间,我们才能计算有意义的利用率数字。另一个原因是,某些时间段可能被过度预订,而其他时间段则不是,或者说,一般而言:某些时间段与其他时间段不同。
因此,分配定义了时间可以如何被预约。对于任何给定的资源,它们不能重叠,并且独立于 Plone,是 SQL 数据库模型的一部分。
已预约时段
在预约分配或分配的一部分时,将生成已预约时段。这确保了不会意外地两次授予同一预约。
已预约时段可能每 5 分钟开始一次。例如,在 5.35 或 5.40,而不是在 5.36 或 5.39。当预约 45 分钟的分配时,将产生许多已预约时段并对其进行对齐。它们的 主键确保在底层基础上不会发生重叠。
举例说明
Resource: 1234 Allocation: 09:00 - 10:00 => reserve 1234, 09:30 - 10:00 Reserved Slots: 1234 09:30 1234 09:35 1234 09:40 1234 09:45 1234 09:50 1234 09:55 => try to reserve 1234, 09:30 - 10:00 again Reserved Slot 1234, 09:30 already exists
当然,有一系列优化措施以确保我们不生成数百万个已预约时段。但基本上就是这样。
预约
预约存在于两种状态:挂起和批准。
挂起的预约是等待列表上的预约。用户已提交它们,但没有人已确认它们。因此,它们与它们没有关联的已预约时段。
批准的预约是与已预约时段相关联的预约,因此它们被确认并具有约束力。
请注意,在 seantis.reservation 的 UI 方面,可以从挂起到确认自动转换。这被称为自动批准。
常见问题解答
为什么 数据库 X 不是一个选项?/ 为什么 Postgresql < 9.1 无法工作?
seantis.reservation 依赖于 Postgresql 9.1 中引入的一个功能,称为“序列化事务”。序列化事务是在多用户系统上运行的事务,保证它们的行为就像在单用户系统上运行一样。
换句话说,序列化事务使得确保数据即使在多个并发写入事务运行时保持正常状态变得更加容易。
其他数据库,如 Oracle,也支持此功能,并且有可能支持这些数据库。欢迎提供补丁。
请注意,MySQL 使用 InnoDB 支持序列化事务,但文档没有提供任何明确的保证,并且正在进行辩论。
http://stackoverflow.com/questions/6269471/does-mysql-innodb-implement-true-serializable-isolation
为什么你还是要选择SQL呢?为什么不使用ZODB?为什么不插入你喜欢的NoSQL数据库呢?
如果你被授予了预约,其他人就不能获得相同的预约。主键和事务是确保这一点的自然选择。
我们的数据模型高度结构化,需要与模式进行验证。
所有客户必须在任何时候都拥有相同的数据。不仅仅是最终。
复杂的查询必须易于开发,因为报告很重要。
seantis.reservation的核心最终应该独立于Zope/Plone。
为什么/如何我的分配是彩色的?我的分配是绿色,但它应该是橙色/红色!
基本上,颜色是基于事件的可用性分配的。
75-100%:绿色/可用
1-74%:橙色/部分可用
0%:不可用
可用性是通过将总可用时间除以已预约时间来计算的。如果将分配设置为自动批准(默认设置),则0%的可用性也意味着无法再进行新的预约。
如果将分配设置为手动批准,则将自动有一个无限等待名单。可以随时对等待名单进行预约——除非更改分配设置——等待名单中的人数将在分配本身中显示。
变更日志
1.4.0 (2015-12-02)
将样式从plonetheme.onegov移动到本包。[lknoepfel]
概览日历的视觉重设计。[msom]
1.3.0 (2015-10-27)
集成了最新的libres版本,该版本切换到仅序列化查询。[href]
1.2.0 (2015-02-10)
警告:seantis.reservation的1.2.0版本内部更改很大,因此您不能直接从1.0.12(2013年9月27日)之前的seantis.reservation版本升级到1.2.0。
如果您确实有这样一个旧版本,请首先安装seantis.reservation 1.1.5,运行所有升级步骤,然后安装1.2.0。
将核心移动到新的、独立的Python模块(Libres)。[href]
1.1.5 (2014-09-23)
更改了动作的导出/报告/最新权限,以反映打开这些视图所需的实际权限。修复了#164。[href]
修复了每月报告不包含最后一天的问题。关闭#163。[href]
添加了电子邮件模板验证。关闭#156。[href]
修复了在资源标题中使用Unicode字符时导出错误。关闭#165。[href]
在德语中将“电子邮件”拼写为“E-Mail”——始终如此。修复了#166。[href]
1.1.4 (2014-08-18)
修复了在部分可用整日分配中,分配搜索工作不正确的问题。关闭#162。[href]
1.1.3 (2014-08-15)
修复了在搜索中使用错误的整个日预约时间的问题。[href]
更改了搜索视图以使其更具Ajax功能,给人提速的印象。[href]
添加了在搜索中删除找到的分配的能力。修复了#161。[href]
1.1.2 (2014-08-12)
添加了更改某些预约时间的能力。[href]
在搜索视图中正确处理分组分配。[href]
如果搜索视图中未进行选择,则禁用预约按钮。[href]
添加了更改预约电子邮件地址的能力。[href]
确保会话数据永远不会在浏览器之间共享,即使同一用户已登录。[href]
禁用了搜索表单的卸载保护。[href]
添加了删除分配部分(时间段)的能力。[href]
1.1.1 (2014-08-06)
修复了预约异构组预约有时会导致错误预约位置的bug。[href]
搜索视图中部分可用分配的可用性现在仅限于搜索中选择的选定时间。[href]
在搜索视图中正确对齐时间。[href]
现在默认搜索为“仅可用分配”。[href]
预约日期现在总是在管理视图中正确显示。[href]
1.1 (2014-08-05)
添加了新的搜索和预约功能。在每个资源上,用户可以搜索分配。可以选择并组合选择这些分配进行预约。
这是一个重要的新功能,1.1版本打算作为它的金丝雀。还有一些事情还没有实现:分组预约被排除在搜索之外,组合预约尚未在所有地方显示,UI中还有一些粗糙的边缘。
如果您不是绝对确定需要这个版本,我们因此建议等待一两周。我们将提供1.1.+版本,它将是一个更稳定且更广泛适应的版本。[链接]
在分配和搜索表单中隐藏时间范围选择,位于日期附近的图标内。[链接]
确保在Ubuntu 14.04下遵循文档可行,并澄清一些问题。修复#159。[链接]
从感谢页移除资源描述。[链接]
1.0.24 (2014-07-16)
在控制面板中添加定义绿色/橙色/红色阈值的 ability。修复#158。[链接]
添加查看无法再写入的 formdata 的 ability。如果自定义表单在数据写入后更改,则可能发生此情况。修复#150。[链接]
限制日视图的宽度,以提高菜单的访问性。修复#157。[链接]
添加从分配菜单切换到另一个视图的快速方法。修复#153。[链接]
现在在表单中发生的异常包括正确的堆栈跟踪。[链接]
导出文件名现在包括年份和月份。修复#155。[链接]
在日历图例中添加阴影(可用性指示器)。修复#154。[链接]
1.0.23 (2014-06-23)
为批准/拒绝/撤销添加 Unicode 检查/交叉标记,以提高可读性。[链接]
在提交预订后显示感谢页面。每个资源都可以有一个自定义文本,该文本显示在感谢笔记下方。关闭#138。[链接]
减少重新获取数据的积极性,使界面更“平静”。现在只有用户改变某些内容的操作才会触发刷新。例如,点击遮罩层的取消按钮不再重新加载事件。[链接]
现在所有视图以及日历中日期的正确本地化。修复#142。[链接]
将“预订配额”(英文)重命名为“预订数量”。修复#143。[链接]
可用性分区现在更明显。修复#149。[链接]
现在在日历上不完全显示的分配显示正确的可用性分区。修复#145。[链接]
正确处理部分可用的全天分配。修复#129。[链接]
如果从“您的预订”中删除不存在的预订,则不再向用户引发异常。修复#123。[链接]
1.0.22 (2014-06-05)
添加新的预订助理角色,该角色可以查看但不能编辑已提交的预订数据。[链接]
修复了在加载 jQuery 工具之后加载 overlay js 失败的问题。[链接]
精简会话处理代码。[链接]
1.0.21 (2014-03-26)
在预订/确认预订时显示的消息已重新设计,以便提供更多信息。[链接]
如果遮罩层在点击后无法加载远程地址,则显示错误。[链接]
现在验证并存储电子邮件地址,不包含前导或尾随空格。修复#127。[链接]
在无法确认预订时显示错误,当显示或提交预订确认表单时。[链接]
1.0.20 (2014-02-25)
修复了无法预订分组预订的问题。关闭#124。[链接]
修复了在测试中使用最新 SQLAlchemy 版本时发生的重大 Heisenbug。[链接]
1.0.19 (2014-02-05)
将下一个/上一个 30 天添加到最新的预订报告。[链接]
将月份/年份筛选器添加到导出中。修复#101。[链接]
用可以选择导出类型、格式和其他选项的表单替换导出列表视图。[链接]
改进单预订视图的打印样式。修复#109。[链接]
添加 seantis.reservation 特定的浏览器层。[链接]
将 xlsx 添加为导出输出格式。[链接]
添加定义一个全局管理员的电子邮件地址的选项。修复#69。[链接]
将 sqlalchemy 测试期间的警告视为错误。[链接]
在管理员电子邮件中添加预订链接。修复#117。[链接]
将预订配额添加到预订确认邮件中。修复#111。[链接]
不再向预订经理发送预订人电子邮件。修复#118。[链接]
富文本字段现在可以导出为Excel/CSV/JSON格式。在此操作过程中,HTML将被转换为文本。[链接]
Excel/CSV/JSON导出的日期现在统一使用ISO8601格式。修复了#116问题。[链接]
预订数据现在存储得更透明。这对用户没有影响,但确保了未来的数据完整性。修复了#119问题。[链接]
集成了seantis.plonetools。[链接]
确保在资源可能无法查看且因此为None时,曝光检查方法不会出错。修复了#114问题。[链接]
1.0.18 (2014-01-21)
如果找不到分配,不再抛出异常。返回404。修复了#112问题。[链接]
1.0.17
现在在monthly_report中显示了打印链接。修复了#33问题。[链接]
自定义电子邮件模板现在在创建时显示翻译后的模板(如果可用)。修复了#92问题。[链接]
为电子邮件模板添加配额。关闭了#41问题。[链接]
澄清了接收到的预订电子邮件的帮助文本,确保在所有情况下都清楚发送此邮件。关闭了#95问题。[链接]
确保不同的登录用户不会看到彼此的预订。[deiferni]
1.0.16
修复了在无效预订上触发限制的问题。限制仅在实际上进行了预订时才应激活。
1.0.15
添加了定义预预订脚本的能力,该脚本可能在预订表单上触发验证错误。
1.0.14
添加了打印单个预订的能力。
添加了在不发送电子邮件的情况下删除预订的能力。
1.0.13
添加了一个新的“最新预订”报告,显示过去30天内完成的预订。
1.0.12
删除过期的会话不再导致孤儿预留空间。现有的孤儿预留空间将在升级步骤中删除。
现在正确处理了“你的预订”表单中的异常,从而正确显示错误。
1.0.11
如果日期和开始/结束时间不能编辑,现在在表单中将它们正确禁用。
修复了在组表单上“继续”按钮不起作用的问题。
修复了在组表单上未显示单选按钮和复选框的问题。
修复了teamraum主题中的小样式问题。
1.0.10
修复了在输入1900年之前的日期时“你的预订”表单出现问题。
1.0.9
修复了无法在资源外确认“你的预订”的问题。
1.0.8
为导出添加了一个新的视图,最初提供现有的预订导出和新的“紧凑”导出。
为预订导出添加了创建/修改列。
具有不同表单集的不同资源在尝试进行多个预订时不再导致错误。
将最大分配配额从100增加到1000。
修复了英文文本中的拼写错误。
改进了德语文本。
1.0.7
从设置面板中移除了可能危险的孤儿删除功能。
现在,如果删除了某个资源,Postgres中将删除属于该资源的所有预订记录。
例外情况是通过ZMI删除Plone站点。虽然可以拦截该事件,但丢弃正在删除的Plone站点中的所有资源并不完全安全。因为这些资源可能与其他站点的现有资源的uuid相同。
为了清理这类数据僵尸,可能需要创建一个工具,该工具可以删除或存档给定日期之前的预订。
然而,这不是一个优先事项,因为建议为每个站点使用单独的数据库,并且直到存在大量预订的站点,这永远不会是一个问题。Postgres可以处理未使用的记录。
阻止allocation.mirror_of可能为NULL。
修复了在分配上添加预订到不应有等待列表的等待列表中的错误。
修复了德语翻译中的拼写错误。
1.0.6
添加了通过管理或报告界面编辑预订表单数据的能力。
添加了定义管理表单集的功能,这些表单集与默认表单集相同,但只能由具有适当权限的人编辑。
有了这些表单集和编辑表单数据的能力,可以创建简单的方式来组织预订。例如,可以添加一个带有“已支付”复选框的管理表单集,以及一个带有地址的正常表单集。
然后,每个预订将有一个由用户填写地址和一个“已支付”复选框。预订人无法查看或更改此复选框,但一旦预订人实际上支付了应支付的费用,管理者就可以这样做。
这些仅限管理者字段的初始值是通过Dexterity架构编辑器定义的。
不再压缩URI.js,修复了浏览器中的javascript错误
修复了某些情况下的缺失翻译(locale.js现在更健壮)
在月度报告中使用ajax加载预订更改
1.0.5
在预订导出中添加全天标志
在预订导出中添加配额
在月度报告中添加显示/隐藏时间表的能力
在月度报告中保持月份之间的过滤器状态
添加对plonetheme.teamraum的基本支持
1.0.4
修复了德语翻译中的错误
1.0.3
当新预订自动批准时,向管理者发送电子邮件
在向导表单中切换选项卡时,聚焦到第一个输入框
1.0.2
修复了JSON编码器中的崩溃
1.0.1
修复了一些小问题
1.0
初始发布
项目详情
seantis.reservation-1.4.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 68f1825387a2f50a9f148ea5d455598d53405eeaf071e4db19a7a021f4735ecc |
|
MD5 | eaec51b9b790d61ad76bbc928e899e73 |
|
BLAKE2b-256 | 924e39bee50c9e37314302fd3757119b1364e1c6e938e175a6f8d9d11fb687ac |