views.py 4.52 KB
Newer Older
1 2 3
"""
This file contains view functions for wrapping the django-wiki.
"""
4 5
import logging
import re
6
import cgi
7

8 9 10
from django.conf import settings
from django.contrib.sites.models import Site
from django.core.exceptions import ImproperlyConfigured
11
from django.shortcuts import redirect
12 13
from django.utils.translation import ugettext as _

14 15 16
from wiki.core.exceptions import NoRootURL
from wiki.models import URLPath, Article

17
from courseware.courses import get_course_by_id
18
from course_wiki.utils import course_wiki_slug
19
from opaque_keys.edx.locations import SlashSeparatedCourseKey
20

21 22
log = logging.getLogger(__name__)

Calen Pennington committed
23

24
def root_create(request):  # pylint: disable=unused-argument
25 26 27 28 29 30 31 32
    """
    In the edX wiki, we don't show the root_create view. Instead, we
    just create the root automatically if it doesn't exist.
    """
    root = get_or_create_root()
    return redirect('wiki:get', path=root.path)


33
def course_wiki_redirect(request, course_id):  # pylint: disable=unused-argument
34 35 36 37 38
    """
    This redirects to whatever page on the wiki that the course designates
    as it's home page. A course's wiki must be an article on the root (for
    example, "/6.002x") to keep things simple.
    """
39
    course = get_course_by_id(SlashSeparatedCourseKey.from_deprecated_string(course_id))
40
    course_slug = course_wiki_slug(course)
Calen Pennington committed
41

42 43 44 45
    valid_slug = True
    if not course_slug:
        log.exception("This course is improperly configured. The slug cannot be empty.")
        valid_slug = False
46
    if re.match(r'^[-\w\.]+$', course_slug) is None:
47 48
        log.exception("This course is improperly configured. The slug can only contain letters, numbers, periods or hyphens.")
        valid_slug = False
49

50 51
    if not valid_slug:
        return redirect("wiki:get", path="")
Calen Pennington committed
52

53 54
    # The wiki needs a Site object created. We make sure it exists here
    try:
55
        Site.objects.get_current()
56 57 58 59 60
    except Site.DoesNotExist:
        new_site = Site()
        new_site.domain = settings.SITE_NAME
        new_site.name = "edX"
        new_site.save()
61
        site_id = str(new_site.id)  # pylint: disable=no-member
62 63
        if site_id != str(settings.SITE_ID):
            raise ImproperlyConfigured("No site object was created and the SITE_ID doesn't match the newly created one. {} != {}".format(site_id, settings.SITE_ID))
Calen Pennington committed
64

65
    try:
66
        urlpath = URLPath.get_by_path(course_slug, select_related=True)
Calen Pennington committed
67 68

        results = list(Article.objects.filter(id=urlpath.article.id))
69 70 71 72
        if results:
            article = results[0]
        else:
            article = None
Calen Pennington committed
73

74 75 76 77
    except (NoRootURL, URLPath.DoesNotExist):
        # We will create it in the next block
        urlpath = None
        article = None
Calen Pennington committed
78

79 80 81
    if not article:
        # create it
        root = get_or_create_root()
Calen Pennington committed
82

83 84 85 86
        if urlpath:
            # Somehow we got a urlpath without an article. Just delete it and
            # recerate it.
            urlpath.delete()
Calen Pennington committed
87

88 89 90 91 92 93 94
        content = cgi.escape(
            # Translators: this string includes wiki markup.  Leave the ** and the _ alone.
            _("This is the wiki for **{organization}**'s _{course_name}_.").format(
                organization=course.display_org_with_default,
                course_name=course.display_name_with_default,
            )
        )
95 96
        urlpath = URLPath.create_article(
            root,
97
            course_slug,
98
            title=course_slug,
99 100
            content=content,
            user_message=_("Course page automatically created."),
101 102 103 104 105 106 107 108 109
            user=None,
            ip_address=None,
            article_kwargs={'owner': None,
                            'group': None,
                            'group_read': True,
                            'group_write': True,
                            'other_read': True,
                            'other_write': True,
                            })
Calen Pennington committed
110

111
    return redirect("wiki:get", path=urlpath.path)
Calen Pennington committed
112

113 114 115 116 117 118 119 120 121 122 123 124 125

def get_or_create_root():
    """
    Returns the root article, or creates it if it doesn't exist.
    """
    try:
        root = URLPath.root()
        if not root.article:
            root.delete()
            raise NoRootURL
        return root
    except NoRootURL:
        pass
Calen Pennington committed
126

127
    starting_content = "\n".join((
128 129 130 131
        _("Welcome to the edX Wiki"),
        "===",
        _("Visit a course wiki to add an article."),
    ))
Calen Pennington committed
132

133
    root = URLPath.create_root(title=_("Wiki"), content=starting_content)
134 135 136 137 138 139 140
    article = root.article
    article.group = None
    article.group_read = True
    article.group_write = False
    article.other_read = True
    article.other_write = False
    article.save()
Calen Pennington committed
141

142
    return root