版本化文件字段用于django模型
项目描述
django-vff
简介
此包为django模型提供了一个文件字段,该字段将文件内容存储在版本控制系统(VCS)下。每当更改特定模型实例的字段时,新内容将作为新版本提交到存储库中。因此,存储库中每个vff字段和实例都将有一个文件。存储库位于settings.VFF_REPO_ROOT,或者如果没有设置,则位于django的settings.MEDIA_ROOT的vf_repo子目录中。
可以使用不同的VCS来管理存储库,使用可插拔的后端。该包仅提供开箱即用的GIT后端。
安装
像安装任何其他pypi包一样安装django-vff
$ pip install django-vff
您不需要将任何内容添加到Django的INSTALLED_APPS中。
配置
您必须在django的settings.py中设置以下变量
- VFF_BACKEND
指向后端类的点名称,例如"vff.git_backend.GitBackend"。此设置是必需的。
对于git后端
- VFF_REPO_ROOT
到git存储库位置的绝对路径。在设置django-vff之前,此存储库可能存在或不存在。
- VFF_REPO_PATH
在git仓库中,django-vff管理文件所在的目录的相对路径。
如果这两个git后端设置没有设置,VFF_REPO_ROOT将假定值为os.path.join(settings.MEDIA_ROOT, 'vf_repo'),而VFF_REPO_PATH将假定值为''。
用法
您可以使用它就像使用django.db.models.FileField一样。
from django.db import models from vff.field import VersionedFileField class MyModel(models.Model): name = models.CharField('Name', max_length=128) content = VersionedFileField(name='content', verbose_name='file content')
一旦您有了MyModel类的实例,您可以使用三种特殊方法来列出可用版本、获取特定版本以及获取版本之间的差异。
列出修订版本
>>> revs = instance.content.list_revisions() >>> from pprint import pprint >>> pprint(revs) [{'author': u'John Smith', 'date': datetime.datetime(2011, 6, 16, 13, 25, 30), 'message': u'second version', 'versionid': 'a64ea785e195bbf4b3064e6701adbdbf4b5d13be'}, {'author': u'Martha Brown', 'date': datetime.datetime(2011, 6, 16, 8, 24, 36), 'message': u'first version', 'versionid': '048848a70205d0e18d836f403e2a02830492cbf9'}]获取特定修订版本的字符串内容
>>> rev1_id = revs[-1]['versionid'] >>> instance.content.get_revision(rev1_id) u'These are the contents of the first version of the file'获取两个修订版本之间的差异
>>> rev2_id = revs[-2]['versionid'] >>> print instance.content.get_diff(rev1_id, rev2_id) --- 048848a70205d0e18d836f403e2a02830492cbf9 +++ a64ea785e195bbf4b3064e6701adbdbf4b5d13be @@ -1,1 +1,1 @@ -These are the contents of the first version of the file +These are the contents of the second version of the file
保存和删除
目前,必须显式地为此字段执行保存和删除操作。例如,如果您有一个包含content vff字段的模型实例,并且一个使用带有forms.FileField的编辑表单的视图,在验证表单后,您必须执行类似以下操作:
name = instance.content.name content = form['content'].data username = request.user.username commit_msg = form['commit_msg'].data.encode('utf8') instance.content.save(name, content, username, commit_msg) instance.save()
同样,在删除实例时,您会
username = request.user.username commit_msg = u'entity removed' instance.content.delete(username, commit_msg) instance.delete()
将来,如果有兴趣,该包可以包括一个特殊的小部件,其中包含输入空间以存储必要的数据(提交消息等),以便保存和删除操作是透明的。
提供新的后端
要为django-vff开发新的后端,您必须继承抽象基类vff.abcs.VFFBackend。需要实现的方法在类的文档字符串中有说明。
变更记录
0.2b2 (2012-01-25)
修复README.txt中的错别字
修复在初始化GIT仓库时未捕获的异常。
0.2b1 (2012-01-24)
(git)仓库现在可以位于文件系统的任何位置(不一定在MEDIA_ROOT内),并且可以告诉django-vff将文件保存在仓库的子目录中。
0.1b4 (2011-10-01)
更好地修复删除仓库中没有文件的对象的错误。
0.1b3 (2011-10-01)
不要删除仓库中没有文件的对象。
0.1b2 (2011-09-20)
在删除对象时从仓库中删除文件。
更改VersionedFieldFile的保存和删除签名,以便与django的FieldFile兼容。
0.1b1 (2011-09-02)
初始版本,包含VersionedFileField和git后端。