Pinax源代码分析12 - tribes, wiki, projects
tribes
url
(r'^tribes/', include('tribes.urls')),
逻辑与模板
urlpatterns = /
patterns('',
#创建小组
url(r'^create/$', 'tribes.views.create', name="tribe_create"),
#当前用户参加的小组
url(r'^your_tribes/$', 'tribes.views.your_tribes', name="your_tribes"),
#小组列表,采用不同的方式排序
url(r'^$', 'tribes.views.tribes', name="tribe_list"),
url(r'^order/topics/least-topics/$', 'tribes.views.tribes',
{'order': 'least_topics'}, name="tribe_list_least_topics"),
url(r'^order/topics/most-topics/$', 'tribes.views.tribes',
{'order': 'most_topics'}, name="tribe_list_most_topics"),
url(r'^order/members/least-members/$', 'tribes.views.tribes',
{'order': 'least_members'}, name="tribe_list_least_members"),
url(r'^order/members/most-members/$', 'tribes.views.tribes',
{'order': 'most_members'}, name="tribe_list_most_members"),
url(r'^order/name/ascending/$', 'tribes.views.tribes',
{'order': 'name_ascending'}, name="tribe_list_name_ascending"),
url(r'^order/name/descending/$', 'tribes.views.tribes',
{'order': 'name_descending'}, name="tribe_list_name_descending"),
url(r'^order/date/oldest/$', 'tribes.views.tribes',
{'order': 'date_oldest'}, name="tribe_list_date_oldest"),
url(r'^order/date/newest/$', 'tribes.views.tribes',
{'order': 'date_newest'}, name="tribe_list_date_newest"),
# tribe-specific
#小组的信息,成员,组内的帖子和Tweets。负责更新小组信息,加入和退出小组。
url(r'^tribe/([-/w]+)/$', 'tribes.views.tribe', name="tribe_detail"),
#删除小组
url(r'^tribe/([-/w]+)/delete/$', 'tribes.views.delete', name="tribe_delete"),
# topics
#显示小组的帖子列表
url(r'^tribe/([-/w]+)/topics/$', 'tribes.views.topics', name="tribe_topics"),
#显示wiki文章
url(r'^topic/(/d+)/edit/$', 'tribes.views.topic', kwargs={"edit": True}, name="tribe_topic_edit"),
#删除帖子
url(r'^topic/(/d+)/delete/$', 'tribes.views.topic_delete', name="tribe_topic_delete"),
#显示一篇帖子
url(r'^topic/(/d+)/$', 'tribes.views.topic', name="tribe_topic"),
#小组内置wiki
# wiki
url(r'^tribe/(?P<group_slug>/w+)/wiki/', include('wiki.urls'), kwargs=wiki_args),
)
tribes app 应用了 wikiapp,views.tribe中有如下几行:
articles = Article.objects.filter(
content_type=get_ct(tribe),
object_id=tribe.id).order_by('-last_update')
其中 get_ct 在 wiki.views 中定义。
tribe.html 模板使用了wiki 定义的模板标签:
{% load wiki %}
{% load wikiurl %}
{% if articles %}
<table class="topics">
{% for article in articles %}
{% show_teaser article %}
{% endfor %}
</table>
<p><a href="{% wikiurl list tribe %}">{% trans "more..." %}</a></p>
{% else %}
{% wikiurl list tribe as wiki_url %}
<p>
{% blocktrans %}
None yet. Go to the <a href="{{ wiki_url }}" title="wiki">wiki</a> to start a new article.
{% endblocktrans %}
</p>
{% endif %}
wiki
url
在blog的urls.py中定义:
wiki_args = {'group_slug_field': 'slug',
'group_qs': Tribe.objects.filter(deleted=False)}
url(r'^tribe/(?P<group_slug>/w+)/wiki/', include('wiki.urls'), kwargs=wiki_args),
在projects的urls.py中定义:
wiki_args = {
'group_slug_field': 'slug',
'group_qs': Project.objects.filter(deleted=False),
'is_member': (lambda user, group: group.has_member(user)),
'is_private': (lambda group: group.private),
}
url(r'^project/(?P<group_slug>/w+)/wiki/', include('wiki.urls'), kwargs=wiki_args),
逻辑与模板
urlpatterns = patterns('',
#全部wiki 文章列表
url(r'^$', views.article_list, name='wiki_index'),
url(r'^list/$', views.article_list, name='wiki_list'),
#搜索
url(r'^search/$', views.search_article, name="wiki_search"),
#整个wiki的历史,访问出错
url(r'^history/$', views.history, name='wiki_history'),
#feeds
url(r'^feeds/(?P<feedtype>/w+)/$', views.history_feed, name='wiki_history_feed'),
#单篇文章历史的feeds
url(r'^(?P<title>'+ WIKI_URL_RE +r')/feeds/(?P<feedtype>/w+)/$', views.article_history_feed,
name='wiki_article_history_feed'),
#浏览文章
url(r'^(?P<title>'+ WIKI_URL_RE +r')/$', views.view_article, name='wiki_article'),
#编辑文章
url(r'^edit/(?P<title>'+ WIKI_URL_RE +r')/$', views.edit_article, name='wiki_edit'),
#关注文章,依赖于notification.models.observe
url(r'observe/(?P<title>'+ WIKI_URL_RE +r')/$', views.observe_article, name='wiki_observe'),
#停止关注文章依赖于notification.models.stop_observing
url(r'observe/(?P<title>'+ WIKI_URL_RE +r')/stop/$', views.stop_observing_article,
name='wiki_stop_observing'),
#单篇文章历史
url(r'^history/(?P<title>'+ WIKI_URL_RE +r')/$', views.article_history, name='wiki_article_history'),
#浏览一篇文章的指定历史版本
url(r'^history/(?P<title>'+ WIKI_URL_RE +r')/changeset/(?P<revision>/d+)/$', views.view_changeset,
name='wiki_changeset',),
#将文章回退到指定的版本
url(r'^history/(?P<title>'+ WIKI_URL_RE +r')/revert/$', views.revert_to_revision,
name='wiki_revert_to_revision'),
)
projects
url
(r'^projects/', include('projects.urls')),
逻辑与模板
urlpatterns = /
patterns('',
#创建项目,项目列表,……与tribes一样省略若干行……
#查看成员的状态,负责处理改变自己状态的请求
url(r'^project/([-/w]+)/members_status/$', 'projects.views.members_status', name="project_members_status"),
#所有的任务
url(r'^project/([-/w]+)/tasks/$', 'projects.views.tasks', name="project_tasks"),
#浏览一个任务,负责将任务指派给某人。如果是任务的负责人可以修改状态、标记解决、开启和关闭任务。
url(r'^task/(/d+)/$', 'projects.views.task', name="project_task"),
#指定用户的所有任务
url(r'^tasks/([-/w]+)/$', 'projects.views.user_tasks', name="project_user_tasks"),
#帖子、wiki,还是和tribes一样。
)
user_tasks.html 模板使用了 shorttimesince_tag 自定义标签,它是在 misc 中定义的,显示时间差,和Django内置的timesince不同,使用所写单位,例如yr = year,mn=month,wk=weekd=day……