Пример #1
0
class TestSignupView(TestCase):
    def setUp(self) -> None:
        self.user = User.objects.create_user(username='******',
                                             email='*****@*****.**',
                                             password='******')
        self.user_profile = UserProfile()
        self.user_profile.user = self.user
        self.user_profile.save()

        self.team = Team(name='Kitchen', description='Cook stuff.', max_size=2)
        self.team.save()

        self.membership = TeamMembership(team=self.team,
                                         member=self.user)
        self.membership.save()

    def test_signup_form_validation(self):
        data = {
            'first_name': 'Foo',
            'last_name': 'Bar',
            'years_on_playa': 2,
            'invited_by': 'Baz Qux',
            'email': '*****@*****.**',
            'password': '******',
            'duplicate_password': '******',
            'phone': '555-555-5555',
            'zipcode': '12345',
            'g-recaptcha-response': 'PASSED',
            'interested_team': self.team.id,
        }
        os.environ['RECAPTCHA_TESTING'] = 'True'
        form = SignUpForm(data)
        self.assertTrue(form.is_valid())
Пример #2
0
class TestSignupView(TestCase):
    def setUp(self) -> None:
        self.user = User.objects.create_user(username='******',
                                             email='*****@*****.**',
                                             password='******')
        self.user_profile = UserProfile()
        self.user_profile.user = self.user
        self.user_profile.save()

        self.team = Team(name='Kitchen', description='Cook stuff.', max_size=2)
        self.team.save()

        self.membership = TeamMembership(team=self.team, member=self.user)
        self.membership.save()

    def test_signup_form_validation(self):
        data = {
            'first_name': 'Foo',
            'last_name': 'Bar',
            'years_on_playa': 2,
            'invited_by': 'Baz Qux',
            'email': '*****@*****.**',
            'password': '******',
            'duplicate_password': '******',
            'phone': '555-555-5555',
            'zipcode': '12345',
            'g-recaptcha-response': 'PASSED',
            'interested_teams': [self.team.id],
        }
        os.environ['RECAPTCHA_TESTING'] = 'True'
        form = SignUpForm(data)
        self.assertTrue(form.is_valid())
Пример #3
0
 def form_valid(self, form):
     team = Team(name=form.cleaned_data['team_name'])
     team.save()
     team.nodes_visible.add(1)
     team.nodes_visible.add(2)
     team.nodes_visible.add(3)
     team.nodes_visible.add(4)
     def add_player(username, first_name, last_name, team):
         if username: 
             try:
                 user = User.objects.get(username=username)
             except User.DoesNotExist:
                 user = User(username=username)
             user.first_name = first_name
             user.last_name = last_name
             user.save()
             team.members.add(user)
     print form.cleaned_data
     for i in range(1,4):
         add_player(
             form.cleaned_data['player{0}_crsid'.format(i)],
             form.cleaned_data['player{0}_first_name'.format(i)],
             form.cleaned_data['player{0}_last_name'.format(i)],
             team)
     return super(SignupView, self).form_valid(form)
Пример #4
0
class DB_Teams_Interface:
    def __init__(self):
        self.g = None

    def create_single_rating_info(self, team, conf, div):
        self._add_to_db(team, conf, div, False)

    def create_teams_from_dict(self, dict):
        for i in dict:
            div = i
            cur_div = dict.get(i)
            for j in cur_div:
                team = j
                conf = cur_div.get(j)
                self._add_to_db(team, conf, div, False)

    def _add_to_db(self, team, conf, div, override):
        if not override:
            if not Team.objects.filter(
                    team_name=team, conference=conf, division=div).exists():
                self.g = Team(team_name=team, conference=conf, division=div)
                self.g.save()
        else:
            self.g = Team(team_name=team, conference=conf, division=div)
            self.g.save()

    def clear_table(self):
        for i in Team.objects.all():
            i.delete()
Пример #5
0
 def _add_to_db(self, team, conf, div, override):
     if not override:
         if not Team.objects.filter(
                 team_name=team, conference=conf, division=div).exists():
             self.g = Team(team_name=team, conference=conf, division=div)
             self.g.save()
     else:
         self.g = Team(team_name=team, conference=conf, division=div)
         self.g.save()
Пример #6
0
    def setUp(self) -> None:
        self.user = User.objects.create_user(username='******',
                                             email='*****@*****.**',
                                             password='******')
        self.user_profile = UserProfile()
        self.user_profile.user = self.user
        self.user_profile.save()

        self.team = Team(name='Kitchen', description='Cook stuff')
        self.team.save()
Пример #7
0
class TestTeamView(TestCase):
    def setUp(self) -> None:
        self.user = User.objects.create_user(username='******',
                                             email='*****@*****.**',
                                             password='******')
        self.user_profile = UserProfile()
        self.user_profile.user = self.user
        self.user_profile.save()

        self.team = Team(name='Kitchen', description='Cook stuff')
        self.team.save()
Пример #8
0
    def setUp(self):
        self.early_crew = Team(name='Early Crew',
                               description='Build stuff',
                               is_early_crew=True)
        self.early_crew.save()

        self.late_crew = Team(name='Late Crew',
                              description='Tear stuff down',
                              is_late_crew=True)
        self.late_crew.save()

        super(TestUserProfileChangeAttendingView, self).setUp()
Пример #9
0
    def setUp(self):
        self.early_crew = Team(name='Early Crew',
                               description='Build stuff',
                               is_early_crew=True)
        self.early_crew.save()

        self.late_crew = Team(name='Late Crew',
                              description='Tear stuff down',
                              is_late_crew=True)
        self.late_crew.save()

        super(TestUserProfileChangeAttendingView, self).setUp()
def db_init():
    # 建立小組
    for i in range(5):
        team = Team()
        db.session.add(team)
        db.session.commit()

    # 建立使用者
    for key, value in user_list.items():
        user = User(nickname=key, account=key, password=key, team_id=value)
        db.session.add(user)
        db.session.commit()

    # 小隊帳號
    for i in range(4):
        client = User(
            nickname=team_nickname_list[i], account=team_account_list[i],
            password=team_password_list[i], team_id=i+1)
        db.session.add(client)
        db.session.commit()

    # 建立 BanCard 資料
    for i in range(4):
        ban_card = BanCard()
        db.session.add(ban_card)
        db.session.commit()

    # 建立 Domain 資料
    for i in range(8):
        domain = Domain()
        db.session.add(domain)
        db.session.commit()
Пример #11
0
    def test_details(self):
        team = Team(name='Test Team',
                    description='This is a test.')
        team.save()

        alice = User.objects.create_user('alice', '*****@*****.**', 'passwd')
        alice.save()

        bob = User.objects.create_user('bob', '*****@*****.**', 'passwd')
        bob.save()

        alice_membership = TeamMembership(team=team, member=alice, is_lead=True)
        alice_membership.save()

        bob_membership = TeamMembership(team=team, member=bob)
        bob_membership.save()

        self.assertEqual(set(team.members.all()), {alice, bob})
        self.assertEqual(list(team.leads), [alice])
Пример #12
0
    def create_team(self, **kwargs):
        kwargs = merge_args(
            dict(region=Region.EU,
                 mode=Mode.TEAM_1V1,
                 season=self.season,
                 version=Version.HOTS,
                 league=League.GOLD,
                 member0=self.player,
                 member1=None,
                 member2=None,
                 member3=None,
                 race0=Race.ZERG,
                 race1=Race.UNKNOWN,
                 race2=Race.UNKNOWN,
                 race3=Race.UNKNOWN), **kwargs)

        self.team = Team(**kwargs)
        self.team.save()
        return self.team
Пример #13
0
def list(request: HttpRequest) -> HttpResponse:
    teams = Team.objects_ordered_by_remaining_space().all()
    my_team_ids = [team.id for team in request.user.teams.all()]
    return render(request,
                  'team/list.html',
                  context={
                      'profile': request.user.profile,
                      'my_team_ids': my_team_ids,
                      'teams': teams,
                  })
Пример #14
0
    def test_details(self):
        team = Team(name='Test Team', description='This is a test.')
        team.save()

        alice = User.objects.create_user('alice', '*****@*****.**', 'passwd')
        alice.save()

        bob = User.objects.create_user('bob', '*****@*****.**', 'passwd')
        bob.save()

        alice_membership = TeamMembership(team=team,
                                          member=alice,
                                          is_lead=True)
        alice_membership.save()

        bob_membership = TeamMembership(team=team, member=bob)
        bob_membership.save()

        self.assertEqual(set(team.members.all()), {alice, bob})
        self.assertEqual(list(team.leads), [alice])
Пример #15
0
def list_teams(request):
    action = request.POST.get('action')

    if action == 'create_team':
        regex = re.compile('[^a-zA-Z0-9]')
        name = regex.sub('', request.POST.get('name'))

        if len(name) > 0:
            team = Team(name=name, owner=request.user)
            team.save()

            teamuser = TeamUser(team=team, user=request.user)
            teamuser.save()

    if action == 'delete_team':
        team_id = request.POST.get('id')
        if team_id:
            team = Team.objects.get(id=team_id)
            if team and team.owner == request.user:
                team.delete()

    teams = Team.objects.filter(teamuser__user=request.user)
    context = {
        'teams': teams,
    }
    return render(request, 'teams/list.html', context)
Пример #16
0
    def setUp(self) -> None:
        self.user = User.objects.create_user(username='******',
                                             email='*****@*****.**',
                                             password='******')
        self.user_profile = UserProfile()
        self.user_profile.user = self.user
        self.user_profile.save()

        self.team = Team(name='Kitchen', description='Cook stuff.', max_size=2)
        self.team.save()

        self.membership = TeamMembership(team=self.team,
                                         member=self.user)
        self.membership.save()
Пример #17
0
    def post(self, request, **kwargs):
        """新建团队,同时调用融云接口为该团队创建一个对应的群聊

        :param kwargs:
            name: 团队名称
            description: 团队描述
            url: 团队链接
            province:
            city:
            county:
            fields: 团队领域,格式:'field1|field2'
            tags: 标签,格式:'tag1|tag2|tag3|...'
        :return: team_id: 团队id
        """
        name = kwargs.pop('name')
        fields = kwargs.pop('fields', None)
        tags = kwargs.pop('tags', None)

        # 昵称唯一性验证
        if Team.enabled.filter(name=name).count() != 0:
            abort(403, '团队名已被注册')
        # 昵称非法词验证
        if check_bad_words(name):
            abort(403, '团队名含非法词汇')

        team = Team(owner=request.user, name=name)
        team.save()

        for k in kwargs:
            setattr(team, k, kwargs[k])
        fields = fields.split('|')[:2] if fields is not None else ('', '')
        team.field1, team.field2 = fields[0].strip(), fields[1].strip()

        if tags:
            tags = tags.split('|')[:5]
            with transaction.atomic():
                team.tags.all().delete()
                order = 0
                for tag in tags:
                    tag = tag.strip()
                    if tag:
                        team.tags.create(name=tag, order=order)
                        order += 1
        team.save()

        action.create_team(request.user, team)
        request.user.score += get_score_stage(2)
        request.user.score_records.create(
            score=get_score_stage(2), type="能力", description="成功创建一个团队")
        request.user.save()
        return JsonResponse({'team_id': team.id})
Пример #18
0
class SignUpForm(forms.Form):
    first_name = forms.CharField(label="What's your first name, little dino?",
                                 max_length=30)
    last_name = forms.CharField(label="And your last name?", max_length=30)
    years_on_playa = forms.IntegerField(
        label=
        "Nice to meet you! So how many years have you gone to Burning Man?")
    interested_teams = forms.ModelMultipleChoiceField(
        label=
        'Which teams are you interested in joining? (you can always change it later)',
        widget=forms.CheckboxSelectMultiple,
        queryset=Team.objects_ordered_by_remaining_space().filter(
            num_members__lt=F('max_size')))
    invited_by = forms.CharField(label="Who invited you to LED Dinosaur?",
                                 max_length=64)
    email = forms.EmailField(
        label="Cool! What's your email so we can keep you up to date?")
    password = forms.CharField(label="And a password so we can identify you!",
                               widget=forms.PasswordInput,
                               min_length=8)
    duplicate_password = forms.CharField(
        label=" What was that password again? (in case you typo-ed)",
        widget=forms.PasswordInput,
        min_length=8)
    phone = forms.CharField(label="And your phone number, por favor?")
    zipcode = forms.CharField(label="Last one. What's your zip code?",
                              max_length=5,
                              min_length=5)
    captcha = ReCaptchaField(label='')

    def clean(self):
        super().clean()
        password = self.cleaned_data['password']
        duplicate_password = self.cleaned_data['duplicate_password']
        if password != duplicate_password:
            raise ValidationError('Passwords must match!')

    def clean_phone(self) -> str:
        return UserProfile.parse_phone_number(self.cleaned_data['phone'])
Пример #19
0
def define():
    if current_user.permission_lvl < 4:
        flash('You have no permission to do this action.')
        return redirect(url_for('req.index'))

    identifier = request.args.get('id')

    if identifier:
        form = RelationshipForm(begin=Team.query.filter_by(id=identifier).first().from_team,
                                end=Team.query.filter_by(id=identifier).first().to_team,
                                team_id=identifier)
    else:
        form = RelationshipForm()

    if form.validate_on_submit():
        if not identifier:  # This is an add operation
            to_add = Team(from_team=form.begin.data, to_team=form.end.data)
            db.session.add(to_add)
            db.session.commit()
            flash('Relationship successfully added.')
            return redirect(url_for('admin.admin'))

        else:  # This is an edit operation
            to_edit = Team.query.filter_by(id=identifier).first()

            if to_edit.from_team == form.begin.data and to_edit.to_team == form.end.data:
                flash('No change was made to the database.')
                return redirect(url_for('admin.admin'))

            to_edit.from_team = form.begin.data
            to_edit.to_team = form.end.data
            db.session.commit()
            flash('Relationship successfully edited.')
            return redirect(url_for('admin.admin'))

    return render_template('admin/define.html', title='Relationship Manager', form=form)
Пример #20
0
def createTeam(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect("/")

    if request.method == 'POST': # If the form has been submitted...
        form = TeamForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            theName = form.cleaned_data['teamName']
            aTeam = Team()
            aTeam.name = theName
            aTeam.dateCreated = datetime.datetime.utcnow().replace(tzinfo=utc)
            aTeam.active = True
            aTeam.save()
            return HttpResponseRedirect('/team/edit/' + aTeam.id.__str__() + '/') # Redirect after POST
    else:
        form = TeamForm() # An unbound form

    context = {
        'form': form,
    }

    return render(request, 'createTeam.html', context)
Пример #21
0
class TestUserProfileChangeAttendingView(TestUserProfileView):
    def setUp(self):
        self.early_crew = Team(name='Early Crew',
                               description='Build stuff',
                               is_early_crew=True)
        self.early_crew.save()

        self.late_crew = Team(name='Late Crew',
                              description='Tear stuff down',
                              is_late_crew=True)
        self.late_crew.save()

        super(TestUserProfileChangeAttendingView, self).setUp()

    def test_change_attending_view(self) -> None:
        self.client.login(username='******', password='******')
        expected_redirect_url = get_absolute_url_from_relative(
            reverse('user-profile-me'))
        response = self.client.post(reverse('changed-attending'), {
            'is-attending': 'on',
        },
                                    follow=True,
                                    secure=True)
        self.assertRedirects(response, expected_redirect_url)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(
            include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(
            len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

        response = self.client.post(reverse('changed-attending'), {
            'is-attending': 'off',
        },
                                    follow=True,
                                    secure=True)
        self.assertRedirects(response, expected_redirect_url)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(
            include_soft_deleted=True)
        self.assertTrue(attendance.deleted_at)
        self.assertEqual(
            len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

        response = self.client.post(reverse('changed-attending'), {
            'is-attending': 'on',
        },
                                    follow=True,
                                    secure=True)
        self.assertRedirects(response, expected_redirect_url)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(
            include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(
            len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

    def test_update_attendance_record(self) -> None:
        self.client.login(username='******', password='******')
        self.client.post(reverse('changed-attending'), {
            'is-attending': 'on',
        },
                         follow=True,
                         secure=True)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(
            include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(
            len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

        attendance_form = AttendanceProfileForm(
            {field: ''
             for field in AttendanceProfileForm.Meta.fields},
            instance=attendance)
        self.assertTrue(attendance_form.is_valid())
        data = {'is-attending': 'on'}
        data.update(attendance_form.data)
        self.client.post(reverse('changed-attending'),
                         data,
                         follow=True,
                         secure=True)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(
            include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(
            len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

    def test_update_attendance_record_early_crew(self) -> None:
        self.client.login(username='******', password='******')
        self.client.post(reverse('changed-attending'), {
            'is-attending': 'on',
        },
                         follow=True,
                         secure=True)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(
            include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(
            len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

        attendance_form = AttendanceProfileForm(
            {field: ''
             for field in AttendanceProfileForm.Meta.fields},
            instance=attendance)
        attendance_form.data['job_preferences'] = []
        attendance_form.data['arrival_date'] = 'wednesday1'
        self.assertTrue(attendance_form.is_valid())

        data = {'is-attending': 'on'}
        data.update(attendance_form.data)
        self.assertEqual(
            len(list(self.user_profile.user.attendanceprofile_set.all())), 1)
        self.client.post(reverse('changed-attending'),
                         data,
                         follow=True,
                         secure=True)
        self.assertEqual(
            len(list(self.user_profile.user.attendanceprofile_set.all())), 1)
        early_crew = self.user_profile.user.teams.filter(
            pk=self.early_crew.pk).first()
        self.assertIsNotNone(early_crew)

        attendance_form.data['arrival_date'] = 'sunday'
        self.assertTrue(attendance_form.is_valid())

        data.update(attendance_form.data)
        self.client.post(reverse('changed-attending'),
                         data,
                         follow=True,
                         secure=True)
        early_crew = self.user_profile.user.teams.filter(
            pk=self.early_crew.pk).first()
        self.assertIsNone(early_crew)

    def test_update_attendance_record_late_crew(self) -> None:
        self.client.login(username='******', password='******')
        self.client.post(reverse('changed-attending'), {
            'is-attending': 'on',
        },
                         follow=True,
                         secure=True)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(
            include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(
            len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

        attendance_form = AttendanceProfileForm(
            {field: ''
             for field in AttendanceProfileForm.Meta.fields},
            instance=attendance)
        attendance_form.data['job_preferences'] = []
        attendance_form.data['departure_date'] = 'monday'
        self.assertTrue(attendance_form.is_valid())

        data = {'is-attending': 'on'}
        data.update(attendance_form.data)
        self.assertEqual(
            len(list(self.user_profile.user.attendanceprofile_set.all())), 1)
        self.client.post(reverse('changed-attending'),
                         data,
                         follow=True,
                         secure=True)
        self.assertEqual(
            len(list(self.user_profile.user.attendanceprofile_set.all())), 1)
        late_crew = self.user_profile.user.teams.filter(
            pk=self.late_crew.pk).first()
        self.assertIsNotNone(late_crew)

        attendance_form.data['departure_date'] = 'sunday'
        self.assertTrue(attendance_form.is_valid())

        data.update(attendance_form.data)
        self.client.post(reverse('changed-attending'),
                         data,
                         follow=True,
                         secure=True)
        late_crew = self.user_profile.user.teams.filter(
            pk=self.late_crew.pk).first()
        self.assertIsNone(late_crew)
Пример #22
0
def handle_win(number, sections, loser_submit=False):
    # check that both players exist in system
    winner = get_object(Player, phone_number=number)
    if not winner:
        return HttpResponse(createSmsResponse("Join Undisputed first"))

    loser_username = sections[1]
    loser = get_object(Player, username=loser_username)
    if not loser:
        return HttpResponse(createSmsResponse(loser_username + " does not exist. Please try again."))


    # check if the result is just a competition
    competition_name = sections[-1]
    league = get_object(League, shorthand_name=competition_name)
    if not league:
        league = get_object(League, name=competition_name)

    # if this flag is true, swap
    if loser_submit:
        temp = winner
        winner = loser
        loser = temp

    teams = Team.objects.filter(league=league)

    # check that message was not malformed
    if len(sections) != 4:
        return HttpResponse(createSmsResponse('multiperson teams and multiword competitions not implemented yet'))

    # search for existing teams
    winning_team = get_object(Team, name=winner.username)
    losing_team = get_object(Team, name=loser.username)

    if not winning_team:
        new_team = Team(league=league,rating=2000,ranking=100, name=winner.username)
        new_team.members = winner
        new_team.name = winner.username
        new_team.save()
        winning_team = new_team

    # search for the loser's team

    if not losing_team:
        new_l_team = Team(league=league,rating=2000, ranking=100)
        new_l_team.members = loser
        new_l_team.name = loser.username
        new_l_team.save()
        losing_team = new_l_team

    # save the result
    #Todo- add teams to results
    new_result = Result.objects.create(league=league,time=datetime.now(),winner=winning_team,loser=losing_team)

    # use Elo's algorithm to calculate the new ratings
    calculate_elo_update(winning_team, losing_team)

    # update each team's streaks
    winning_team.update_streak(True)
    losing_team.update_streak(False)

    # use the new ratings to calculate new rankings
    teams = Team.objects.filter(league=league).order_by("rating").all().reverse()
    rank = 1
    for team in teams:
        team.ranking = rank
        team.save()
        rank += 1


    winning_team = Team.objects.get(name=winner.username)
    losing_team = Team.objects.get(name=loser.username)

    NOTIFICATIONS = True

    loser_string = "You were defeated by %s in %s. Your new rating is %s and you are ranked %s" % (winner.username.upper(), league.name, int(losing_team.rating), losing_team.ranking)
    winner_string =  "Congrats on beating %s! Your new rating is %s and you are ranked #%s in %s. A notification was sent to %s." % (loser.username.upper(), int(winning_team.rating), int(winning_team.ranking), winning_team.league.name, loser.username.upper())

    if loser_submit:
        to_msg = winner_string
        return_msg = loser_string
        to_phone_number = winner.phone_number
    else:
        to_msg = loser_string
        return_msg = winner_string
        to_phone_number = loser.phone_number

    if competition_name == "ksfifa":
        TWILIO_NUMBER = "+19786730440"
    elif competition_name == "kspingpong":
        TWILIO_NUMBER = "+14793163917"

    if NOTIFICATIONS:
        client.sms.messages.create(
            to=str(to_phone_number),
            from_=TWILIO_NUMBER,
            body=to_msg)

    return HttpResponse(
        createSmsResponse(return_msg
           ))
Пример #23
0
class Db(object):
    """ Helper class to create test data in db. """
    def __init__(self):
        self.db_name = connection.settings_dict['NAME']
        print(self.db_name)
        self.team = None
        self.cache = None
        self.player = None
        self.season = None
        self.ladder = None
        self.ranking = None
        self.ranking_data = None
        self.default_ranking_data__data = {}
        self.clear_defaults()

    def clear_defaults(self):
        self.default_ranking_data__data = {}

    @staticmethod
    def filter(klass, *args, **kwargs):
        return klass.objects.filter(*args, **kwargs)

    @staticmethod
    def count(klass, *args, **kwargs):
        return klass.objects.filter(*args, **kwargs).count()

    @staticmethod
    def get(klass, *args, **kwargs):
        return klass.objects.get(*args, **kwargs)

    @staticmethod
    def objects(klass):
        return klass.objects

    @staticmethod
    def all(klass):
        return klass.objects.all()

    @staticmethod
    def execute(sql):
        cursor = connection.cursor()
        cursor.execute(sql)
        return cursor

    def delete_all(self, keep=None, delete=None):
        for d in (delete or [
                RankingData, RankingStats, Cache, Ranking, Team, Player,
                Ladder, Season
        ]):
            if d not in (keep or []):
                if d == Ranking:
                    cursor = connection.cursor()
                    cursor.execute("update cache set ranking_id = NULL")
                if d == Ladder:
                    cursor = connection.cursor()
                    cursor.execute("update cache set ladder_id = NULL")
                self.all(d).delete()

    def create_season(self, **kwargs):
        kwargs = merge_args(
            {
                'id': 16,
                'start_date': '2013-11-11',
                'end_date': '2014-01-03',
                'name': '2013 Season 6',
                'year': 2013,
                'number': 6,
                'version': Version.HOTS
            }, **kwargs)
        try:
            self.get(Season, id=kwargs['id'])
            raise AssertionError("Season with id %d already exists." %
                                 kwargs['id'])
        except Season.DoesNotExist:
            pass
        self.season = Season(**kwargs)
        self.season.save()
        return self.season

    def create_cache(self, type=Cache.LADDER, members=None, **kwargs):
        data = kwargs.pop('data', None)
        if data is None and members is not None:
            data = gen_ladder_data(members)

        kwargs = merge_args(
            {
                'bid': randint(1, 1e6),
                'url': 'http://bnet/' + uniqueid(10),
                'type': type,
                'region': Region.EU,
                'created': utcnow(),
                'updated': utcnow(),
                'status': 200,
                'retry_count': 0
            }, **kwargs)
        kwargs['data'] = json.dumps(data)

        self.cache = Cache(**kwargs)
        self.cache.save()
        return self.cache

    def create_ladder(self, **kwargs):
        kwargs = merge_args(
            {
                'bid': 1,
                'region': Region.EU,
                'strangeness': Ladder.GOOD,
                'league': League.GOLD,
                'tier': 0,
                'version': Version.HOTS,
                'mode': Mode.TEAM_1V1,
                'season': self.season,
                'first_join': utcnow(),
                'last_join': utcnow(),
                'created': utcnow(),
                'updated': utcnow(),
                'max_points': 20
            }, **kwargs)

        self.ladder = Ladder(**kwargs)
        self.ladder.save()
        return self.ladder

    def create_player(self, **kwargs):
        kwargs = merge_args(
            {
                'bid': randint(0, 1e9),
                'region': Region.EU,
                'realm': 1,
                'mode': Mode.TEAM_1V1,
                'season': self.season,
                'race': Race.ZERG,
                'name': uniqueid(12),
                'clan': uniqueid(32),
                'tag': uniqueid(6)
            }, **kwargs)
        self.player = Player(**kwargs)
        self.player.save()
        return self.player

    def create_team(self, **kwargs):
        kwargs = merge_args(
            dict(region=Region.EU,
                 mode=Mode.TEAM_1V1,
                 season=self.season,
                 version=Version.HOTS,
                 league=League.GOLD,
                 member0=self.player,
                 member1=None,
                 member2=None,
                 member3=None,
                 race0=Race.ZERG,
                 race1=Race.UNKNOWN,
                 race2=Race.UNKNOWN,
                 race3=Race.UNKNOWN), **kwargs)

        self.team = Team(**kwargs)
        self.team.save()
        return self.team

    def create_teams(self, count=1, **kwargs):
        teams = []
        for i in range(count):
            self.create_player(name="%s-%d" % (uniqueid(8), i))
            teams.append(self.create_team(**kwargs))
        return teams

    def get_teams_by_member0_bids(self, *bids, mode=Mode.TEAM_1V1):
        tids = []
        for bid in bids:
            p = self.get(Player, bid=bid)
            tids.append(self.get(Team, member0=p, mode=mode).id)
        return tids

    def create_ranking(self, **kwargs):
        kwargs = merge_args(
            dict(created=utcnow(),
                 data_time=utcnow(),
                 min_data_time=utcnow(),
                 max_data_time=utcnow(),
                 status=Ranking.COMPLETE_WITH_DATA,
                 season=self.season), **kwargs)

        self.ranking = Ranking.objects.create(**kwargs)
        return self.ranking

    def _default_team_rank(self, team_rank):
        """ Update a team_rank dict with defaults. """
        for k, v in self.default_ranking_data__data.items():
            team_rank.setdefault(k, v)
        team_rank.setdefault("team_id", self.team.id)
        team_rank.setdefault("data_time", to_unix(self.ranking.data_time))
        team_rank.setdefault("version", Version.HOTS)
        team_rank.setdefault("region", Region.EU)
        team_rank.setdefault("mode", Mode.TEAM_1V1)
        team_rank.setdefault("league", League.GOLD)
        team_rank.setdefault("tier", 0)
        team_rank.setdefault("ladder_id", self.ladder.id)
        team_rank.setdefault("join_time", to_unix(self.ranking.data_time))
        team_rank.setdefault("source_id", self.cache.id)
        team_rank.setdefault("mmr", 1000)
        team_rank.setdefault("points", 100.0)
        team_rank.setdefault("wins", 10)
        team_rank.setdefault("losses", 10)
        team_rank.setdefault("race0", Race.ZERG)
        team_rank.setdefault("race1", Race.UNKNOWN)
        team_rank.setdefault("race2", Race.UNKNOWN)
        team_rank.setdefault("race3", Race.UNKNOWN)
        team_rank.setdefault("ladder_rank", 1)
        team_rank.setdefault("ladder_count", 1)
        team_rank.setdefault("league_rank", 1)
        team_rank.setdefault("league_count", 1)
        team_rank.setdefault("region_rank", 1)
        team_rank.setdefault("region_count", 1)
        team_rank.setdefault("world_rank", 1)
        team_rank.setdefault("world_count", 1)

    def create_ranking_data(self, raw=True, **kwargs):
        kwargs = merge_args(dict(ranking=self.ranking, updated=utcnow()),
                            kwargs)
        data = kwargs.pop('data', [])
        ranking = kwargs['ranking']

        for team_rank in data:
            self._default_team_rank(team_rank)
            ranking.sources.add(self.get(Cache, pk=team_rank['source_id']))

        self.ranking_data = RankingData.objects.create(**kwargs)
        sc2.save_ranking_data_raw(self.db_name, ranking.id, 0, data, True)
        if not raw:
            cpp = sc2.RankingData(self.db_name, Enums.INFO)
            cpp.load(ranking.id)
            cpp.save_data(ranking.id, ranking.season_id, to_unix(utcnow()))
            cpp.release()

        return self.ranking_data

    def update_ranking_stats(self, ranking_id=None):
        """ Will build ranking stats based of the ranking by calling c++. """
        if ranking_id is None: ranking_id = self.ranking.id
        cpp = sc2.RankingData(self.db_name, Enums.INFO)
        cpp.load(ranking_id)
        cpp.save_stats(ranking_id, to_unix(utcnow()))
        cpp.release()
 def save_teams(self, teams):
     print('Saving teams found')
     self.teams = Team.objects.bulk_create([Team(**team) for team in teams])
Пример #25
0
def form_teams_view(request, spaceurl):
    member = get_user(request)
    space = Space.objects.get(url=spaceurl)
    msg = ""
    user_preferences = ""
    if member.username != space.teacher:
        return redirect('/profile_redirect/')
    setup_data = ""
    if request.method == 'POST':
        group_size_raw = request.POST.get('Group_Options', None)
        iterative_soulmates_raw = '1'
        algorithm_index_raw = request.POST.get('optradio', None)
        alpha_raw = request.POST.get('alpha')
        alpha_adjusted = float(alpha_raw) * 1000000
        alpha_adjusted = int(alpha_adjusted)
        theta_raw = request.POST.get('theta')
        theta_adjusted = float(theta_raw) * 100
        theta_adjusted = int(theta_adjusted)
        members = space.member_set.exclude(name='Account in Progress')
        number_members = members.count()

        setup_data = str(number_members) + " " + group_size_raw + " " + iterative_soulmates_raw + " " \
                     + algorithm_index_raw + " " + str(alpha_adjusted) + " " + str(theta_adjusted)

        # get input in format to store in team model
        algorithm_index = int(algorithm_index_raw)
        iterative_soulmates = iterative_soulmates_raw == "1"
        group_size = int(group_size_raw)

        # Assigns each member a rank and sets up easy lookup between usernames and rankings
        rank_to_user_dict = {}
        user_to_rank_dict = {}
        random_array = random.sample(range(0, members.count()),
                                     members.count())
        count = 0
        for member in members:
            rank = random_array[count]
            rank_to_user_dict[rank] = member.username
            user_to_rank_dict[member.username] = rank
            count += 1

        # Gets member preferences ready for the java program
        user_preferences = ""
        for member in members:
            member_data = member.username + " " + str(
                user_to_rank_dict[member.username]) + " "
            wants_any_team = False
            if Preferences.objects.filter(member=member, space=space).exists():
                finished = False
                pref_data = ""
                preferences = Preferences.objects.get(member=member,
                                                      space=space)
                preferenceArray = preferences.members_ranking.split(' ')
                for preference in preferenceArray:
                    if preference == "@myself@":
                        finished = True
                    elif preferences == "@team@":
                        wants_any_team = True
                    if preference in user_to_rank_dict and not finished:
                        pref_data += str(user_to_rank_dict[preference]) + " "
                if wants_any_team:
                    pref_data = "team " + pref_data
                else:
                    pref_data = "alone " + pref_data
                member_data += " " + pref_data
            else:
                member_data += "alone "
            user_preferences += member_data

        # Runs the team formation algorithms by passing in setup data and preference data to the Java executable
        p = Popen([
            'java', '-jar', 'JavaCode/TeamFormationAlgorithms.jar', setup_data,
            user_preferences
        ],
                  stdout=PIPE,
                  stderr=STDOUT)

        # Adds teams to the database by parsing the console output of the Java executable
        master_team = MasterTeam(space=space,
                                 iterative_soulmates=iterative_soulmates,
                                 number_of_members=group_size,
                                 algorithm_index=algorithm_index)
        master_team.save()
        space.teams_decided = False
        space.save()

        for raw_line in p.stdout:
            line = raw_line.decode("utf-8")
            if line[0:2] == 'T:':
                teammates = line[3:]
                user_list = teammates.split(" ")
                team = Team(space=space, master=master_team)
                team.save()
                for username in user_list:
                    if Member.objects.filter(username=username).exists():
                        user = Member.objects.get(username=username)
                        user.teams.add(team)
                        user.save()
                team.save()
            if line[0:2] == 'S:':
                solo_names = line[3:]
                solo_list = solo_names.split(" ")
                for username in solo_list:
                    if not username == '':
                        user = Member.objects.get(username=username)
                        team = Team(space=space, master=master_team)
                        team.save()
                        user.teams.add(team)
        master_team.save()

        return redirect("/choose_teams/" + space.url + "/")

    return render(
        request, "TeamFormation.html", {
            'member': member,
            'msg': "\"" + setup_data + "\" \"" + user_preferences + "\""
        })
Пример #26
0
class TestUserProfileChangeAttendingView(TestUserProfileView):
    def setUp(self):
        self.early_crew = Team(name='Early Crew',
                               description='Build stuff',
                               is_early_crew=True)
        self.early_crew.save()

        self.late_crew = Team(name='Late Crew',
                              description='Tear stuff down',
                              is_late_crew=True)
        self.late_crew.save()

        super(TestUserProfileChangeAttendingView, self).setUp()

    def test_change_attending_view(self) -> None:
        self.client.login(username='******', password='******')
        expected_redirect_url = get_absolute_url_from_relative(reverse('user-profile-me'))
        response = self.client.post(reverse('changed-attending'), {
            'is-attending': 'on',
        }, follow=True, secure=True)
        self.assertRedirects(response, expected_redirect_url)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

        response = self.client.post(reverse('changed-attending'), {
            'is-attending': 'off',
        }, follow=True, secure=True)
        self.assertRedirects(response, expected_redirect_url)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(include_soft_deleted=True)
        self.assertTrue(attendance.deleted_at)
        self.assertEqual(len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

        response = self.client.post(reverse('changed-attending'), {
            'is-attending': 'on',
        }, follow=True, secure=True)
        self.assertRedirects(response, expected_redirect_url)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

    def test_update_attendance_record(self) -> None:
        self.client.login(username='******', password='******')
        self.client.post(reverse('changed-attending'), {
            'is-attending': 'on',
        }, follow=True, secure=True)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

        attendance_form = AttendanceProfileForm({
            field: '' for field in AttendanceProfileForm.Meta.fields
        }, instance=attendance)
        self.assertTrue(attendance_form.is_valid())
        data = {'is-attending': 'on'}
        data.update(attendance_form.data)
        self.client.post(reverse('changed-attending'), data, follow=True, secure=True)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

    def test_update_attendance_record_early_crew(self) -> None:
        self.client.login(username='******', password='******')
        self.client.post(reverse('changed-attending'), {
            'is-attending': 'on',
        }, follow=True, secure=True)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

        attendance_form = AttendanceProfileForm({
            field: '' for field in AttendanceProfileForm.Meta.fields
        }, instance=attendance)
        attendance_form.data['job_preferences'] = []
        attendance_form.data['arrival_date'] = 'wednesday1'
        self.assertTrue(attendance_form.is_valid())

        data = {'is-attending': 'on'}
        data.update(attendance_form.data)
        self.assertEqual(len(list(self.user_profile.user.attendanceprofile_set.all())), 1)
        self.client.post(reverse('changed-attending'), data, follow=True, secure=True)
        self.assertEqual(len(list(self.user_profile.user.attendanceprofile_set.all())), 1)
        early_crew = self.user_profile.user.teams.filter(pk=self.early_crew.pk).first()
        self.assertIsNotNone(early_crew)

        attendance_form.data['arrival_date'] = 'sunday'
        self.assertTrue(attendance_form.is_valid())

        data.update(attendance_form.data)
        self.client.post(reverse('changed-attending'), data, follow=True, secure=True)
        early_crew = self.user_profile.user.teams.filter(pk=self.early_crew.pk).first()
        self.assertIsNone(early_crew)

    def test_update_attendance_record_late_crew(self) -> None:
        self.client.login(username='******', password='******')
        self.client.post(reverse('changed-attending'), {
            'is-attending': 'on',
        }, follow=True, secure=True)
        self.user_profile.refresh_from_db()
        attendance = self.user_profile.try_fetch_current_attendance(include_soft_deleted=True)
        self.assertIsNotNone(attendance)
        self.assertFalse(attendance.deleted_at)
        self.assertEqual(len(list(self.user_profile.user.attendanceprofile_set.all())), 1)

        attendance_form = AttendanceProfileForm({
            field: '' for field in AttendanceProfileForm.Meta.fields
        }, instance=attendance)
        attendance_form.data['job_preferences'] = []
        attendance_form.data['departure_date'] = 'monday'
        self.assertTrue(attendance_form.is_valid())

        data = {'is-attending': 'on'}
        data.update(attendance_form.data)
        self.assertEqual(len(list(self.user_profile.user.attendanceprofile_set.all())), 1)
        self.client.post(reverse('changed-attending'), data, follow=True, secure=True)
        self.assertEqual(len(list(self.user_profile.user.attendanceprofile_set.all())), 1)
        late_crew = self.user_profile.user.teams.filter(pk=self.late_crew.pk).first()
        self.assertIsNotNone(late_crew)

        attendance_form.data['departure_date'] = 'sunday'
        self.assertTrue(attendance_form.is_valid())

        data.update(attendance_form.data)
        self.client.post(reverse('changed-attending'), data, follow=True, secure=True)
        late_crew = self.user_profile.user.teams.filter(pk=self.late_crew.pk).first()
        self.assertIsNone(late_crew)