views.py 4.43 KB
Newer Older
1 2
import logging
import re
3

4 5 6
from django.conf import settings
from django.contrib.sites.models import Site
from django.core.exceptions import ImproperlyConfigured
7
from django.shortcuts import redirect
8 9 10
from wiki.core.exceptions import NoRootURL
from wiki.models import URLPath, Article

11
from courseware.courses import get_course_by_id
12

13 14
log = logging.getLogger(__name__)

Calen Pennington committed
15

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
def root_create(request):
    """
    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)


def course_wiki_redirect(request, course_id):
    """
    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.
    """
31
    course = get_course_by_id(course_id)
Calen Pennington committed
32

33
    course_slug = course.wiki_slug
34 35 36 37 38 39 40 41 42 43 44 45 46


    # cdodge: fix for cases where self.location.course can be interpreted as an number rather than
    # a string. We're seeing in Studio created courses that people often will enter in a stright number
    # for 'course' (e.g. 201). This Wiki library expects a string to "do the right thing". We haven't noticed this before
    # because - to now - 'course' has always had non-numeric characters in them
    try:
        float(course_slug)
        # if the float() doesn't throw an exception, that means it's a number
        course_slug = course_slug + "_"
    except:
        pass

Calen Pennington committed
47

48 49 50 51
    valid_slug = True
    if not course_slug:
        log.exception("This course is improperly configured. The slug cannot be empty.")
        valid_slug = False
52
    if re.match('^[-\w\.]+$', course_slug) is None:
53 54
        log.exception("This course is improperly configured. The slug can only contain letters, numbers, periods or hyphens.")
        valid_slug = False
55

56 57
    if not valid_slug:
        return redirect("wiki:get", path="")
Calen Pennington committed
58 59


60 61 62 63 64 65 66 67 68 69
    # The wiki needs a Site object created. We make sure it exists here
    try:
        site = Site.objects.get_current()
    except Site.DoesNotExist:
        new_site = Site()
        new_site.domain = settings.SITE_NAME
        new_site.name = "edX"
        new_site.save()
        if str(new_site.id) != str(settings.SITE_ID):
            raise ImproperlyConfigured("No site object was created and the SITE_ID doesn't match the newly created one. " + str(new_site.id) + "!=" + str(settings.SITE_ID))
Calen Pennington committed
70

71
    try:
72
        urlpath = URLPath.get_by_path(course_slug, select_related=True)
Calen Pennington committed
73 74

        results = list(Article.objects.filter(id=urlpath.article.id))
75 76 77 78
        if results:
            article = results[0]
        else:
            article = None
Calen Pennington committed
79

80 81 82 83
    except (NoRootURL, URLPath.DoesNotExist):
        # We will create it in the next block
        urlpath = None
        article = None
Calen Pennington committed
84

85 86 87
    if not article:
        # create it
        root = get_or_create_root()
Calen Pennington committed
88

89 90 91 92
        if urlpath:
            # Somehow we got a urlpath without an article. Just delete it and
            # recerate it.
            urlpath.delete()
Calen Pennington committed
93

94 95
        urlpath = URLPath.create_article(
            root,
96
            course_slug,
97
            title=course_slug,
98
            content="This is the wiki for **{0}**'s _{1}_.".format(course.org, course.display_name_with_default),
99 100 101 102 103 104 105 106 107 108
            user_message="Course page automatically created.",
            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
109

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

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

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
125

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

131
    root = URLPath.create_root(title="Wiki",
132
                        content=starting_content)
133 134 135 136 137 138 139
    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
140

141
    return root