一个灵活的库,用于自动或手动将序列化的Django模型实例导出到版本控制库
项目描述
如何工作
存在一个应用级API和一个模型级API。
使用模型级API定义每个模型类的导出行为,并在保存时自动导出。
使用应用级API在视图(例如)中定义导出行为,并从您的代码中显式触发内容导出。
模型级API
设计灵感来自Django的ModelAdmin和ModelForm面向对象模式。核心行为定义在vcexport.models.Exporter类中,类似于ModelAdmin。像ModelAdmin和ModelForm一样,您将子类化默认基类以在每模型级别上自定义行为。
为了自动版本化模型,使用vcexport注册它们
import vcexport vcexport.register(MyModel)
这将连接一个post_save信号。
通过子类化vcexport.models.Exporter并告诉vcexport将您的模型与自定义Exporter注册,您可以在每模型级别上自定义导出行为
class MyExporter(vcexport.models.Exporter): ... vcexport.register(MyModel, exporter=MyExporter)
默认情况下,模型以Django的XML格式序列化,因为它与diff配合良好,且通用。
您可以通过传递一个自定义模板路径作为类属性来为每个模型自定义序列化
class MyExporter(Exporter): repository_template = 'fleem/document_format.txt'
该模板将使用两个上下文变量进行渲染;object是保存的模型实例,以及一个布尔值created
{% if created %}New object!{% endif %} {{object.title}} {{object.related_field.pk}} **** Color: {{object.color}} {{object.description}}
这允许支持不同的使用案例
您想要对模型进行整体版本控制
您有一个模型,其中包含一个或两个文档式文本字段,您只想对这些字段进行版本控制 - 在序列化模板中不要写出其他任何字段。
默认情况下,您的模型实例的文档存档将被保存在类似 /app_name/ModelClassName/instance_pk 的仓库路径中。
您可以自定义路径
class MyExporter(Exporter): def repository_path(self): return '/my_custom/path_for/this_model/' + self.object.color
请注意,如果您这样做,您可能最终会在仓库中保存到同一文件路径的多个模型实例。这是一个特性。
默认的提交用户未定义。目前您无法自定义此设置。
默认的提交信息很无聊:“通过 django-vcexport 保存对象 {{instance.pk}} (来自‘{{app_name}}.{{model_name}}’)。”
您可以使用一个接受布尔值 created 并返回字符串的模型方法来自定义提交信息
class MyExporter(Exporter): def repository_commit_message(self, created): if created: return "User %s committed a new %s" % ( self.object.user.username, self.object.color) return "User %s committed %s" % (self.object.user.username, self.object.color)
应用程序级API
您还可以显式导出内容,例如在您的模型 save() 方法中,在视图代码中,等等,使用 vcexport.export_to_repository 函数
def my_view(request): ... object = MyModel.objects.get(...) object.morx = request.POST['new_morx'] object.save() import vcexport vcexport.export_to_repository(object)
默认模板、提交信息等与模型API相同。您可以在自己的代码中自定义它们并将它们传递给 export_to_repository
def my_view(request): ... object, created = MyModel.objects.get_or_create(...) object.morx = request.POST['new_morx'] object.save() import vcexport vcexport.export_to_repository( object, created=created, repository_template='fleem/morx.html', message="Changed the morx", repository_path='/fleem/objects/%s' % object.pk)
export_to_repository 函数将返回提交的修订版本,如果没有提交更改,则返回 None
折衷方案
您可能希望既享受将行为定义分组到导出器中的组织优势,又希望有在应用程序代码中显式触发导出的灵活性。
您可以直接调用导出器实例来满足这种需求
def my_view(request): ... object, created = MyModel.objects.get_or_create(...) object.morx = request.POST['new_morx'] object.save() exporter = MyExporterSubclass(object) exporter.export_to_repository(object, created=created)
与 vcexport.export_to_repository 一样,这将返回提交的修订版本或如果没有提交更改,则返回 None
如果您想这样做,您可能不想为自动 post_save 导出注册相同的模型 - 但也许您会!
配置
您必须在 settings.py 文件中提供一项配置
VCEXPORT_CHECKOUT_DIR:您要存储数据的本地仓库签出的绝对路径
您还可以提供其他 settings.py 配置
VCEXPORT_BACKEND:'svn' 或 'bzr' 之一
要使用 Subversion,您必须安装 pysvn。
要使用 Bazaar,您必须安装 bazaar。
如果没有指定此设置,默认为 Subversion;然而,在许多方面(包括同步提交的速度)Bazaar 真的是一个更好的后端,并可能在未来成为主要的支持后端。
您必须自己初始化您的仓库签出。
致谢
最初在哥伦比亚大学新媒体教学与学习中心开发 <http://ccnmtl.columbia.edu>
源代码在 github 上可用 <http://github.com/ejucovy/django-vcexport>
本版本新功能
将 Exporter 导出为 vcexport.Exporter
已删除 VCEXPORT_BACKEND 的 'hg' 选项,因为 sven 不再支持此选项。
为 VCEXPORT_BACKEND 添加了新的 'bzr' 选项。
历史
0.5.1 (06-12-09)
棕色袋子发布;使 export_to_repository 函数作为公共 API (vcexport.export_to_repository)可用
0.5 (06-12-09)
分离出模型级别行为和应用级别使用的独立 API。
0.4 (24-11-09)
初始发布。此包以前称为 svndjango。它从头开始重新设计并更名为 django-vcexport,以更准确地描述它所做的工作。
项目详情
django-vcexport-0.6.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 276989e69911927710d30b6aea2e474657d903b6173c5399482cb4f14b7946fb |
|
MD5 | ffdd5bd4c50c35a4c245b940b3ea10e6 |
|
BLAKE2b-256 | 09d48972ea682fc9f7df0fed87dc6080a349484b95c727885f2505dbf40a2390 |