예제 #1
0
    def test_subscribing_not_loggedin_not_registered(self):
        
        '''
            tests the creation of a subcription
            if the user is not registered
            checks if the anoynomous user creation
            along with a subscription to this event
        '''

        user = User(**self.user)
        event = Event(author=user,**self.event)
        user.save()
        event.save()
        ev = Event.objects.filter(title=self.event['title'])
        response = self.client.post(
                '/events/'+str(ev[0].id),
                data={  'username': '******',
                        'email': '*****@*****.**',
                        'comment': 'some absurd comment'
                })
        users = User.objects.filter(username='******',email='*****@*****.**')
        self.assertEqual(len(users),1)
        subs = Subscription.objects.all()
        self.assertEqual(len(subs),1)
        self.assertEqual(subs[0].subscriber, users[0])
        self.assertEqual(subs[0].event.author, user)
        self.assertTrue(response.url,'/events/'+str(ev[0].id))
예제 #2
0
파일: views.py 프로젝트: aeud/sing
def login_google_callback(request):
    url = "https://www.googleapis.com/oauth2/v3/token?code="
    url += request.GET.get("code")
    url += "&client_id="
    url += settings.GA_CLIENT_ID
    url += "&client_secret="
    url += settings.GA_CLIENT_SECRET
    url += "&redirect_uri="
    url += request.build_absolute_uri(reverse("login_google_callback"))
    url += "&grant_type=authorization_code"
    r = requests.post(url)
    jwt = verify_id_token(r.json().get("id_token"), settings.GA_CLIENT_ID)
    email = jwt.get("email").lower()
    try:
        user = User.objects.get(email=email)
    except User.DoesNotExist:
        user = User(email=email)
        user.save()
    user.backend = "django.contrib.auth.backends.ModelBackend"
    try:
        connection = UserConnection.objects.get(token=request.GET.get("state"), user__isnull=True)
    except UserConnection.DoesNotExist:
        return redirect("home")
    manual_login(request, user)
    connection.user = user
    connection.save()
    if connection.referrer_path:
        return redirect(connection.referrer_path)
    return redirect("home")
예제 #3
0
파일: views.py 프로젝트: aeud/sing
def invite_post(request):
    if not request.user.can_invite:
        return render(request, "errors/403.html", status=403)
    email = request.POST.get("email")
    try:
        user = User.objects.get(email=email)
        if user.account:
            return HttpResponseRedirect(reverse("accounts_invite") + "?success=0")
        user.account = request.user.account
    except User.DoesNotExist:
        user = User(email=email, account=request.user.account)
    if request.POST.get("send") == "yes":
        subject = "Welcome to a colorful world!"
        body = transform(
            loader.render_to_string(
                "emails/invite.html", dict(user=user, me=request.user, message=request.POST.get("message"))
            )
        )
        email_message = EmailMultiAlternatives(subject, body, "Master Yoda <*****@*****.**>", [user.email])
        html_email = transform(
            loader.render_to_string(
                "emails/invite.html", dict(user=user, me=request.user, message=request.POST.get("message"))
            )
        )
        email_message.attach_alternative(html_email, "text/html")
        email_message.send()
    user.save()
    return HttpResponseRedirect(reverse("accounts_invite") + "?success=1")
예제 #4
0
파일: views.py 프로젝트: aeud/sing
def login_google_callback(request):
    url = 'https://www.googleapis.com/oauth2/v3/token?code='
    url += request.GET.get('code')
    url += '&client_id='
    url += settings.GA_CLIENT_ID
    url += '&client_secret='
    url += settings.GA_CLIENT_SECRET
    url += '&redirect_uri='
    url += request.build_absolute_uri(reverse('login_google_callback'))
    url += '&grant_type=authorization_code'
    r = requests.post(url)
    jwt = verify_id_token(r.json().get('id_token'), settings.GA_CLIENT_ID)
    email = jwt.get('email').lower()
    try:
        user = User.objects.get(email=email)
    except User.DoesNotExist:
        user = User(email=email)
        user.save()
    user.backend = 'django.contrib.auth.backends.ModelBackend'
    try:
        connection = UserConnection.objects.get(token=request.GET.get('state'),
                                                user__isnull=True)
    except UserConnection.DoesNotExist:
        return redirect('home')
    manual_login(request, user)
    connection.user = user
    connection.save()
    if connection.referrer_path:
        return redirect(connection.referrer_path)
    return redirect('home')
예제 #5
0
파일: views.py 프로젝트: aeud/sing
def invite_post(request):
    if not request.user.can_invite:
        return render(request, 'errors/403.html', status=403)
    email = request.POST.get('email')
    try:
        user = User.objects.get(email=email)
        if user.account:
            return HttpResponseRedirect(
                reverse('accounts_invite') + '?success=0')
        user.account = request.user.account
    except User.DoesNotExist:
        user = User(email=email, account=request.user.account)
    if request.POST.get('send') == 'yes':
        subject = 'Welcome to a colorful world!'
        body = transform(
            loader.render_to_string(
                'emails/invite.html',
                dict(user=user,
                     me=request.user,
                     message=request.POST.get('message'))))
        email_message = EmailMultiAlternatives(
            subject, body, 'Master Yoda <*****@*****.**>', [user.email])
        html_email = transform(
            loader.render_to_string(
                'emails/invite.html',
                dict(user=user,
                     me=request.user,
                     message=request.POST.get('message'))))
        email_message.attach_alternative(html_email, 'text/html')
        email_message.send()
    user.save()
    return HttpResponseRedirect(reverse('accounts_invite') + '?success=1')
예제 #6
0
    def test_event_form(self):

        response = self.client.get('/events/create')
        html = response.content.decode('utf-8')

        user = User(**self.user)
        event = Event(author=user, **self.event)
        form = EventForm(instance=event)
예제 #7
0
 def test_valid_password(self):
     self.assertEquals(True, User.is_valid_password('asdASD123!@#'))
     self.assertEquals(False, User.is_valid_password('aA1#'))
     self.assertEquals(False, User.is_valid_password('aaaaaaaaaaa'))
     self.assertEquals(False, User.is_valid_password('AAAAAAAAAAA'))
     self.assertEquals(False, User.is_valid_password('11111111111'))
     self.assertEquals(False, User.is_valid_password('!!!!!!!!!!!'))
     self.assertEquals(False, User.is_valid_password('asdASD123!@# '))
예제 #8
0
    def setUp(self):

        self.uniq_valid_user = User(username="******",
                                    email="*****@*****.**",
                                    password="******")

        self.dup_valid_username = User(username="******",
                                       email="*****@*****.**",
                                       password="******")

        self.dup_valid_email = User(username="******",
                                    email="*****@*****.**",
                                    password="******")

        self.dup_invalid_password = User(
            username="******",
            email="*****@*****.**",
            password="******"  ## below minimum size
        )
예제 #9
0
def UserEditView(request, userid=None):

    form = None
    user = None
    passForm = None
    rolesForm = None

    if userid == None:
        user = request.user
    elif has_permission(request.user,
                        p.EDIT_USERS) or request.user.id == userid:
        try:
            user = User.objects.get(id=userid)
        except ObjectDoesNotExist as e:
            raise Http404("User Does Not Exist")
    else:
        raise PermissionDenied(
            "You do not have permission to edit/view this user")

    if has_permission(request.user, p.EDIT_USERS):
        roles = []
        for x in get_user_roles(user):
            roles.append(x.display_name)
        rolesForm = RolesForm({'roles': roles})

    form = UserForm(user=request.user, instance=user)
    passForm = PasswordChangeForm(user)

    if request.method == "POST":
        if 'user-submit' in request.POST:
            form = UserForm(user=request.user,
                            data=request.POST or None,
                            files=request.FILES or None,
                            instance=user)
            if form.is_valid():
                form.save()

        if 'password-change' in request.POST:
            passForm = PasswordChangeForm(user, request.POST or None)
            if passForm.is_valid():
                passForm.save()
                update_session_auth_hash(request, user)

        if 'change-role' in request.POST:
            rolesForm = RolesForm(request.POST or None)
            if rolesForm.is_valid():
                User().change_user_role(user, rolesForm.cleaned_data['roles'])

    return render(
        request, "dashboard/edit-user.html", {
            'form': form,
            'user_context': user,
            'passform': passForm,
            'rolesForm': rolesForm
        })
예제 #10
0
    def handle(self, **options):
        from apps.accounts.models import User
        from faker import Faker

        print("Create superuser")
        data = {
            'email': '*****@*****.**',
            'first_name': 'Truong',
            'last_name': 'Tran'
        }
        superuser = User(**data)
        superuser.set_password('truong77')
        superuser.is_active = True
        superuser.is_superuser = True
        superuser.save()
예제 #11
0
    def test_subscribing_not_loggedin_registered(self):

        '''
            tests the creation of a subcription
            if the user is registered
            and doesn't have a subscription
            on this event
        '''

        user = User(**self.user)
        event = Event(author=user,**self.event)
        user.save()
        event.save()
        ev = Event.objects.filter(title=self.event['title'])
        response = self.client.post(
                '/events/'+str(ev[0].id),
                data={  'username': self.user['username'],
                        'email': self.user['email'],
                        'comment': 'some absurd comment'
                })
        sub = Subscription.objects.all()
        self.assertEqual(len(sub),1)
        self.assertTrue(response.url,'/events/'+str(ev[0].id))
예제 #12
0
    def create(self, validate_data):
        profile_data = validate_data.pop("profile")
        raw_password = validate_data.pop("password")
        user = User(**validate_data)
        user.set_password(raw_password)
        user.save()

        UserProfile.objects.create(**profile_data, user=user)
        return user
예제 #13
0
    def register_new_user(cls, user_data, is_active=False):
        """Creates an user instance."""
        plain_password = user_data.pop('password')

        if 'username' not in user_data and 'email' in user_data:
            user_data['username'] = user_data['email']

        user = User(**user_data)
        user.is_active = is_active
        user.set_password(plain_password)
        user.save()

        return user
예제 #14
0
    def get(self, request, username):
        data = validate_data(GetUserDataSerializer,
                             data={"username": username})
        username = data.get("username")

        user = request.user

        if user.username == username:
            target_user = user
        else:
            target_user = User.get_with_username(username=username)

        user_serializer = UserInfoSerializer(target_user,
                                             context={"request": request})

        return Response(user_serializer.data, status=status.HTTP_200_OK)
    def is_Authorization(self, request):
        """
            Validate is a valid token 
        """
        auth_header = request.headers.get('Authorization')
        if auth_header:
            auth_token = auth_header.split(" ")[0]
        else:
            auth_token = ''
        if auth_token:

            resp = User.decode_auth_token(auth_token)
            if not isinstance(resp, str):
                return True
            return False
        else:
            return False
예제 #16
0
 def handle(self, **options):
     from apps.accounts.models import User, Staff
     from faker import Faker
     fake = Faker()
     print("Create staffs")
     num = Staff.objects.count()
     for i in range(num, num + 3):
         data = {
             'email': 'staff' + str(i) + '@gmail.com',
             'first_name': fake.first_name(),
             'last_name': fake.last_name()
         }
         staff = User(**data)
         staff.set_password('truong77')
         staff.is_staff = True
         staff.save()
         Staff.objects.create(user=staff)
예제 #17
0
파일: user.py 프로젝트: liuld/dockerui
def user_add():
    form = AddUserForm()
    if request.method == "POST" and form.validate_on_submit():
        try:
            for field in ['name', 'cname', 'phone_number', 'email']:
                form = form.verify_field(form, field)
            if form.errors:
                return render_template('accounts/user_add.html', form=form)
            data = form.data
            data.pop('csrf_token')
            data.pop('password2')
            new_user = User(**data)
            db.session.add(new_user)
            db.session.commit()
            return redirect(url_for("users_blueprint.user_list"))
        except Exception as E:
            db.session.rollback()
            return {"messages": "内部错误,请联系管理员!"}
    return render_template('accounts/user_add.html', form=form)
예제 #18
0
def load_data_user():
    print("Start import data into user table....")

    users_df = pd.read_csv(os.path.join(workpath, "data/users.csv"),
                           low_memory=False)

    bulk_mgr = BulkCreateManager(chunk_size=10)
    for user in users_df.itertuples():
        bulk_mgr.add(
            User(
                username=user.username,
                password=user.password,
                email=user.email,
                birthday=datetime.strptime(user.birthday,
                                           "%Y/%m/%d").strftime("%Y-%m-%d"),
                gender=user.gender,
                occupation=user.occupation,
            ))

    bulk_mgr.done()
    print("Finished import date user table.")
예제 #19
0
def confirm(request):
    cart = request.cart
    form = AddOrderForm(request.POST)
    if form.is_valid():
        cart.status = Cart.CLOSED
        cart.save()
        obj = form.save(commit=False)
        obj.cart = cart
        if request.user.is_authenticated():
            obj.user = request.user
        else:
            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            email = form.cleaned_data['email']
            user = User.create_user_order(first_name, last_name, email)
            cart.user = user
            cart.save()
        obj.save()
        return render(request, 'confirm.html')
    else:
        return render(request, 'order.html', {'form': form})
 def handle(self, **options):
     from apps.accounts.models import User, Trainer
     print("Create trainers")
     data1 = {
         'email': '*****@*****.**',
         'first_name': 'Phượng',
         'last_name': 'Nguyễn',
         'image': '/seeds/images/trainers/chi_phuong.jpg'
     }
     user1 = User(**data1)
     user1.set_password('truong77')
     user1.is_trainer = True
     user1.save()
     trainer1 = Trainer.objects.create(user=user1)
     trainer1.introduction = '''Phấn đấu là một huấn luyện viên được mọi người săn đón. Tôi không ngừng học hỏi, trau dồi kiến thức dinh dưỡng, tập luyện để áp dụng cho bản thân qua đó truyền cảm hứng, động lực cho học viên có một lối sống tích cực, khoa học, thói quen tập luyện đều đặn và đạt được kết quả sớm nhất trong việc tập luyện.'''
     trainer1.experience = '''<ul><li>8 năm luyện tập Yoga.</li><li>5 năm giảng dạy Yoga ở nhiều trung t&acirc;m kh&aacute;c nhau.</li></ul>'''
     trainer1.achievements = '''<p>Tham gia c&aacute;c cuộc thi Yoga ở th&agrave;nh phố Hồ Ch&iacute; Minh v&agrave; đạt được nhiều th&agrave;nh t&iacute;ch.</p><p>Đạt <strong>Giải nhất&nbsp;</strong>Yoga đơn/đ&ocirc;i năm 2015</p><p><img alt="" src="/media/seeds/achievements/chi_phuong_anh_tan.jpg" /></p>'''
     trainer1.save()
     user1.certificates.create(
         name='Chứng nhận hoàn thành khóa đào tạo Hướng dẫn viên cơ bản Yoga', image='/seeds/images/trainers/chi-phuong/chung-nhan-da-hoan-thanh-khoa-dao-tao-huong-dan-vien-yoga.jpg')
     user1.certificates.create(
         name='Chứng nhận Giải Nhất Festival Yoga Hồ Chí Minh mở rộng lần 1 năm 2017', image='/seeds/images/trainers/chi-phuong/festival-yoga-thanh-pho-hcm.jpg')
     user1.certificates.create(
         name='Chứng nhận Giải Nhất Festival Yoga Hồ Chí Minh mở rộng lần 2 năm 2018', image='/seeds/images/trainers/chi-phuong/giai-nhat-yoga-mo-rong-lan2-nam-2018.jpg')
예제 #21
0
def sync_user_relations(user: User, attrs: dict):
    dn = attrs.get('distinguishedName')[0]

    user.is_active = True
    user.save(update_fields=['is_active'])

    dn_parts = dn.lower().split(',')
    if 'ou=zaci' in dn_parts:
        class_ = dn.split(',')[1].split('=')[1].replace(' ', '')
        user.school_class = class_

        user.groups.add(_group_cache['student'])
        user.save(update_fields=['school_class'])

    elif 'ou=ucitele' in dn_parts:
        user.groups.add(_group_cache['teacher'])

    elif 'ou=zaci-zakazani' in dn_parts:
        pass  # RIP

    else:
        logger.info("Not group assigned for user: %s.", dn_parts)
예제 #22
0
 def get_current_user(self):
     email = self.get_secure_cookie('user')
     if email is None:
         return None
     return User.objects(email=email).first()
예제 #23
0
def getTableDataForUsers(enabled_columns=None,
                         search=None,
                         sort_by=None,
                         sort_order=None,
                         start=-1,
                         end=-1):
    t = TableData()
    users = User.filter_user_data(search=search,
                                  sort_by=sort_by,
                                  sort_order=sort_order,
                                  start=start,
                                  end=end)

    if search != None:
        t.addMetaField("search", search)

    if sort_by != None:
        t.addMetaField("sorted_by", sort_by)
        t.addMetaField("sort_order", sort_order)

    if enabled_columns == None:
        t.addField("avatar", "...", "w-1")
        t.addField("first_name", "First Name")
        t.addField("last_name", "Last Name")
        t.addField("email", "Email")
    else:
        for col in enabled_columns:
            field = User._meta.get_field(col)
            if field.name == "avatar":
                label = "..."
            else:
                label = field.verbose_name
            t.addField(field.name, label)

    ignored_fields = ['password', 'groups', 'user_permissions', 'is_superuser']
    non_sortable_fields = ignored_fields + ['avatar']
    for field in User._meta.get_fields():
        if type(field) != ManyToOneRel:
            if field.name not in ignored_fields:
                t.addAvailableField(field.name, field.verbose_name)
            if field.name not in non_sortable_fields:
                t.addSortableField(field.name, field.verbose_name)

    counter = 0
    for user in users:
        t.addRow(user.id)

        if enabled_columns == None:

            t.addCellToRow(counter, "avatar", "", "",
                           {"url": user.avatar.url if user.avatar else ""})
            t.addCellToRow(counter, 'text', user.first_name)
            t.addCellToRow(counter, 'text', user.last_name)
            t.addCellToRow(counter, "text-secondary", user.email)
        else:
            for col in enabled_columns:
                field = User._meta.get_field(col)
                param = {}
                cell_type = ""
                text = ""
                subtext = ""
                if field.name == "avatar":
                    param = {"url": user.avatar.url if user.avatar else ""}
                    cell_type = "avatar"
                else:
                    text = getattr(user, field.name)
                    cell_type = "text"

                t.addCellToRow(counter, cell_type, text, subtext, param)

        t.addActionButtonToRow(counter,
                               reverse('dashboard:edit-user', args=[user.id]),
                               "Edit", "btn-secondary")

        if user.is_active:
            t.addActionButtonToRow(
                counter, reverse('dashboard:suspend-user', args=[user.id]),
                "Suspend", "btn-danger")
        else:
            t.addActionButtonToRow(
                counter, reverse('dashboard:enable-user', args=[user.id]),
                "Enable", "btn-primary")

        counter += 1

    return t.getObject()
예제 #24
0
def email_not_taken_validator(email):
    if User.is_email_taken(email):
        raise ValidationError("An account for the email already exists.")
예제 #25
0
 def setUp(self):
     super().setUp()
     self.my_user = User(username=UserFormTestData.my_user["username"],
                         email=UserFormTestData.my_user["email"],
                         password=UserFormTestData.my_user["password"])
     translation.activate('pt')  # class language activation
예제 #26
0
 def setUp(self):
     super().setUp()
     self.my_user = User(username=UserFormTestData.my_user["username"],
                         email=UserFormTestData.my_user["email"],
                         password=UserFormTestData.my_user["password"])
예제 #27
0
 def set_pasword(cls, user: User, plain_password: str) -> None:
     """Configures a user password."""
     user.set_password(plain_password)
     user.save()
예제 #28
0
def username_not_taken_validator(username):
    if User.is_username_taken(username):
        raise ValidationError("The username is already taken.")
예제 #29
0
    def create(self, validated_data):
        if validated_data.get('is_seller') == True:
            print(validated_data)
            profile_data = validated_data.pop('vendor')
            password = validated_data.pop('password')
            image = validated_data.pop('image')
            email = validated_data.pop('email')
            username = validated_data.pop('username')
            first_name = validated_data.pop('first_name')
            last_name = validated_data.pop('last_name')
            is_seller = validated_data.pop('is_seller')
            address_line_1 = validated_data.pop('address_line_1')
            address_line_2 = validated_data.pop('address_line_2')
            phone = validated_data.pop('phone')
            user = User(email=email,
                        username=username,
                        image=image,
                        first_name=first_name,
                        last_name=last_name,
                        is_seller=is_seller,
                        address_line_1=address_line_1,
                        address_line_2=address_line_2,
                        phone=phone)
            user.set_password(password)
            user.save()
            Vendor.objects.create(user=user, **profile_data)
            return user

        else:

            profile_data = validated_data.pop('customer')
            password = validated_data.pop('password')
            email = validated_data.pop('email')
            username = validated_data.pop('username')
            is_seller = validated_data.pop('is_seller')
            address_line_1 = validated_data.pop('address_line_1')
            address_line_2 = validated_data.pop('address_line_2')
            phone = validated_data.pop('phone')
            user = User(email=email,
                        username=username,
                        address_line_1=address_line_1,
                        address_line_2=address_line_2,
                        phone=phone,
                        is_seller=is_seller)
            user.set_password(password)
            user.save()
            Customer.objects.create(user=user, **profile_data)
            return user
예제 #30
0
    def setUp(self):
        # setup User (seller)
        cu = User(first_name='bb',
                  last_name='bb',
                  email='*****@*****.**',
                  demand_safety_factor=100,
                  excess_production_safety_factor=100)
        cu.save()

        # setup user (buyer)
        bu1 = User(
            first_name='buyer1b',
            last_name='buyer1b',
            email='*****@*****.**',
            demand_safety_factor=100,
            excess_production_safety_factor=100,
        )
        bu1.save()

        # date range of interest, latest 12 months w/ no credit transfers
        eom_date_range = pd.date_range(  # makes it at end of month for some reason
            start='2020-01-01',
            end='2020-12-01',
            freq='M')
        # date before date range of interest
        b1 = Bill(user=cu,
                  date_end=pd.to_datetime('2019-12-31'),
                  total_cost=50,
                  excess_production_cost=15)
        b1.save()

        for date_entry in eom_date_range:
            # seller bills w/ just excess production
            b1 = Bill(user=cu,
                      date_end=date_entry,
                      total_cost=100,
                      excess_production_cost=30)
            b1.save()

        # dates after range of interest, will contain credit transfers
        eom_date_range2 = pd.date_range(  # makes it at end of month for some reason
            start='2021-01-01',
            end='2021-12-01',
            freq='M')

        for date_entry in eom_date_range2:
            # seller bill's w/ credit transfers
            seller_bill = Bill(user=cu,
                               date_end=date_entry,
                               total_cost=110,
                               excess_production_cost=20,
                               total_transferred_credit=10)
            seller_bill.save()

            # buyer1 bill w/ credit transfer
            buyer1_bill = Bill(
                user=bu1,
                date_end=date_entry,
                total_cost=40,
            )
            buyer1_bill.save()

            # buyer1 credit transfer
            c1 = CreditTransfer(seller_bill=seller_bill,
                                buyer_bill=buyer1_bill,
                                transferred_credit=5)
            c1.save()
예제 #31
0
def user_username_exists(username):
    if not User.user_with_username_exists(username=username):
        raise NotFound("No user with the provided username exists.")
예제 #32
0
 def get_current_user(self):
     email = self.get_secure_cookie('user')
     if email is None:
         return None
     return User.objects(email=email).first()
    def handle(self, **options):
        from getenv import env
        from apps.blog.models import PostCategory, Post
        from apps.classes.models import YogaClass, PaymentPeriod
        from apps.courses.models import Course, TRAINING_COURSE
        from apps.accounts.models import User, Trainer
        from apps.rooms.models import Room
        # new class in the future
        data_hoang_anh = {
            'email': '*****@*****.**',
            'first_name': 'Anh',
            'last_name': 'Hoàng',
            'image': '/seeds/images/trainers/thay_hoang_anh.jpg'
        }
        user_hoang_anh = User(**data_hoang_anh)
        user_hoang_anh.set_password('truong77')
        user_hoang_anh.is_trainer = True
        user_hoang_anh.save()
        thay_hoang_anh = Trainer.objects.create(user=user_hoang_anh)
        thay_hoang_anh.introduction = '''Phấn đấu là một huấn luyện viên được mọi người săn đón. Tôi không ngừng học hỏi, trau dồi kiến thức dinh dưỡng, tập luyện để áp dụng cho bản thân qua đó truyền cảm hứng, động lực cho học viên có một lối sống tích cực, khoa học, thói quen tập luyện đều đặn và đạt được kết quả sớm nhất trong việc tập luyện.'''
        thay_hoang_anh.experience = '''<ul><li>10 năm luyện tập Yoga.</li><li>8 năm giảng dạy Yoga ở nhiều trung t&acirc;m kh&aacute;c nhau.</li></ul>'''
        thay_hoang_anh.achievements = '''<p>Tham gia c&aacute;c cuộc thi Yoga ở th&agrave;nh phố Hồ Ch&iacute; Minh v&agrave; đạt được nhiều th&agrave;nh t&iacute;ch.</p><p>Đạt <strong>Giải nhất&nbsp;</strong>Yoga đơn/đ&ocirc;i năm 2015</p><p><img alt="" src="/media/seeds/achievements/all.jpg" /></p>'''
        thay_hoang_anh.save()
        thay_hoang_anh.user.certificates.create(
            name='Chứng chỉ trị liệu Yoga cấp bởi Indian Board of Alternative Medicines')
        thay_hoang_anh.user.certificates.create(
            name='Chứng nhận đã hoàn thành khóa đào tạo Huấn luyện viên Yoga của CLB Yoga Hương Tre')
        thay_hoang_anh.user.certificates.create(
            name='Bằng thạc sĩ khoa học Yoga của Đại Học Haridwar, Ấn Độ năm 2012')
        thay_hoang_anh.user.certificates.create(
            name='Huy chương vàng cuộc thi Master Yoga Science & Holistic Health')
        print("Create <TRAINING YOGA TRAINER> COURSES")
        training_yoga_trainer_course_data = {
            'name': 'Đào tạo huấn luyện viên',
            'description': '''Yoga Hương Tre mang đến những kiến thức từ cơ bản đến nâng cao, từ đạo đức, triết lý nghề nghiệp. Đạo tạo ra một người giáo viên Yoga chân chính, tâm huyết với nghề. Chứ không phải chỉ là một người huấn luyện viên chỉ biết đưa các bài học động tác cho học''',
            'content': '''<p>⭐️&nbsp;Đội ngũ&nbsp;Gi&aacute;o vi&ecirc;n đ&agrave;o tạo nhiều năm kinh nghiệm.</p>
                        <p>⭐️&nbsp;Gi&aacute;o tr&igrave;nh b&agrave;i bản khoa học, đảm bảo kỹ năng đứng lớp, chất lượng giảng dạy ưu ti&ecirc;n h&agrave;ng đầu.</p>

                        <p>⭐️&nbsp;Được nhận <strong>GIẤY CHỨNG NHẬN</strong> sau khi ho&agrave;n th&agrave;nh kh&oacute;a học từ Trung T&acirc;m Yoga Hương Tre.</p>

                        <p>⭐️&nbsp;Học vi&ecirc;n sau khi tốt nghiệp được giới thiệu việc l&agrave;m&nbsp;hoặc được&nbsp;giảng dạy tại Trung T&acirc;m Yoga Hương Tre.</p>

                        <p>⭐️ Hỗ trợ về kỹ thuật, định hướng, thương hiệu, x&acirc;y dựng ph&ograve;ng tập yoga nếu mở trung t&acirc;m ri&ecirc;ng.</p>

                        <p>⭐️ Hỗ trợ học vi&ecirc;n đủ điều kiện tham gia học, nhận chứng chỉ Li&ecirc;n Đo&agrave;n Yoga Việt Nam.</p>

                        <p><img alt="💥" src="https://static.xx.fbcdn.net/images/emoji.php/v9/t99/1.5/16/1f4a5.png" style="height:16px; width:16px" />&nbsp;Lựa chọn Nghề HLV YOGA bạn kh&ocirc;ng chỉ bảo vệ cho ch&iacute;nh sức khỏe của bản th&acirc;n bạn m&agrave; c&ograve;n cho ch&iacute;nh những người th&acirc;n v&agrave; cộng đồng xung quanh bạn.</p>

                        <p><img alt="💯" src="https://static.xx.fbcdn.net/images/emoji.php/v9/t4a/1.5/16/1f4af.png" style="height:16px; width:16px" />&nbsp;KH&Ocirc;NG NHỮNG MANG LẠI GI&Aacute; TRỊ VỀ SỨC KHỎE, NGHỀ HLV YOGA C&Ograve;N GI&Uacute;P BẠN C&Oacute; THU NHẬP CAO.</p>

                        <p><img alt="‼" src="https://static.xx.fbcdn.net/images/emoji.php/v9/tfe/1.5/16/203c.png" style="height:16px; width:16px" />&nbsp;Đ&acirc;y l&agrave; việc hiếm hoi m&agrave; bạn vừa c&oacute; thể kiếm tiền vừa c&oacute; thể gi&uacute;p người kh&aacute;c khỏe mạnh, sống t&iacute;ch cực hơn.</p>

                        <p><img alt="‼" src="https://static.xx.fbcdn.net/images/emoji.php/v9/tfe/1.5/16/203c.png" style="height:16px; width:16px" />&nbsp;Việc trở th&agrave;nh một gi&aacute;o vi&ecirc;n Yoga sẽ khiến bạn c&oacute; thể l&agrave;m việc ở khắp mọi nơi. V&igrave; sau khi học xong bạn sẽ được Bằng Yoga c&oacute; gi&aacute; trị to&agrave;n quốc</p>

                        <p>===================</p>

                        <p>Giấy chứng nhận ho&agrave;n th&agrave;nh kh&oacute;a học</p>

                        <p><img alt="" src="/media/seeds/2020/07/03/hlv/giay-chung-nhan-hlv-2.jpg" style="height:526px; width:870px" /></p>

                        <p>===================</p>

                        <p><img alt="⚡" src="https://static.xx.fbcdn.net/images/emoji.php/v9/te4/1.5/16/26a1.png" style="height:16px; width:16px" /><img alt="⚡" src="https://static.xx.fbcdn.net/images/emoji.php/v9/te4/1.5/16/26a1.png" style="height:16px; width:16px" /><img alt="⚡" src="https://static.xx.fbcdn.net/images/emoji.php/v9/te4/1.5/16/26a1.png" style="height:16px; width:16px" />&nbsp;NHANH TAY&nbsp;ĐĂNG K&Yacute; NGAY KH&Oacute;A HỌC HUẤN LUYỆN VI&Ecirc;N YOGA ĐỂ TRỞ TH&Agrave;NH HUẤN LUYỆN VI&Ecirc;N YOGA TRONG TƯƠNG LAI</p>

                        <p>===================</p>

                        <p>Kh&oacute;a Đ&agrave;o tạo&nbsp;Huấn luyện vi&ecirc;n&nbsp;Yoga l&agrave; kh&oacute;a học d&agrave;nh cho những ai muốn theo đuổi sự nghiệp giảng dạy&nbsp;Yoga chuy&ecirc;n nghiệp.&nbsp;</p>

                        <p>Kh&oacute;a học l&agrave; một khởi đầu vững chắc cho bạn tr&ecirc;n con đường tiếp theo trong sự nghiệp giảng dạy Yoga sau n&agrave;y.</p>

                        <p>Nghề gi&aacute;o vi&ecirc;n Yoga cho bạn một sức khỏe, một tinh thần thoải m&aacute;i. Biết lắng nghe, hiểu cơ thể m&igrave;nh đang muốn g&igrave;. Bạn sẽ lu&ocirc;n thấy một sức khỏe dồi d&agrave;o, một cơ thể dẻo dai ở mỗi người huấn luyện vi&ecirc;n Yoga. Người tập sẽ được hướng dẫn chi tiết, cẩn thận để từng động t&aacute;c lu&ocirc;n ch&iacute;nh x&aacute;c. Cơ thể từ người tập đến người hướng dẫn đều được cải thiện.</p>

                        <p>CLB Yoga Hương Tre mang đến những kiến thức từ cơ bản đến n&acirc;ng cao, từ đạo đức, triết l&yacute; nghề nghiệp. Đạo tạo ra một người gi&aacute;o vi&ecirc;n Yoga ch&acirc;n ch&iacute;nh, t&acirc;m huyết với nghề. Chứ kh&ocirc;ng phải chỉ l&agrave; một người huấn luyện vi&ecirc;n chỉ biết đưa c&aacute;c b&agrave;i học động t&aacute;c cho học vi&ecirc;n. Đ&atilde; c&oacute; rất nhiều học vi&ecirc;n t&igrave;m đến nơi đ&acirc;y tr&ecirc;n cả nước với mong muốn thay đổi bản th&acirc;n, muốn c&oacute; một nghề nghiệp mới v&agrave; đ&atilde; th&agrave;nh c&ocirc;ng.</p>

                        <p>Vậy th&igrave; c&ograve;n bạn, bạn đ&atilde; thực sự sẵn s&agrave;ng để trở th&agrave;nh một gi&aacute;o vi&ecirc;n Yoga hay chưa?</p>

                        <p><img alt="" src="/media/seeds/2020/07/03/hlv/trung-tam-dao-tao-huan-luyen-vien-yoga-uy-tin-2.jpg" style="height:716px; width:960px" /></p>

                        <h3>Một số h&igrave;nh ảnh về lớp huấn luyện vi&ecirc;n Yoga</h3>

                        <p><img alt="" src="/media/seeds/2020/07/03/hlv/phong-dao-tao-hlv.jpg" style="height:656px; width:875px" /></p>

                        <p><img alt="" src="/media/seeds/2020/07/03/hlv/1.jpg" style="height:656px; width:875px" /></p>

                        <h3>Trao chứng nhận ho&agrave;n th&agrave;nh kh&oacute;a học</h3>

                        <p><img alt="" src="/media/seeds/2020/07/03/hlv/le-trao-chung-nhan-2.jpg" style="height:720px; width:960px" /></p>

                        <p><img alt="" src="/media/seeds/2020/07/03/hlv/le-trao-chung-nhan-4.jpg" style="height:720px; width:960px" /></p>

                        <p><img alt="" src="/media/seeds/2020/07/03/hlv/trao-chung-nhan-1.jpg" style="height:686px; width:960px" /></p>
                        ''',
            'course_type': TRAINING_COURSE,
            'image': 'seeds/images/courses/huan_luyen_vien_yoga.jpg',
            'price_for_training_class': 20000000,
            'wages_per_lesson': 500000
        }
        training_yoga_trainer_course = Course(
            **training_yoga_trainer_course_data)
        training_yoga_trainer_course.save()

        room3_data = {
            "name": "Phòng 3",
            "location": "Lầu 3",
            "max_people": 15
        }
        room3 = Room.objects.create(**room3_data)

        # TRAINING CLASS
        _today = timezone.now()
        _start_of_week = _today - timedelta(days=_today.weekday())  # Monday
        t_21h = '21:00'
        _saturday = (_start_of_week + timedelta(days=5)).date()
        training_class_thay_hoang_anh = training_yoga_trainer_course.classes.create(
            name='Lớp đào tạo thầy Hoàng Anh 18h tối thứ 7 - KDT2',
            price_for_training_class=20000000,
            start_at=_saturday + timedelta(days=14),
            end_at=_saturday + timedelta(days=14 + 28*3),
            trainer=thay_hoang_anh,
        )
        t_18h = '18:00'
        for i in range(0, 12):
            count_date = 7 * i + 14
            training_class_thay_hoang_anh.lessons.create(**{
                "room_id": room3.pk,
                "date": _saturday + timedelta(days=count_date),
                "start_time": t_18h,
                "end_time": t_21h
            })

        period1 = training_class_thay_hoang_anh.payment_periods.create(**{
            'name': 'Đợt thanh toán 1',
            'amount': 12000000,
            'end_at': datetime.combine(_saturday + timedelta(days=14), time.max, _today.tzinfo)
        })
        period2 = training_class_thay_hoang_anh.payment_periods.create(**{
            'name': 'Đợt thanh toán 2',
            'amount': 10000000,
            'end_at': datetime.combine(_saturday + timedelta(days=(14 + 7*7)), time.max, _today.tzinfo)
        })