factories.py 4.67 KB
Newer Older
1 2
# Factories are self documenting
# pylint: disable=missing-docstring
3 4
import json
from functools import partial
5 6
import factory
from factory.django import DjangoModelFactory
7 8 9 10 11 12

# Imported to re-export
# pylint: disable=unused-import
from student.tests.factories import UserFactory  # Imported to re-export
# pylint: enable=unused-import

13
from student.tests.factories import UserProfileFactory as StudentUserProfileFactory
Calen Pennington committed
14
from courseware.models import StudentModule, XModuleUserStateSummaryField
15
from courseware.models import XModuleStudentInfoField, XModuleStudentPrefsField
16
from student.roles import (
17 18 19 20 21 22 23
    CourseInstructorRole,
    CourseStaffRole,
    CourseBetaTesterRole,
    GlobalStaff,
    OrgStaffRole,
    OrgInstructorRole,
)
Calen Pennington committed
24

25
from opaque_keys.edx.locations import SlashSeparatedCourseKey
26

27

28 29
# TODO fix this (course_id and location are invalid names as constants, and course_id should really be COURSE_KEY)
# pylint: disable=invalid-name
30 31
course_id = SlashSeparatedCourseKey(u'edX', u'test_course', u'test')
location = partial(course_id.make_usage_key, u'problem')
32

Calen Pennington committed
33

34 35
class UserProfileFactory(StudentUserProfileFactory):
    courseware = 'course.xml'
36 37


38 39 40 41 42
# For the following factories, these are disabled because we're ok ignoring the
# unused arguments create and **kwargs in the line:
# course_key(self, create, extracted, **kwargs)
# pylint: disable=unused-argument

43
class InstructorFactory(UserFactory):
44
    """
45
    Given a course Location, returns a User object with instructor
46 47
    permissions for `course`.
    """
48 49
    last_name = "Instructor"

50
    @factory.post_generation
51
    def course_key(self, create, extracted, **kwargs):
52
        if extracted is None:
53
            raise ValueError("Must specify a CourseKey for a course instructor user")
54
        CourseInstructorRole(extracted).add_users(self)
55 56


57
class StaffFactory(UserFactory):
58
    """
59
    Given a course Location, returns a User object with staff
60 61
    permissions for `course`.
    """
62
    last_name = "Staff"
Calen Pennington committed
63

64
    @factory.post_generation
65
    def course_key(self, create, extracted, **kwargs):
66
        if extracted is None:
67
            raise ValueError("Must specify a CourseKey for a course staff user")
68
        CourseStaffRole(extracted).add_users(self)
69

70

71 72 73 74 75 76 77
class BetaTesterFactory(UserFactory):
    """
    Given a course Location, returns a User object with beta-tester
    permissions for `course`.
    """
    last_name = "Beta-Tester"

78
    @factory.post_generation
79
    def course_key(self, create, extracted, **kwargs):
80
        if extracted is None:
81
            raise ValueError("Must specify a CourseKey for a beta-tester user")
82 83 84
        CourseBetaTesterRole(extracted).add_users(self)


85 86 87 88 89 90 91
class OrgStaffFactory(UserFactory):
    """
    Given a course Location, returns a User object with org-staff
    permissions for `course`.
    """
    last_name = "Org-Staff"

92
    @factory.post_generation
93
    def course_key(self, create, extracted, **kwargs):
94
        if extracted is None:
95 96
            raise ValueError("Must specify a CourseKey for an org-staff user")
        OrgStaffRole(extracted.org).add_users(self)
97 98 99 100 101 102 103 104 105


class OrgInstructorFactory(UserFactory):
    """
    Given a course Location, returns a User object with org-instructor
    permissions for `course`.
    """
    last_name = "Org-Instructor"

106
    @factory.post_generation
107
    def course_key(self, create, extracted, **kwargs):
108
        if extracted is None:
109 110
            raise ValueError("Must specify a CourseKey for an org-instructor user")
        OrgInstructorRole(extracted.org).add_users(self)
111 112


113 114 115 116 117 118
class GlobalStaffFactory(UserFactory):
    """
    Returns a User object with global staff access
    """
    last_name = "GlobalStaff"

119
    @factory.post_generation
120 121
    def set_staff(self, create, extracted, **kwargs):
        GlobalStaff().add_users(self)
122
# pylint: enable=unused-argument
123 124


125
class StudentModuleFactory(DjangoModelFactory):
126 127 128
    FACTORY_FOR = StudentModule

    module_type = "problem"
129
    student = factory.SubFactory(UserFactory)
130
    course_id = SlashSeparatedCourseKey("MITx", "999", "Robot_Super_Course")
131 132 133 134
    state = None
    grade = None
    max_grade = None
    done = 'na'
135 136


Calen Pennington committed
137 138
class UserStateSummaryFactory(DjangoModelFactory):
    FACTORY_FOR = XModuleUserStateSummaryField
139 140 141

    field_name = 'existing_field'
    value = json.dumps('old_value')
142
    usage_id = location('usage_id')
143 144 145 146 147 148 149


class StudentPrefsFactory(DjangoModelFactory):
    FACTORY_FOR = XModuleStudentPrefsField

    field_name = 'existing_field'
    value = json.dumps('old_value')
150
    student = factory.SubFactory(UserFactory)
151
    module_type = 'mock_problem'
152 153 154 155 156 157 158


class StudentInfoFactory(DjangoModelFactory):
    FACTORY_FOR = XModuleStudentInfoField

    field_name = 'existing_field'
    value = json.dumps('old_value')
159
    student = factory.SubFactory(UserFactory)