factories.py 3.82 KB
Newer Older
1
"""Provides factories for student models."""
2
from student.models import (User, UserProfile, Registration,
3
                            CourseEnrollmentAllowed, CourseEnrollment,
4 5
                            PendingEmailChange, UserStanding,
                            )
6
from course_modes.models import CourseMode
7
from django.contrib.auth.models import Group, AnonymousUser
8
from datetime import datetime
9 10
import factory
from factory.django import DjangoModelFactory
11
from uuid import uuid4
12
from pytz import UTC
13
from opaque_keys.edx.locations import SlashSeparatedCourseKey
14

15 16
# Factories are self documenting
# pylint: disable=missing-docstring
17

18

19
class GroupFactory(DjangoModelFactory):
20
    FACTORY_FOR = Group
21 22
    FACTORY_DJANGO_GET_OR_CREATE = ('name', )

23
    name = factory.Sequence(u'group{0}'.format)
24

25

26 27 28 29 30 31 32
class UserStandingFactory(DjangoModelFactory):
    FACTORY_FOR = UserStanding

    user = None
    account_status = None
    changed_by = None

33

34
class UserProfileFactory(DjangoModelFactory):
35
    FACTORY_FOR = UserProfile
36
    FACTORY_DJANGO_GET_OR_CREATE = ('user', )
37 38

    user = None
39
    name = factory.LazyAttribute(u'{0.user.first_name} {0.user.last_name}'.format)
40
    level_of_education = None
41
    gender = u'm'
42
    mailing_address = None
43
    goals = u'World domination'
44 45


46 47 48 49 50 51 52 53 54 55
class CourseModeFactory(DjangoModelFactory):
    FACTORY_FOR = CourseMode

    course_id = None
    mode_display_name = u'Honor Code',
    mode_slug = 'honor'
    min_price = 0
    suggested_prices = ''
    currency = 'usd'

56

57
class RegistrationFactory(DjangoModelFactory):
58 59 60
    FACTORY_FOR = Registration

    user = None
61
    activation_key = uuid4().hex.decode('ascii')
62 63


64
class UserFactory(DjangoModelFactory):
65
    FACTORY_FOR = User
66
    FACTORY_DJANGO_GET_OR_CREATE = ('email', 'username')
67

68 69 70 71
    username = factory.Sequence(u'robot{0}'.format)
    email = factory.Sequence(u'robot+test+{0}@edx.org'.format)
    password = factory.PostGenerationMethodCall('set_password', 'test')
    first_name = factory.Sequence(u'Robot{0}'.format)
72 73 74 75
    last_name = 'Test'
    is_staff = False
    is_active = True
    is_superuser = False
76 77
    last_login = datetime(2012, 1, 1, tzinfo=UTC)
    date_joined = datetime(2011, 1, 1, tzinfo=UTC)
78

79
    @factory.post_generation
80
    def profile(obj, create, extracted, **kwargs):  # pylint: disable=unused-argument, no-self-argument
81 82 83 84 85 86 87 88
        if create:
            obj.save()
            return UserProfileFactory.create(user=obj, **kwargs)
        elif kwargs:
            raise Exception("Cannot build a user profile without saving the user")
        else:
            return None

89
    @factory.post_generation
90 91 92 93 94 95 96 97 98 99 100
    def groups(self, create, extracted, **kwargs):
        if extracted is None:
            return

        if isinstance(extracted, basestring):
            extracted = [extracted]

        for group_name in extracted:
            self.groups.add(GroupFactory.simple_generate(create, name=group_name))


101
class AnonymousUserFactory(factory.Factory):
102 103
    FACTORY_FOR = AnonymousUser

104

105
class AdminFactory(UserFactory):
106 107
    is_staff = True

108

109
class CourseEnrollmentFactory(DjangoModelFactory):
110 111
    FACTORY_FOR = CourseEnrollment

112
    user = factory.SubFactory(UserFactory)
113
    course_id = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall')
114 115


116
class CourseEnrollmentAllowedFactory(DjangoModelFactory):
117 118 119
    FACTORY_FOR = CourseEnrollmentAllowed

    email = 'test@edx.org'
120
    course_id = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall')
121 122 123 124 125 126 127 128 129 130 131


class PendingEmailChangeFactory(DjangoModelFactory):
    """Factory for PendingEmailChange objects

    user: generated by UserFactory
    new_email: sequence of new+email+{}@edx.org
    activation_key: sequence of integers, padded to 30 characters
    """
    FACTORY_FOR = PendingEmailChange

132 133 134
    user = factory.SubFactory(UserFactory)
    new_email = factory.Sequence(u'new+email+{0}@edx.org'.format)
    activation_key = factory.Sequence(u'{:0<30d}'.format)