Merge branch 'feature/teamusers' into develop
This commit is contained in:
@@ -336,10 +336,15 @@ class TeamInvite(models.Model):
|
|||||||
|
|
||||||
class TeamInviteForm(ModelForm):
|
class TeamInviteForm(ModelForm):
|
||||||
user = UserFullnameChoiceField(queryset=User.objects.all(),required=False)
|
user = UserFullnameChoiceField(queryset=User.objects.all(),required=False)
|
||||||
|
email = forms.EmailField(required=False)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = TeamInvite
|
model = TeamInvite
|
||||||
fields = ['user','email']
|
fields = ['user','email']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TeamRequest(models.Model):
|
class TeamRequest(models.Model):
|
||||||
team = models.ForeignKey(Team)
|
team = models.ForeignKey(Team)
|
||||||
user = models.ForeignKey(User,null=True)
|
user = models.ForeignKey(User,null=True)
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ def create_invite(team,manager,user=None,email=''):
|
|||||||
if user:
|
if user:
|
||||||
try:
|
try:
|
||||||
r2 = Rower.objects.get(user=user)
|
r2 = Rower.objects.get(user=user)
|
||||||
|
email = r2.user.email
|
||||||
except Rower.DoesNotExist:
|
except Rower.DoesNotExist:
|
||||||
return (0,'Rower does not exist')
|
return (0,'Rower does not exist')
|
||||||
if r2 in Rower.objects.filter(team=team):
|
if r2 in Rower.objects.filter(team=team):
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
{% for member in members %}
|
{% for member in members %}
|
||||||
<tr>
|
<tr>
|
||||||
{% if team.manager == user %}
|
{% if team.manager == user %}
|
||||||
<td><a href="/rowers/me/edit/{{ member.id }}/"> {{ member.user.first_name }} {{ member.user.last_name }}</a></td>
|
<td><a href="/rowers/me/preferences/{{ member.id }}/"> {{ member.user.first_name }} {{ member.user.last_name }}</a></td>
|
||||||
<td><a class="button red small" href="/rowers/me/team/{{ team.id }}/drop/{{ member.user.id }}/">Drop</a></td>
|
<td><a class="button red small" href="/rowers/me/team/{{ team.id }}/drop/{{ member.user.id }}/">Drop</a></td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td>{{ member.user.first_name }} {{ member.user.last_name }}</td>
|
<td>{{ member.user.first_name }} {{ member.user.last_name }}</td>
|
||||||
|
|||||||
@@ -19,3 +19,5 @@ pkg_mox = None
|
|||||||
# pkg_mox.UnsetStubs()
|
# pkg_mox.UnsetStubs()
|
||||||
|
|
||||||
#from tests import *
|
#from tests import *
|
||||||
|
|
||||||
|
#from __future__ import print_function
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
|
pytestmark = pytest.mark.django_db
|
||||||
|
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
import re
|
||||||
|
from nose_parameterized import parameterized
|
||||||
|
from django.test import TestCase, Client,override_settings, RequestFactory
|
||||||
|
|
||||||
|
from django.core.management import call_command
|
||||||
|
from django.utils.six import StringIO
|
||||||
|
from django.test.client import RequestFactory
|
||||||
|
from rowers.views import checkworkoutuser,c2_open, multi_compare_view
|
||||||
|
|
||||||
|
from rowers.forms import (
|
||||||
|
DocumentsForm,CNsummaryForm,RegistrationFormUniqueEmail,
|
||||||
|
ChartParamChoiceForm,WorkoutMultipleCompareForm,
|
||||||
|
BoxPlotChoiceForm)
|
||||||
|
import rowers.plots as plots
|
||||||
|
import rowers.interactiveplots as iplots
|
||||||
|
import datetime
|
||||||
|
from rowingdata import rowingdata as rdata
|
||||||
|
from rowingdata import rower as rrower
|
||||||
|
from django.utils import timezone
|
||||||
|
from rowers.rows import handle_uploaded_file
|
||||||
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||||
|
from time import strftime,strptime,mktime,time,daylight
|
||||||
|
import os
|
||||||
|
from rowers.tasks import handle_makeplot
|
||||||
|
from rowers.utils import serialize_list,deserialize_list
|
||||||
|
from rowers.utils import NoTokenError
|
||||||
|
from rowers.plannedsessions import get_dates_timeperiod
|
||||||
|
from shutil import copyfile
|
||||||
|
from nose.tools import assert_true
|
||||||
|
from mock import Mock, patch
|
||||||
|
from minimocktest import MockTestCase
|
||||||
|
import pandas as pd
|
||||||
|
import rowers.c2stuff as c2stuff
|
||||||
|
|
||||||
|
import json
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from rowers import urls
|
||||||
|
from rowers.views import (
|
||||||
|
error500_view,error404_view,error400_view,error403_view
|
||||||
|
)
|
||||||
|
|
||||||
|
from rowers.dataprep import delete_strokedata
|
||||||
|
from django.contrib.sessions.middleware import SessionMiddleware
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from importlib import import_module
|
||||||
|
|
||||||
|
from redis import StrictRedis
|
||||||
|
redis_connection = StrictRedis()
|
||||||
|
|
||||||
|
from django_mailbox.models import Mailbox,MessageAttachment,Message
|
||||||
|
|
||||||
|
from rowers.tests.mocks import *
|
||||||
|
|
||||||
|
from rowers.models import *
|
||||||
|
from rowers.forms import *
|
||||||
|
from rowers.tests.mocks import *
|
||||||
|
import factory
|
||||||
|
from faker import Factory
|
||||||
|
|
||||||
|
faker = Factory.create()
|
||||||
|
|
||||||
|
|
||||||
@@ -1,66 +1,4 @@
|
|||||||
#from __future__ import print_function
|
from statements import *
|
||||||
import pytest
|
|
||||||
|
|
||||||
pytestmark = pytest.mark.django_db
|
|
||||||
|
|
||||||
from bs4 import BeautifulSoup
|
|
||||||
import re
|
|
||||||
from nose_parameterized import parameterized
|
|
||||||
from django.test import TestCase, Client,override_settings, RequestFactory
|
|
||||||
|
|
||||||
from django.core.management import call_command
|
|
||||||
from django.utils.six import StringIO
|
|
||||||
from django.test.client import RequestFactory
|
|
||||||
from rowers.views import checkworkoutuser,c2_open, multi_compare_view
|
|
||||||
|
|
||||||
from rowers.forms import (
|
|
||||||
DocumentsForm,CNsummaryForm,RegistrationFormUniqueEmail,
|
|
||||||
ChartParamChoiceForm,WorkoutMultipleCompareForm,
|
|
||||||
BoxPlotChoiceForm, CourseForm)
|
|
||||||
import rowers.plots as plots
|
|
||||||
import rowers.interactiveplots as iplots
|
|
||||||
import datetime
|
|
||||||
from rowingdata import rowingdata as rdata
|
|
||||||
from rowingdata import rower as rrower
|
|
||||||
from django.utils import timezone
|
|
||||||
from rowers.rows import handle_uploaded_file
|
|
||||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
||||||
from time import strftime,strptime,mktime,time,daylight
|
|
||||||
import os
|
|
||||||
from rowers.tasks import handle_makeplot
|
|
||||||
from rowers.utils import serialize_list,deserialize_list
|
|
||||||
from rowers.utils import NoTokenError
|
|
||||||
from rowers.plannedsessions import get_dates_timeperiod
|
|
||||||
from shutil import copyfile
|
|
||||||
from nose.tools import assert_true
|
|
||||||
from mock import Mock, patch
|
|
||||||
from minimocktest import MockTestCase
|
|
||||||
import pandas as pd
|
|
||||||
import rowers.c2stuff as c2stuff
|
|
||||||
|
|
||||||
import json
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
from rowers import urls
|
|
||||||
from rowers.views import (
|
|
||||||
error500_view,error404_view,error400_view,error403_view
|
|
||||||
)
|
|
||||||
|
|
||||||
from rowers.dataprep import delete_strokedata
|
|
||||||
from django.contrib.sessions.middleware import SessionMiddleware
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from importlib import import_module
|
|
||||||
|
|
||||||
from redis import StrictRedis
|
|
||||||
redis_connection = StrictRedis()
|
|
||||||
|
|
||||||
from django_mailbox.models import Mailbox,MessageAttachment,Message
|
|
||||||
|
|
||||||
from rowers.tests.mocks import *
|
|
||||||
|
|
||||||
from rowers.models import *
|
|
||||||
from rowers.tests.mocks import *
|
|
||||||
|
|
||||||
class CoursesTest(TestCase):
|
class CoursesTest(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@@ -1,70 +1,4 @@
|
|||||||
#from __future__ import print_function
|
from statements import *
|
||||||
import pytest
|
|
||||||
|
|
||||||
pytestmark = pytest.mark.django_db
|
|
||||||
|
|
||||||
from bs4 import BeautifulSoup
|
|
||||||
import re
|
|
||||||
from nose_parameterized import parameterized
|
|
||||||
from django.test import TestCase, Client,override_settings, RequestFactory
|
|
||||||
|
|
||||||
from django.core.management import call_command
|
|
||||||
from django.utils.six import StringIO
|
|
||||||
from django.test.client import RequestFactory
|
|
||||||
from rowers.views import checkworkoutuser,c2_open, multi_compare_view
|
|
||||||
|
|
||||||
from rowers.forms import (
|
|
||||||
DocumentsForm,CNsummaryForm,RegistrationFormUniqueEmail,
|
|
||||||
ChartParamChoiceForm,WorkoutMultipleCompareForm,
|
|
||||||
BoxPlotChoiceForm)
|
|
||||||
import rowers.plots as plots
|
|
||||||
import rowers.interactiveplots as iplots
|
|
||||||
import datetime
|
|
||||||
from rowingdata import rowingdata as rdata
|
|
||||||
from rowingdata import rower as rrower
|
|
||||||
from django.utils import timezone
|
|
||||||
from rowers.rows import handle_uploaded_file
|
|
||||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
||||||
from time import strftime,strptime,mktime,time,daylight
|
|
||||||
import os
|
|
||||||
from rowers.tasks import handle_makeplot
|
|
||||||
from rowers.utils import serialize_list,deserialize_list
|
|
||||||
from rowers.utils import NoTokenError
|
|
||||||
from rowers.plannedsessions import get_dates_timeperiod
|
|
||||||
from shutil import copyfile
|
|
||||||
from nose.tools import assert_true
|
|
||||||
from mock import Mock, patch
|
|
||||||
from minimocktest import MockTestCase
|
|
||||||
import pandas as pd
|
|
||||||
import rowers.c2stuff as c2stuff
|
|
||||||
|
|
||||||
import json
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
from rowers import urls
|
|
||||||
from rowers.views import (
|
|
||||||
error500_view,error404_view,error400_view,error403_view
|
|
||||||
)
|
|
||||||
|
|
||||||
from rowers.dataprep import delete_strokedata
|
|
||||||
from django.contrib.sessions.middleware import SessionMiddleware
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from importlib import import_module
|
|
||||||
|
|
||||||
from redis import StrictRedis
|
|
||||||
redis_connection = StrictRedis()
|
|
||||||
|
|
||||||
from django_mailbox.models import Mailbox,MessageAttachment,Message
|
|
||||||
|
|
||||||
from rowers.tests.mocks import *
|
|
||||||
|
|
||||||
from rowers.models import *
|
|
||||||
from rowers.tests.mocks import *
|
|
||||||
import factory
|
|
||||||
from faker import Factory
|
|
||||||
|
|
||||||
faker = Factory.create()
|
|
||||||
|
|
||||||
filename = 'rowers/tests/testdata/testdata.csv'
|
filename = 'rowers/tests/testdata/testdata.csv'
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,209 @@
|
|||||||
|
from statements import *
|
||||||
|
|
||||||
|
nu = datetime.datetime.now()
|
||||||
|
|
||||||
|
filename = 'rowers/tests/testdata/testdata.csv'
|
||||||
|
|
||||||
|
row = rdata(filename)
|
||||||
|
totaldist = row.df['cum_dist'].max()
|
||||||
|
totaltime = row.df['TimeStamp (sec)'].max()-row.df['TimeStamp (sec)'].min()
|
||||||
|
totaltime = totaltime+row.df.ix[0,' ElapsedTime (sec)']
|
||||||
|
|
||||||
|
|
||||||
|
hours = int(totaltime/3600.)
|
||||||
|
minutes = int((totaltime - 3600.*hours)/60.)
|
||||||
|
seconds = int(totaltime - 3600.*hours - 60.*minutes)
|
||||||
|
tenths = int(10*(totaltime - 3600.*hours - 60.*minutes - seconds))
|
||||||
|
|
||||||
|
duration = "%s:%s:%s.%s" % (hours,minutes,seconds,tenths)
|
||||||
|
duration = datetime.time(hour=hours,minute=minutes,second=seconds)
|
||||||
|
|
||||||
|
workoutdate = row.rowdatetime.strftime('%Y-%m-%d')
|
||||||
|
workoutstarttime = row.rowdatetime.strftime('%H:%M:%S')
|
||||||
|
|
||||||
|
from rowers.teams import *
|
||||||
|
|
||||||
|
class UserFactory(factory.DjangoModelFactory):
|
||||||
|
class Meta:
|
||||||
|
model = User
|
||||||
|
|
||||||
|
email = faker.email()
|
||||||
|
username = faker.profile()['username']
|
||||||
|
|
||||||
|
first_name = faker.name().split(' ')[0]
|
||||||
|
last_name = faker.name().split(' ')[0]
|
||||||
|
|
||||||
|
class WorkoutFactory(factory.DjangoModelFactory):
|
||||||
|
class Meta:
|
||||||
|
model = Workout
|
||||||
|
|
||||||
|
name = factory.LazyAttribute(lambda _: faker.word())
|
||||||
|
notes = faker.text()
|
||||||
|
startdatetime = row.rowdatetime
|
||||||
|
starttime = workoutstarttime
|
||||||
|
workouttype='water'
|
||||||
|
date=timezone.now().date()
|
||||||
|
duration=duration
|
||||||
|
distance=totaldist
|
||||||
|
csvfilename=filename
|
||||||
|
|
||||||
|
class SessionFactory(factory.DjangoModelFactory):
|
||||||
|
class Meta:
|
||||||
|
model = PlannedSession
|
||||||
|
|
||||||
|
name = factory.LazyAttribute(lambda _: faker.word())
|
||||||
|
comment = faker.text()
|
||||||
|
|
||||||
|
class TeamFactory(factory.DjangoModelFactory):
|
||||||
|
class Meta:
|
||||||
|
model = Team
|
||||||
|
|
||||||
|
name = factory.LazyAttribute(lambda _: faker.word())
|
||||||
|
notes = faker.text()
|
||||||
|
private = 'open'
|
||||||
|
viewing = 'allmembers'
|
||||||
|
|
||||||
|
class TeamCreateFactory(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
redis_connection.publish('tasks','KILL')
|
||||||
|
self.user_passwords = []
|
||||||
|
usernames = [
|
||||||
|
'user1',
|
||||||
|
'user2',
|
||||||
|
'user3',
|
||||||
|
'user4',
|
||||||
|
'user5',
|
||||||
|
'user6',
|
||||||
|
]
|
||||||
|
self.users = []
|
||||||
|
|
||||||
|
for i in range(6):
|
||||||
|
u = UserFactory(username=usernames[i])
|
||||||
|
self.users.append(u)
|
||||||
|
|
||||||
|
r = Rower.objects.create(
|
||||||
|
birthdate=faker.profile()['birthdate'],
|
||||||
|
gdproptin=True,
|
||||||
|
gdproptindate=timezone.now(),
|
||||||
|
rowerplan='coach',
|
||||||
|
user=u,
|
||||||
|
clubsize=3
|
||||||
|
)
|
||||||
|
r.save()
|
||||||
|
|
||||||
|
password = faker.word()
|
||||||
|
u.set_password(password)
|
||||||
|
u.save()
|
||||||
|
self.user_passwords.append(password)
|
||||||
|
|
||||||
|
|
||||||
|
workouts = WorkoutFactory.create_batch(5, user=r)
|
||||||
|
|
||||||
|
|
||||||
|
self.c = Client()
|
||||||
|
|
||||||
|
self.u = self.users[0]
|
||||||
|
self.password = self.user_passwords[0]
|
||||||
|
|
||||||
|
self.t = TeamFactory(manager=self.u)
|
||||||
|
|
||||||
|
|
||||||
|
def test_teamview(self):
|
||||||
|
login = self.c.login(username=self.u.username, password = self.password)
|
||||||
|
self.assertTrue(login)
|
||||||
|
|
||||||
|
url = '/rowers/team/{t}/'.format(t=self.t.id)
|
||||||
|
response = self.c.get(url)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
|
def test_teamview_member(self):
|
||||||
|
|
||||||
|
id,comment = add_member(self.t.id,self.users[1].rower)
|
||||||
|
self.assertEqual(id,self.t.id)
|
||||||
|
|
||||||
|
login = self.c.login(username=self.users[1].username, password = self.user_passwords[1])
|
||||||
|
self.assertTrue(login)
|
||||||
|
|
||||||
|
url = '/rowers/team/{t}/'.format(t=self.t.id)
|
||||||
|
response = self.c.get(url)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
|
def test_team_invite_view(self):
|
||||||
|
login = self.c.login(username=self.u.username, password = self.password)
|
||||||
|
self.assertTrue(login)
|
||||||
|
|
||||||
|
url = '/rowers/team/{t}/'.format(t=self.t.id)
|
||||||
|
|
||||||
|
form_data = {
|
||||||
|
'email': self.users[1].email,
|
||||||
|
'user': u''
|
||||||
|
}
|
||||||
|
|
||||||
|
response = self.c.post(url, form_data)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def test_lowlevel_update_team(self):
|
||||||
|
id, comment = update_team(self.t,faker.word(),self.u,'open',faker.text(),'allmembers')
|
||||||
|
self.assertEqual(id,1)
|
||||||
|
|
||||||
|
id, comment = update_team(self.t,faker.word(),self.users[2],'open',faker.text(),'allmembers')
|
||||||
|
self.assertEqual(id,0)
|
||||||
|
|
||||||
|
team = TeamFactory(manager = self.users[2])
|
||||||
|
id, comment = update_team(team, self.t.name, self.users[2], 'open', faker.text(),
|
||||||
|
'allmembers')
|
||||||
|
self.assertEqual(id,0)
|
||||||
|
self.assertEqual(comment,'Team name duplication')
|
||||||
|
|
||||||
|
def test_lowlevel_create_team(self):
|
||||||
|
id, comment = create_team(faker.word(), self.u)
|
||||||
|
self.assertEqual(id,2)
|
||||||
|
|
||||||
|
id, comment = create_team(self.t.name,self.u)
|
||||||
|
self.assertEqual(id,0)
|
||||||
|
self.assertEqual(comment,'Team name duplication')
|
||||||
|
|
||||||
|
def test_lowlevel_remove_team(self):
|
||||||
|
team = TeamFactory(manager=self.u)
|
||||||
|
tid = team.id
|
||||||
|
id, comment = add_member(team.id,self.users[1].rower)
|
||||||
|
id, comment = add_member(team.id,self.users[2].rower)
|
||||||
|
|
||||||
|
result = remove_team(team.id)
|
||||||
|
|
||||||
|
test = Team.objects.filter(id=tid)
|
||||||
|
self.assertEqual(len(test),0)
|
||||||
|
|
||||||
|
|
||||||
|
def test_lowlevel_remove_member(self):
|
||||||
|
id, comment = add_member(self.t.id, self.users[3].rower)
|
||||||
|
id, comment = remove_member(self.t.id, self.users[3].rower)
|
||||||
|
self.assertEqual(id, self.t.id)
|
||||||
|
|
||||||
|
|
||||||
|
def test_lowlevel_create_invite(self):
|
||||||
|
id, comment = add_member(self.t.id, self.users[1].rower)
|
||||||
|
|
||||||
|
# cannot create invite for someone who already is a member
|
||||||
|
id, comment = create_invite(self.t,self.u,user=self.users[1])
|
||||||
|
self.assertEqual(id,0)
|
||||||
|
self.assertEqual(comment,'Already member of that team')
|
||||||
|
|
||||||
|
id, comment = remove_member(self.t.id, self.users[1].rower)
|
||||||
|
|
||||||
|
# cannot create invite for team you don't manage
|
||||||
|
id, comment = create_invite(self.t, self.users[3],self.users[4])
|
||||||
|
self.assertEqual(id,0)
|
||||||
|
|
||||||
|
# cannot exceed club size
|
||||||
|
for i in range(5):
|
||||||
|
id, comment = create_invite(self.t,self.u,user=self.users[i+1])
|
||||||
|
|
||||||
|
if i <= self.u.rower.clubsize:
|
||||||
|
self.assertEqual(comment,'Invitation created')
|
||||||
|
else:
|
||||||
|
self.assertEqual(id,0)
|
||||||
|
|
||||||
|
|
||||||
BIN
Binary file not shown.
Vendored
+1
-1
@@ -2502,7 +2502,7 @@
|
|||||||
</Trackpoint>
|
</Trackpoint>
|
||||||
</Track>
|
</Track>
|
||||||
</Lap>
|
</Lap>
|
||||||
<Notes><Element 'Notes' at 0x134f79e8></Notes>
|
<Notes><Element 'Notes' at 0x14a7a278></Notes>
|
||||||
</Activity>
|
</Activity>
|
||||||
</Activities>
|
</Activities>
|
||||||
<Creator>
|
<Creator>
|
||||||
|
|||||||
Reference in New Issue
Block a user