models package

Submodules

models.article module

class models.article.Article(*args, **kwargs)

Bases: django.db.models.base.Model

Article(id, current_revision_id, deleted, locked, created, modified, owner_id, group_id, group_read, group_write, other_read, other_write)

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Article.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Article.add_object_relation(obj)
Article.add_revision(new_revision, save=True)

Sets the properties of a revision and ensures its the current revision.

Article.ancestor_objects()

NB! This generator is expensive, so use it with care!!

Article.articleforobject_set
Article.articlerevision_set
Article.can_assign(user)
Article.can_delete(user)
Article.can_moderate(user)
Article.can_read(user)
Article.can_write(user)
Article.clear_cache()
Article.current_revision
Article.descendant_objects()

NB! This generator is expensive, so use it with care!!

Article.get_absolute_url(*moreargs, **morekwargs)
Article.get_cache_key()
Article.get_cached_content()

Returns cached

Article.get_children(max_num=None, user_can_read=None, **kwargs)

NB! This generator is expensive, so use it with care!!

classmethod Article.get_for_object(obj)
Article.get_next_by_created(*moreargs, **morekwargs)
Article.get_next_by_modified(*moreargs, **morekwargs)
Article.get_previous_by_created(*moreargs, **morekwargs)
Article.get_previous_by_modified(*moreargs, **morekwargs)
Article.group
Article.objects = <wiki.managers.PermissionManager object at 0x3245390>
Article.owner
Article.render(preview_content=None)
Article.root_node
Article.set_group_recursive()
Article.set_owner_recursive()
Article.set_permissions_recursive()
Article.urlpath_set
class models.article.ArticleForObject(*args, **kwargs)

Bases: django.db.models.base.Model

ArticleForObject(id, article_id, content_type_id, object_id, is_mptt)

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception ArticleForObject.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

ArticleForObject.article
ArticleForObject.content_object

Provides a generic relation to any object through content-type/object-id fields.

ArticleForObject.content_type
ArticleForObject.objects = <wiki.managers.ArticleFkManager object at 0x347fe50>
class models.article.ArticleRevision(*args, **kwargs)

Bases: models.article.BaseRevisionMixin, django.db.models.base.Model

This is where main revision data is stored. To make it easier to copy, do NEVER create m2m relationships.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception ArticleRevision.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

ArticleRevision.article
ArticleRevision.articlerevision_set
ArticleRevision.current_set
ArticleRevision.get_next_by_created(*moreargs, **morekwargs)
ArticleRevision.get_next_by_modified(*moreargs, **morekwargs)
ArticleRevision.get_previous_by_created(*moreargs, **morekwargs)
ArticleRevision.get_previous_by_modified(*moreargs, **morekwargs)
ArticleRevision.inherit_predecessor(article)

Inherit certain properties from predecessor because it’s very convenient. Remember to always call this method before setting properties :)

ArticleRevision.objects = <django.db.models.manager.Manager object at 0x3485810>
ArticleRevision.previous_revision
ArticleRevision.save(*args, **kwargs)
ArticleRevision.user
class models.article.BaseRevisionMixin(*args, **kwargs)

Bases: django.db.models.base.Model

This is an abstract model used as a mixin: Do not override any of the core model methods but respect the inheritor’s freedom to do so itself.

class Meta
abstract = False
BaseRevisionMixin.get_next_by_created(*moreargs, **morekwargs)
BaseRevisionMixin.get_next_by_modified(*moreargs, **morekwargs)
BaseRevisionMixin.get_previous_by_created(*moreargs, **morekwargs)
BaseRevisionMixin.get_previous_by_modified(*moreargs, **morekwargs)
BaseRevisionMixin.previous_revision
BaseRevisionMixin.set_from_request(request)
BaseRevisionMixin.user
models.article.on_article_delete_clear_cache(instance, **kwargs)
models.article.on_article_save_clear_cache(instance, **kwargs)

models.pluginbase module

class models.pluginbase.ArticlePlugin(*args, **kwargs)

Bases: django.db.models.base.Model

This is the mother of all plugins. Extending from it means a deletion of an article will CASCADE to your plugin, and the database will be kept clean. Furthermore, it’s possible to list all plugins and maintain generic properties in the future...

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception ArticlePlugin.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

ArticlePlugin.article
ArticlePlugin.can_delete(user)
ArticlePlugin.can_moderate(user)
ArticlePlugin.can_read(user)
ArticlePlugin.can_write(user)
ArticlePlugin.get_next_by_created(*moreargs, **morekwargs)
ArticlePlugin.get_previous_by_created(*moreargs, **morekwargs)
ArticlePlugin.objects = <django.db.models.manager.Manager object at 0x3783f50>
ArticlePlugin.purge()

Remove related contents completely, ie. media files.

ArticlePlugin.reusableplugin
ArticlePlugin.revisionplugin
ArticlePlugin.simpleplugin
class models.pluginbase.ReusablePlugin(*args, **kwargs)

Bases: models.pluginbase.ArticlePlugin

Extend from this model if you have a plugin that may be related to many articles. Please note that the ArticlePlugin.article ForeignKey STAYS! This is in order to maintain an explicit set of permissions.

In general, it’s quite complicated to maintain plugin content that’s shared between different articles. The best way to go is to avoid this. For inspiration, look at wiki.plugins.attachments

You might have to override the permission methods (can_read, can_write etc.) if you have certain needs for logic in your reusable plugin.

exception DoesNotExist

Bases: models.pluginbase.DoesNotExist

exception ReusablePlugin.MultipleObjectsReturned

Bases: models.pluginbase.MultipleObjectsReturned

ReusablePlugin.articleplugin_ptr
ReusablePlugin.articles
ReusablePlugin.can_delete(user)
ReusablePlugin.can_moderate(user)
ReusablePlugin.can_read(user)
ReusablePlugin.can_write(user)
ReusablePlugin.objects = <django.db.models.manager.Manager object at 0x3795890>
ReusablePlugin.save(*args, **kwargs)
class models.pluginbase.RevisionPlugin(*args, **kwargs)

Bases: models.pluginbase.ArticlePlugin

If you want your plugin to maintain revisions, extend from this one, not SimplePlugin.

This kind of plugin is not attached to article plugins so rolling articles back and forth does not affect it.

exception DoesNotExist

Bases: models.pluginbase.DoesNotExist

exception RevisionPlugin.MultipleObjectsReturned

Bases: models.pluginbase.MultipleObjectsReturned

RevisionPlugin.add_revision(new_revision, save=True)

Sets the properties of a revision and ensures its the current revision.

RevisionPlugin.articleplugin_ptr
RevisionPlugin.current_revision
RevisionPlugin.objects = <django.db.models.manager.Manager object at 0x379a210>
RevisionPlugin.revision_set
class models.pluginbase.RevisionPluginRevision(*args, **kwargs)

Bases: models.article.BaseRevisionMixin, django.db.models.base.Model

If you want your plugin to maintain revisions, make an extra model that extends from this one.

(this class is very much copied from wiki.models.article.ArticleRevision

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception RevisionPluginRevision.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

RevisionPluginRevision.get_next_by_created(*moreargs, **morekwargs)
RevisionPluginRevision.get_next_by_modified(*moreargs, **morekwargs)
RevisionPluginRevision.get_previous_by_created(*moreargs, **morekwargs)
RevisionPluginRevision.get_previous_by_modified(*moreargs, **morekwargs)
RevisionPluginRevision.objects = <django.db.models.manager.Manager object at 0x379a9d0>
RevisionPluginRevision.plugin
RevisionPluginRevision.plugin_set
RevisionPluginRevision.previous_revision
RevisionPluginRevision.revisionpluginrevision_set
RevisionPluginRevision.save(*args, **kwargs)
RevisionPluginRevision.user
class models.pluginbase.SimplePlugin(*args, **kwargs)

Bases: models.pluginbase.ArticlePlugin

Inherit from this model and make sure to specify an article when saving a new instance. This way, a new revision will be created, and users are able to roll back to the a previous revision (in which your plugin wasn’t related to the article).

Furthermore, your plugin relation is kept when new revisions are created.

Usage:

class YourPlugin(SimplePlugin):
...

Creating new plugins instances: YourPlugin(article=article_instance, ...) or YourPlugin.objects.create(article=article_instance, ...)

exception DoesNotExist

Bases: models.pluginbase.DoesNotExist

exception SimplePlugin.MultipleObjectsReturned

Bases: models.pluginbase.MultipleObjectsReturned

SimplePlugin.article_revision
SimplePlugin.articleplugin_ptr
SimplePlugin.get_logmessage()
SimplePlugin.objects = <django.db.models.manager.Manager object at 0x3795d10>
SimplePlugin.save(*args, **kwargs)
exception models.pluginbase.SimplePluginCreateError

Bases: exceptions.Exception

models.pluginbase.on_article_plugin_post_save(**kwargs)
models.pluginbase.on_reusable_plugin_post_save(**kwargs)
models.pluginbase.on_revision_plugin_revision_post_save(**kwargs)
models.pluginbase.update_simple_plugins(**kwargs)

Every time a new article revision is created, we update all active plugins to match this article revision

models.section module

models.urlpath module

class models.urlpath.Namespace
models.urlpath.on_article_delete(instance, *args, **kwargs)
models.urlpath.on_article_relation_save(**kwargs)

Module contents

models.reverse(*args, **kwargs)

Now this is a crazy and silly hack, but it is basically here to enforce that an empty path always takes precedence over an article_id such that the root article doesn’t get resolved to /ID/ but /.

Another crazy hack that this supports is transforming every wiki url by a function. If _transform_url is set on this function, it will return the result of calling reverse._transform_url(reversed_url) for every url in the wiki namespace.

Table Of Contents

This Page