跳转到主要内容

一个用于管理人与组织之间关系的Django应用程序。

项目描述

=======

[![加入聊天 https://gitter.im/DallasMorningNews/django-rolodex](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/DallasMorningNews/django-rolodex?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
名片夹
=======

<img align="right" src="screenshot2.png">

名片夹是人和他们所属组织的一个目录。它也是一个可以建模关系的空间。


####一个[示例名片夹](http://django-rolodex.herokuapp.com/rolodex/).*

*网络数据由[moviegalaxies.com](http://moviegalaxies.com/movies/356-The-Godfather:-Part-II)提供。



在《新闻》中,我们使用名片夹作为后端,用于管理需要我们管理相关人和组织网络的各个项目。我们还使用它在一个专门的应用程序中维护我们的联系。

独立的程序提供了干净、直观的界面,让我们的记者可以输入和搜索有关人和组织及其之间关系的基本信息,而API和django插件则让我们可以快速绘制相关实体的图表。

这是一个开发版本,将提供更详细的文档、注释(可能是更干净的)代码和其他便利功能。欢迎提出功能和拉取请求的建议。

快速开始
-----------
- `pip install django-rolodex`
- 将rolodex、django-taggit和django rest framework添加到您的`INSTALLED_APPS`设置中
```python
INSTALLED_APPS = (
...
'rolodex',
'rest_framework',
'taggit',
)
```
在项目的urls.py中包含轮盘和rest framework auth URLconf
```python
urlpatterns = [
...
url(r'^rolodex/', include('rolodex.urls')),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```
默认情况下,Rolodex仅对已登录用户开放。如果您希望任何人都可以浏览,请在settings.py中设置Rolodex的安全变量
```python
ROLODEX_SECURE = False
```
还将django的auth视图添加到项目的urls.py中
```python
urlpatterns = [
...
url(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name':'admin/login.html'}),
url(r'^accounts/logout/$', 'django.contrib.auth.views.logout'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```
在settings.py中将django rest framework的auth设置为django模型权限是个好主意。您还可以添加匿名只读权限,如下所示
```python
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
]
}
```
- 可选地,在DATABASES设置中创建一个`'rolodex'`数据库或使用`ROLODEX_DB`环境变量(类似于`DATABASE_URL`)将应用程序路由到专用数据库。 __注意:__ Django不支持[跨数据库关系](https://docs.django.ac.cn/en/dev/topics/db/multi-db/#cross-database-relations),所以[忘记外键](#dbnote)。相反,我们通常只使用内置API。
- 运行`python manage.py migrate`(或如果您设置了路由,请使用`python manage.py migrate --database=rolodex`)以创建模型和加载固定值。
- `python manage.py runserver`并检查[http://localhost:8000/rolodex](http://localhost:8000/rolodex)以创建您的第一个人员和组织(见文档)。
- 可选地,使用rest framework API在[http://localhost:8000/rolodex/api/](http://localhost:8000/rolodex/api/)


将人员和组织添加到Rolodex
--------------------------------
Rolodex强制用户在选择人员所属的主要组织之前创建它们。此关系设置为类型`'employment'`,作为预加载的[P2Org](#types_and_roles)关系类型固定值。

开发人员也可以使用RESTful API创建人员、组织及其关系和联系详细信息。浏览API以查看在创建对象时可以传递哪些参数。

API使用Django rest framework的超链接序列化器,因此请使用URL作为外键。


关系
-------------
Rolodex中的关系是无向的(类似Facebook而非Twitter),因此当您从一个人或组织创建关系到另一个人或组织时,关系将相互回应对称。

针对人员/组织关系的不同排列有不同的关系模型,例如人员到人员、人员到组织等。

为了帮助管理关系的创建,人员和组织对象有一组扩展方法。

- `add_p2p(person_object,**kwargs)` : 从人员到人员的关系
- `remove_p2p(person_object,**kwargs)`
- `add_p2org(org_object,**kwargs)` : 从人员到组织的关系
- `remove_p2org(org_object,**kwargs)`
- `add_org2org(org_object,**kwargs)` : 从组织到组织的关系
- `remove_org2org(org_object,**kwargs)`
- `add_org2p(person_object,**kwargs)` : 从组织到人员的关系
- `remove_org2p(person_object,**kwargs)`


层次结构
----------
Org2Org关系允许层次结构。在创建关系时传递`hierarchy`参数`"parent"`或`"child"`(引用当前对象),相关节点的对称关系将接收相反的属性。

例如,如果org1是org2的父级,则`org1.add_org2org(org2,**{hierarchy:"parent"})`将创建具有正确层次结构的关系。

其他类型的关系不可用层次结构。通常,我们认为层次结构意味着所有权,这显然不适用于其他关系类型。

__注意:__ 如果您修改现有Org2Org关系的层次结构(就任何关系属性而言),将创建一个副本。相反,删除当前关系并重新创建它,使用正确的层次结构或其他属性。


<a name="types_and_roles"></a>类型与角色
-------------
您可以在Rolodex中对人员、组织联系人和关系进行分类,以便轻松创建自定义过滤器来组织您的网络。通常,越通用,类型或角色越有用,但这取决于您和您的项目需求。记住,所有关系都是对称创建的。

类型和角色通过Django管理界面添加
- `PersonRole` : 专用于人员对象,例如,“首席信息官”
- `OrgContactRole` : 用于组织联系人,例如,“信息台”或“邮寄地址”
- `P2P_Type` : 人员之间的关系,例如,“配偶”或“专业”
- `Org2Org_Type` : 组织之间的关系,例如,“合资”或“子公司”
- `P2Org_Type` : 人员和组织之间的关系,其中“雇佣”是一个预加载的项目。


检索关系
-----------------------
人员和组织也有对象方法来检索相关对象

- `get_relations()` : 获取相关人员和组织对象
- `get_relations_with_type()` : 获取具有关系类型的相关人员和组织对象
- `get_relations_by_type('type')` : 通过类型名称(字符串)过滤相关对象
- `get_employer()` : 与人员对象相关联的主要组织
- `get_employees()` : 获取与组织主要相关的人员对象
- `get_employees_by_role('role')` : 角色是字符串
- `get_children()` : 获取Org2Org关系中的子节点
- `get_parents()` : 获取Org2Org关系中的父节点


<a name="dbnote"></a>关于使用独立数据库的说明
---------------------------------------------------------
如果您计划为通讯录使用独立的数据库,请记住Django不允许跨数据库关系。相反,您可以使用延迟查询。

例如,在一个最近的项目中,我们需要创建一个从不同数据库托管模型到通讯录Org模型的伪外键

```python
from django.utils.functional import lazy
from rolodex.models import Org

class SomeModel(models.Model)
org = models.IntegerField(choices=lazy(org_list,tuple)())


def org_list()
#创建一个元组选择列表
org_list = [ (org.pk, org.orgName) for org in Org.objects.all() ]
return tuple(org_list)
```

测试
---------
要运行测试,请确保您已安装了webtest和django-webtest模块。

```
pip install django-webtest
pip install webtest
```

图分析
--------------

通讯录的人员和组织对象也有方法返回一个[NetworkX](http://networkx.github.io/)图,以进行更高级的分析。

`nx_graph(hops=2)`返回指定步数内所有人员和组织对象的NetworkX图。

有关返回图的可用方法,请参阅[NetworkX文档](http://networkx.github.io/documentation/latest/reference/index.html)。

每个人员或组织的“完整页面图”还提供了从起源节点出发N跳的图中心性度量的快速而简单的可视化。您可以将跳数作为GET参数传递,例如`?hops=4`,或它将默认为3。

![通讯录](screenshot.png)

**注意:** 通讯录的所有样式都是由我们的数据团队完成的,**不是**我们极具才华的设计师。欢迎提交拉取请求。

项目详情


下载文件

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

源分布

django-rolodex-0.1.3.4.tar.gz (667.8 kB 查看散列)

上传时间

由以下支持