Source code for registration.tests

from datetime import datetime
from io import StringIO

from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db.models import Q
from django.test import TestCase

from .models import Person, Rank, EventLink, Division, Event, import_registrations, export_registrations

# Create your tests here.
[docs]class EventTestCase(TestCase):
[docs] def test_get_format(self): from kumite.models import KumiteElim1Bracket e = Event(name="asfd", format=Event.EventFormat.elim1) self.assertEqual(e.get_format_class(10), KumiteElim1Bracket)
[docs]class RankTestCase(TestCase):
[docs] def test_get_kyu(self): rank = Rank.get_kyu(8) self.assertTrue(rank.name.startswith("Yellow")) with self.assertRaises(ObjectDoesNotExist): rank = Rank.get_kyu(10)
[docs] def test_get_dan(self): rank = Rank.get_dan(2) self.assertTrue(rank.name.startswith("Nidan")) with self.assertRaises(ObjectDoesNotExist): rank = Rank.get_dan(0)
[docs] def test_build_default_fixture(self): """Check that default entries have been populated. The rank fixture should have been automatically loaded by DB migration. Check that it is populated and that it matches the generation function and the saved fixture. """ from django.core import serializers import os import io db = serializers.serialize("json", Rank.objects.all(), indent=4) filename = os.path.realpath(__file__) filename = os.path.join(os.path.dirname(filename), "fixtures", "rank.json") with open(filename) as f: filename = f.read() fun = io.StringIO() Rank.build_default_fixture(fun) fun.seek(0) fun = fun.read() self.assertJSONEqual(db, filename) self.assertJSONEqual(db, fun)
[docs] def test_parse(self): for r in Rank.objects.all(): r2 = Rank.parse(str(r)) self.assertEqual(r2,r) with self.assertRaises(ValueError): Rank.parse("asdflaksjdf")
[docs]class DivisionTestCase(TestCase):
[docs] def test_claim(self): e = Event(name="event", format=Event.EventFormat.kata) e.save() # Create some divisions white = Rank.get_kyu(9) brown = Rank.get_kyu(1) bb1 = Rank.get_dan(1) bb9 = Rank.get_dan(9) Division(event=e, gender='M', start_age=1, stop_age = 18, start_rank=white, stop_rank=brown).save() Division(event=e, gender='M', start_age=19, stop_age = 99, start_rank=white, stop_rank=brown).save() # <= deleted later, then recreated, then deleted Division(event=e, gender='F', start_age=1, stop_age = 18, start_rank=white, stop_rank=brown).save() Division(event=e, gender='F', start_age=19, stop_age = 99, start_rank=white, stop_rank=brown).save() # <= merged with deleted Division(event=e, gender='M', start_age=1, stop_age = 18, start_rank= bb1, stop_rank= bb9).save() Division(event=e, gender='M', start_age=19, stop_age = 99, start_rank= bb1, stop_rank= bb9).save() Division(event=e, gender='F', start_age=1, stop_age = 18, start_rank= bb1, stop_rank= bb9).save() # Create this later: Division(event=e, gender='F', start_age=19, stop_age = 99, start_rank= bb1, stop_rank= bb9).save() def get_divs(): return Division.objects.filter(event=e).order_by('pk') # Clear sorting so the above order is retained def div_summary(): return ([[el.name for el in d.eventlink_set.order_by('pk')] for d in get_divs()], [el.name for el in e.get_orphan_links().order_by('pk')]) self.assertEqual(div_summary(), ([[], [], [], [], [], [], []], [])) # Create some people p = Person(first_name="a", last_name="a", gender='M', age=1, rank=Rank.get_kyu(8), instructor="asdf") p.save() EventLink(person=p, event=e).save() p = Person(first_name="b", last_name="b", gender='M', age=19, rank=Rank.get_kyu(5), instructor="asdf") p.save() EventLink(person=p, event=e).save() p = Person(first_name="c", last_name="c", gender='F', age=18, rank=Rank.get_kyu(3), instructor="asdf") p.save() EventLink(person=p, event=e).save() p = Person(first_name="d", last_name="d", gender='F', age=50, rank=Rank.get_kyu(1), instructor="asdf") p.save() EventLink(person=p, event=e).save() p = Person(first_name="e", last_name="e", gender='M', age=1, rank=Rank.get_dan(1), instructor="asdf") p.save() EventLink(person=p, event=e).save() p = Person(first_name="f", last_name="f", gender='M', age=19, rank=Rank.get_dan(3), instructor="asdf") p.save() EventLink(person=p, event=e).save() p = Person(first_name="g", last_name="g", gender='F', age=18, rank=Rank.get_dan(5), instructor="asdf") p.save() EventLink(person=p, event=e).save() p = Person(first_name="h", last_name="h", gender='F', age=50, rank=Rank.get_dan(9), instructor="asdf") p.save() EventLink(person=p, event=e).save() self.assertEqual(div_summary(), ([["a a"], ["b b"], ["c c"], ["d d"], ["e e"], ["f f"], ["g g"]], ["h h"])) # Create a manual EventLink EventLink(event=e, division=get_divs()[1], manual_name="m").save() self.assertEqual(div_summary(), ([["a a"], ["b b", "m"], ["c c"], ["d d"], ["e e"], ["f f"], ["g g"]], ["h h"])) # Force a person to be in the wrong division p = Person(first_name="o", last_name="d", gender='F', age=25, rank = Rank.get_kyu(5), instructor="asdf") p.save() EventLink(person=p, event=e, division=get_divs()[1], locked=True).save() self.assertEqual(div_summary(), ([["a a"], ["b b", "m", "o d"], ["c c"], ["d d"], ["e e"], ["f f"], ["g g"]], ["h h"])) # Force a person to be in no division p = Person(first_name="o", last_name="n", gender='F', age=25, rank = Rank.get_kyu(5), instructor="asdf") p.save() EventLink(person=p, event=e, division=None, locked=True).save() self.assertEqual(div_summary(), ([["a a"], ["b b", "m", "o d"], ["c c"], ["d d"], ["e e"], ["f f"], ["g g"]], ["h h", "o n"])) # Create a Division after Person Division(event=e, gender='F', start_age=19, stop_age = 99, start_rank= bb1, stop_rank= bb9).save() self.assertEqual(div_summary(), ([["a a"], ["b b", "m", "o d"], ["c c"], ["d d"], ["e e"], ["f f"], ["g g"], ["h h"]], ["o n"])) # Delete a division get_divs()[7].delete() self.assertEqual(div_summary(), ([["a a"], ["b b", "m", "o d"], ["c c"], ["d d"], ["e e"], ["f f"], ["g g"]], ["h h", "o n"])) # Delete a division as part of a merge. Manually added "m" will be dropped. # M, 19-99, white-brown d = get_divs()[1].delete() self.assertEqual(div_summary(), ([["a a"], ["c c"], ["d d"], ["e e"], ["f f"], ["g g"]], ["b b", "h h", "o d", "o n"])) # Expand a division as part of a merge # F, 19-99, white-brown => MF d = get_divs()[2] d.gender = 'MF' d.save() self.assertEqual(div_summary(), ([["a a"], ["c c"], ["b b", "d d"], ["e e"], ["f f"], ["g g"]], ["h h", "o d", "o n"])) # Create an overlapping division # M, 19-99, white-brown # The newly created division steals "b b" d2 = Division(event=e, gender='M', start_age=19, stop_age=99, start_rank=white, stop_rank=brown) d2.save() self.assertEqual(div_summary(), ([["a a"], ["c c"], ["d d"], ["e e"], ["f f"], ["g g"], ["b b"]], ["h h", "o d", "o n"])) # Shift the overlapping division # M, 19-99, white-brown => 100-99 # "b b" goes back to its original division d2.start_age=100 d2.save() self.assertEqual(div_summary(), ([["a a"], ["c c"], ["b b", "d d"], ["e e"], ["f f"], ["g g"], []], ["h h", "o d", "o n"])) # Shift the overlapping division back. # M, 100-99, white-brown => 19-99 # The modified division steals "b b" d2.start_age=19 d2.save() self.assertEqual(div_summary(), ([["a a"], ["c c"], ["d d"], ["e e"], ["f f"], ["g g"], ["b b"]], ["h h", "o d", "o n"])) # Delete the just-created division. Orphan should be reclaimed by overlapping division. d2.delete() self.assertEqual(div_summary(), ([["a a"], ["c c"], ["b b", "d d"], ["e e"], ["f f"], ["g g"]], ["h h", "o d", "o n"])) # Change information about someone and check division changes p = Person.objects.get(first_name="a") p.gender = 'F' p.save() self.assertEqual(div_summary(), ([[], ["a a", "c c"], ["b b", "d d"], ["e e"], ["f f"], ["g g"]], ["h h", "o d", "o n"]))
[docs] def test_claim_teams(self): # Split division # Merge Division # Team splits # Time whole e = Event(name="event", format=Event.EventFormat.kata, is_team=True) e.save() # Create some divisions white = Rank.get_kyu(9) brown = Rank.get_kyu(1) bb1 = Rank.get_dan(1) bb9 = Rank.get_dan(9) d1 = Division(event=e, gender='MF', start_age=1, stop_age = 99, start_rank=white, stop_rank=bb9) d1.save() # Create this later: Division(event=e, gender='F', start_age=19, stop_age = 99, start_rank= bb1, stop_rank= bb9).save() def get_divs(): return Division.objects.filter(event=e).order_by('pk') # Clear sorting so the above order is retained def div_summary(): return ([[el.name for el in d.eventlink_set.filter(Q(is_team=True) | Q(team=None)).order_by('pk')] for d in get_divs()], [el.name for el in e.get_orphan_links().order_by('pk')]) self.assertEqual(div_summary(), ([[]], [])) # Create some people p = Person(first_name="a", last_name="", gender='M', age=1, rank=Rank.get_kyu(8), instructor="asdf") p.save() EventLink(person=p, event=e).save() p = Person(first_name="b", last_name="", gender='M', age=19, rank=Rank.get_kyu(5), instructor="asdf") p.save() EventLink(person=p, event=e).save() p = Person(first_name="c", last_name="", gender='M', age=18, rank=Rank.get_kyu(3), instructor="asdf") p.save() EventLink(person=p, event=e).save() p = Person(first_name="d", last_name="", gender='F', age=50, rank=Rank.get_kyu(1), instructor="asdf") p.save() EventLink(person=p, event=e).save() EventLink(manual_name="e", event=e, division=d1).save() # Check assignment without teams self.assertEqual(div_summary(), ([["a", "b", "c", "d", "e"]], [])) # Create initial teams and check teams reported correctly team = EventLink(event=e, division=d1, is_team=True) team.save() EventLink.objects.filter(person__first_name="a").update(team=team) EventLink.objects.filter(person__first_name="b").update(team=team) team = EventLink(event=e, division=d1, is_team=True) team.save() EventLink.objects.filter(person__first_name="c").update(team=team) EventLink.objects.filter(person__first_name="d").update(team=team) EventLink.objects.filter(manual_name="e").update(team=team) self.assertEqual(div_summary(), ([["Team a and b", "Team c, d and e"]], [])) # Create a new division that splits out the boys. Team a and b should move to the new division. Other team is split Division(event=e, gender='M', start_age=1, stop_age = 98, start_rank=white, stop_rank=bb9).save() self.assertEqual(div_summary(), ([["Team d and e"], ["c", "Team a and b"]], [])) # Delete first division, orphaning d and causing manually created e to be dropped d1.delete() self.assertEqual(div_summary(), ([["c", "Team a and b"]], ["d"]))
[docs]class PersonTestCase(TestCase):
[docs] def test_required_parent(self): p = Person(first_name="asdf", last_name="qwerty", gender='M', age=10, rank=Rank.objects.get(order=1), instructor="Mr. Instructor") with self.assertRaises(ValidationError): p.full_clean() p.age = 10 p.parent = "asdf" p.full_clean() # okay p.age = 17 p.parent = "asdf" p.full_clean() # okay p.age = 17 p.parent = "" with self.assertRaises(ValidationError): p.full_clean() p.age = 18 p.parent = "" p.full_clean() # okay p.age = 18 p.parent = "asdf" p.full_clean() # okay
[docs]class EventLinkTestCase(TestCase):
[docs] def test_manual(self): p = Person(first_name="asdf", last_name="qwerty", gender='M', age=20, rank=Rank.objects.get(order=1), instructor="Mr. Instructor") p.save() e = Event(name="event", format=Event.EventFormat.kata) e.save() el = EventLink(manual_name='manual', event=e) self.assertTrue(el.is_manual) self.assertEqual(el.name, 'manual') self.assertFalse(el.is_team) self.assertIsNone(el.team) el.person = p el.manual_name = "" el.save() self.assertFalse(el.is_manual) self.assertEqual(el.name, "asdf qwerty")
[docs] def test_team(self): p = Person(first_name="asdf", last_name="qwerty", gender='M', age=20, rank=Rank.objects.get(order=1), instructor="Mr. Instructor") p.save() e = Event(name="event", format=Event.EventFormat.kata) e.save() team = EventLink(event=e, is_team=True) team.save() self.assertEqual(team.name, "Empty team") el = EventLink(event=e, person=p, team=team) el.save() self.assertEqual(team.name, "Team asdf qwerty") el = EventLink(event=e, manual_name="aaa", team=team) el.save() self.assertEqual(team.name, "Team aaa and asdf qwerty") el = EventLink(event=e, manual_name="zzz", team=team) el.save() self.assertEqual(team.name, "Team aaa, asdf qwerty and zzz")
[docs] def test_clean(self): p = Person(first_name="asdf", last_name="qwerty", gender='M', age=20, rank=Rank.objects.get(order=1), instructor="Mr. Instructor") p.save() e = Event(name="event", format=Event.EventFormat.kata) e.save() d = Division(event=e, gender='M', start_age=1, stop_age = 18, start_rank=Rank.get_kyu(9), stop_rank=Rank.get_dan(9)) d.save() el = EventLink(event=e, division=d) el.person = p el.full_clean() # Can't set manual name and person el.manual_name = "asdf" with self.assertRaises(ValidationError): el.full_clean() el.person = None el.full_clean() # Can't set is_team and manual name el.is_team = True with self.assertRaises(ValidationError): el.full_clean() el.manual_name = "" el.full_clean() # Division required for team el.division = None with self.assertRaises(ValidationError): el.full_clean() el.is_team = False el.full_clean() # Division required for manual el.person = None el.manual_name = "asdf" with self.assertRaises(ValidationError): el.full_clean()
[docs]class ImportExportRegistrationTestCase(TestCase):
[docs] def setUp(self): kata = Event(name="Kata", format=Event.EventFormat.elim1) kata.save() kumite = Event(name="Kumite", format=Event.EventFormat.elim1) kumite.save() team_kata = Event(name="Team kata", format=Event.EventFormat.elim1, is_team=True) team_kata.save() white = Rank.get_kyu(9) bb9 = Rank.get_dan(9) d_kata = Division(event=kata, gender='MF', start_age=1, stop_age = 99, start_rank=white, stop_rank=bb9) d_kata.save() d_kumite = Division(event=kumite, gender='M', start_age=1, stop_age = 99, start_rank=white, stop_rank=bb9) d_kumite.save()
# No female kumite: Division(event=kumite, gender='F', start_age=1, stop_age = 99, start_rank=white, stop_rank=bb9).save()
[docs] def test_import_registration(self): kata = Event.objects.get(name="Kata") kumite = Event.objects.get(name="Kumite") d_kata = Division.objects.get(event=kata) d_kumite = Division.objects.get(event=kumite) input = StringIO("""Timestamp,First Name,Last Name,Gender,Age,Rank,Instructor,Phone number,Email,Events,Notes,Address,City,Province,Postal Code,Waiver,Email Address,Name of parent or guardian (competitors under 18 years),Address 1/8/2018 18:46:43,HHH,PPP,Male,15,Purple (4th kyu),FFF SSS,5191234567,,"Kumite",,40 WWW,CCC,OOO,NNN 555,I agree,asdf@hotmail.com,AAA PPP, 1/10/2018 14:39:21,SSS,GGG,Male,30,Nidan (2nd dan black belt),SSS RRR/ KKK DDD/ TTT OOO,9051234567,,"Kata, Kumite",,50 GGG,HHH,ON,LLL444,I agree,sss@gmail.com,,""", newline='') self.assertEqual(len(Person.objects.all()), 0) stats = import_registrations(input) self.assertEqual(stats, {"added": 2, "skipped": 0}) def person2str(p): fields = ('first_name', 'last_name', 'gender', 'age', 'rank', 'instructor', 'phone_number', 'email', 'parent', 'reg_date', 'paid', 'notes', 'eventlink_set', 'teammates') str = "" for f in fields: if f == "eventlink_set": v = ", ".join(el.event.name for el in p.eventlink_set.all()) elif f == "reg_date": v = p.reg_date.strftime("%Y-%m-%d %H:%M:%S") else: v = getattr(p, f) str = str + "{} => {}\n".format(f, v) return str people = Person.objects.order_by("reg_date") self.assertEqual(len(people), 2) # self.maxDiff = None self.assertEqual(person2str(people[0]), """first_name => HHH last_name => PPP gender => M age => 15 rank => Purple (4th kyu) instructor => FFF SSS phone_number => 5191234567 email => asdf@hotmail.com parent => AAA PPP reg_date => 2018-01-08 18:46:43 paid => False notes => eventlink_set => Kumite teammates => """) self.assertEqual(people[0].eventlink_set.get(event=kumite).division, d_kumite) # length checked with person2str() self.assertEqual(person2str(people[1]), """first_name => SSS last_name => GGG gender => M age => 30 rank => Nidan (2nd dan black belt) instructor => SSS RRR/ KKK DDD/ TTT OOO phone_number => 9051234567 email => sss@gmail.com parent => reg_date => 2018-01-10 14:39:21 paid => False notes => eventlink_set => Kata, Kumite teammates => """) self.assertEqual(people[1].eventlink_set.get(event=kumite).division, d_kumite) # length checked with self.assertEqual(people[1].eventlink_set.get(event=kata).division, d_kata) input = StringIO("""Timestamp,First Name,Last Name,Gender,Age,Rank,Instructor,Phone number,Email,Events,Notes,Address,City,Province,Postal Code,Waiver,Email Address,Name of parent or guardian (competitors under 18 years),Address 1/8/2018 18:46:43,HHH,PPP,Male,15,Purple (4th kyu),FFF SSS,5191234567,,"Kumite",,40 WWW,CCC,OOO,NNN 555,I agree,asdf@hotmail.com,AAA PPP, 1/10/2018 14:39:21,SSS,GGG,Male,30,Nidan (2nd dan black belt),SSS RRR/ KKK DDD/ TTT OOO,9051234567,,"Kata, Kumite",,50 GGG,HHH,ON,LLL444,I agree,sss@gmail.com,, 1/11/2018 21:31:54,CCC,RRR,Female,11,Blue (5th kyu),RRR,905 123 4567,,"Kata, Kumite","Hello there",555 DDD,BBB,Ontario,LLL 555,I agree,ccc@icloud.com,GGG RRR,""", newline='') stats = import_registrations(input) self.assertEqual(stats, {"added": 1, "skipped": 2}) people = Person.objects.order_by("reg_date") self.assertEqual(len(people), 3) self.maxDiff = None self.assertEqual(person2str(people[2]), """first_name => CCC last_name => RRR gender => F age => 11 rank => Blue (5th kyu) instructor => RRR phone_number => 905 123 4567 email => ccc@icloud.com parent => GGG RRR reg_date => 2018-01-11 21:31:54 paid => False notes => Hello there eventlink_set => Kata, Kumite teammates => """) self.assertEqual(people[2].eventlink_set.get(event=kata).division, d_kata) self.assertEqual(people[2].eventlink_set.get(event=kumite).division, None) # Updated import to include team kata and teammates. This was also # exported directly from the form rather than going through Google # sheets, so the fields and formatting are subtly different. input = StringIO(""""Timestamp","Username","First Name","Last Name","Gender","Age","Rank","Instructor","Phone number","Address","City","Province","Postal Code","Events","Teammates for Team Kata","Notes","Waiver","Name of parent or guardian (competitors under 18 years)" "2019/01/03 9:16:55 AM EST","asdf@gmail.com","MMM","PPP","Male","55","Nidan (2nd dan black belt)","SSS","1234567890","","","","","Kata;Kumite;Team kata","Anyone","","I agree",""""") stats = import_registrations(input) self.assertEqual(stats, {"added": 1, "skipped": 0}) people = Person.objects.order_by("reg_date") self.assertEqual(len(people), 4) self.assertEqual(person2str(people.last()), """first_name => MMM last_name => PPP gender => M age => 55 rank => Nidan (2nd dan black belt) instructor => SSS phone_number => 1234567890 email => asdf@gmail.com parent => reg_date => 2019-01-03 09:16:55 paid => False notes => eventlink_set => Kata, Kumite, Team kata teammates => Anyone """)
[docs] def test_import_error(self): input = StringIO("""Timestamp,First Name,Last Name,Gender,Age,Rank,Instructor,Phone number,Email,Events,Notes,Address,City,Province,Postal Code,Waiver,Email Address,Name of parent or guardian (competitors under 18 years),Address 1/8/2018 18:46:43,HHH,PPP,Male,15,Purple (4th kyu),FFF SSS,5191234567,,"Kumite",,40 WWW,CCC,OOO,NNN 555,I agree,asdf@hotmail.com,AAA PPP, 1/10/2018 14:39:21,SSS,GGG,ERROR ERROR ERROR,30,Nidan (2nd dan black belt),SSS RRR/ KKK DDD/ TTT OOO,9051234567,,"Kata, Kumite",,50 GGG,HHH,ON,LLL444,I agree,sss@gmail.com,, 1/11/2018 21:31:54,CCC,RRR,Female,11,Blue (5th kyu),RRR,905 123 4567,,"Kata, Kumite","Hello there",555 DDD,BBB,Ontario,LLL 555,I agree,ccc@icloud.com,GGG RRR,""", newline='') with self.assertRaises(ValueError): stats = import_registrations(input) self.assertEqual(len(Person.objects.all()), 0) self.assertEqual(len(EventLink.objects.all()), 0) input = StringIO("""Timestamp,First Name,Last Name,Gender,Age,Rank,Instructor,Phone number,Email,Events,Notes,Address,City,Province,Postal Code,Waiver,Email Address,Name of parent or guardian (competitors under 18 years),Address 1/8/2018 18:46:43,HHH,PPP,Male,15,Purple (4th kyu),FFF SSS,5191234567,,"Kumite",,40 WWW,CCC,OOO,NNN 555,I agree,asdf@hotmail.com,AAA PPP, 1/10/2018 14:39:21,SSS,GGG,Male,30,Nidan (2nd dan black belt),SSS RRR/ KKK DDD/ TTT OOO,9051234567,,"Kata, Kumite",,50 GGG,HHH,ON,LLL444,I agree,sss@gmail.com,, 1/11/2018 21:31:54,CCC,RRR,Female,11,Blue (5th kyu),RRR,905 123 4567,,"Kata, Kumite","Hello there",555 DDD,BBB,Ontario,LLL 555,I agree,ccc@icloud.com,GGG RRR,""", newline='') stats = import_registrations(input) self.assertEqual(stats, {"added": 3, "skipped": 0}) self.assertEqual(len(Person.objects.all()), 3) self.assertEqual(len(EventLink.objects.all()), 5)
[docs] def test_export_registration(self): kata = Event.objects.get(name="Kata") kumite = Event.objects.get(name="Kumite") d_kata = Division.objects.get(event=kata) d_kumite = Division.objects.get(event=kumite) bb2 = Rank.get_dan(2) p = Person(first_name='Mark', last_name='Patterson', gender='M', age=32, rank=bb2, instructor='Sandy', phone_number='123 456 7890', email="asdf@asdf.com", parent="", reg_date=datetime(2018, 1, 30, 13, 12, 10), paid=True, notes="""multi line note""") p.save() el = EventLink(event=kata, person=p) el.save() el = EventLink(event=kumite, person=p) el.save() f = StringIO() export_registrations(f) self.maxDiff=None self.assertEqual(f.getvalue().replace('\r\n', '\n'), """first_name,last_name,gender,age,rank,instructor,phone_number,email,parent,events,reg_date,notes Mark,Patterson,M,32,Nidan (2nd dan black belt),Sandy,123 456 7890,asdf@asdf.com,,"Kata, Kumite",2018-01-30 13:12:10,"multi line note" """)
[docs] def test_export_registration_fields(self): """Look for any new fields that might need to be added.""" export_fields = ("first_name", "last_name", 'gender', 'age', 'rank', 'instructor', 'phone_number', 'email', 'parent', 'events', 'teammates', 'reg_date', 'notes') unused_fields = ('eventlink', 'paidDate', 'confirmed', 'id', 'paid') okay_fields = export_fields + unused_fields model_fields = Person._meta.get_fields() for f in model_fields: self.assertIn(f.name, okay_fields)
# def create_random_people(n): # import names # import random # # kata = Event.objects.get(name='Kata') # kumite = Event.objects.get(name='Kumite') # # def rand_rank(): # r = random.randint(-9,4) # if r >= 0: # r += 1 # 0 not allowed # return Rank.objects.get(order=r) # # for i in range(n): # p = Person() # if random.random() > 0.5: # p.first_name = names.get_first_name(gender='male') # p.gender = 'M' # else: # p.first_name = names.get_first_name(gender='female') # p.gender = 'F' # p.last_name = names.get_last_name() # p.paid = random.random() > 0.5 # p.age = random.randint(6,30) # p.rank = rand_rank() # p.save() # # events = random.randint(1,3) # if events == 1 or events == 3: # el = EventLink(person=p,event=kata) # el.save() # if events == 2 or events == 3: # el = EventLink(person=p,event=kumite) # el.save()