Added fake/testing data generation
This commit is contained in:
		
							parent
							
								
									b209344e87
								
							
						
					
					
						commit
						065461300d
					
				
					 7 changed files with 109 additions and 5 deletions
				
			
		|  | @ -41,6 +41,9 @@ Make commands | ||||||
|   enhanced compared to `./manage.py runserver`. |   enhanced compared to `./manage.py runserver`. | ||||||
|   Open [127.0.0.1:8000](127.0.0.1:8000). |   Open [127.0.0.1:8000](127.0.0.1:8000). | ||||||
| 
 | 
 | ||||||
|  | * `./manage.py testdata` - create pseudo-random seminar data and admin/admin | ||||||
|  |   user. | ||||||
|  | 
 | ||||||
| * `./manage.py test` - run the tests. | * `./manage.py test` - run the tests. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ class SkolaAdmin(admin.ModelAdmin): | ||||||
|         (u'Interní ID',     {'fields': ['aesop_id', 'izo'], 'classes': ['collapse']}), |         (u'Interní ID',     {'fields': ['aesop_id', 'izo'], 'classes': ['collapse']}), | ||||||
|         (u'Adresa',         {'fields': ['ulice', 'mesto', 'psc', 'stat']}), |         (u'Adresa',         {'fields': ['ulice', 'mesto', 'psc', 'stat']}), | ||||||
|         ] |         ] | ||||||
|     list_display = ['nazev', 'aesop_id', 'mesto'] |     list_display = ['nazev', 'aesop_id', 'mesto', 'ulice', 'stat'] | ||||||
|     search_fields = ['nazev', 'mesto', 'ulice'] |     search_fields = ['nazev', 'mesto', 'ulice'] | ||||||
| 
 | 
 | ||||||
| admin.site.register(Skola, SkolaAdmin) | admin.site.register(Skola, SkolaAdmin) | ||||||
|  | @ -93,7 +93,7 @@ class ReseniAdmin(admin.ModelAdmin): | ||||||
|         (None,              {'fields': ['problem', 'resitel', 'body', 'cislo_body', 'timestamp']}), |         (None,              {'fields': ['problem', 'resitel', 'body', 'cislo_body', 'timestamp']}), | ||||||
|         ] |         ] | ||||||
|     list_display = ['problem', 'resitel', 'body', 'timestamp'] |     list_display = ['problem', 'resitel', 'body', 'timestamp'] | ||||||
|     list_filter = ['problem', 'resitel', 'body', 'timestamp'] |     list_filter = ['body', 'timestamp'] | ||||||
|     search_fields = [] |     search_fields = [] | ||||||
|     inlines = [PrilohaReseniInline] |     inlines = [PrilohaReseniInline] | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										0
									
								
								seminar/management/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								seminar/management/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										
											BIN
										
									
								
								seminar/management/commands/.testdata.py.swp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								seminar/management/commands/.testdata.py.swp
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										0
									
								
								seminar/management/commands/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								seminar/management/commands/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										99
									
								
								seminar/management/commands/testdata.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								seminar/management/commands/testdata.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,99 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | 
 | ||||||
|  | import datetime | ||||||
|  | import os | ||||||
|  | import random | ||||||
|  | 
 | ||||||
|  | from django.core.management.base import NoArgsCommand | ||||||
|  | from django.core.management import call_command | ||||||
|  | from django.conf import settings | ||||||
|  | 
 | ||||||
|  | class Command(NoArgsCommand): | ||||||
|  |     help = "Clear database and load testing data." | ||||||
|  | 
 | ||||||
|  |     def handle_noargs(self, **options): | ||||||
|  |         assert settings.DEBUG == True | ||||||
|  |         dbfile = settings.DATABASES['default']['NAME'] | ||||||
|  |         if os.path.exists(dbfile): | ||||||
|  |             os.rename(dbfile, dbfile + '.old') | ||||||
|  |             self.stderr.write('Stara databaze prejmenovana na "%s"' % (dbfile + '.old')) | ||||||
|  |         call_command('migrate', noinput=True) | ||||||
|  |         self.load_testing_data() | ||||||
|  | 
 | ||||||
|  |     def load_testing_data(self): | ||||||
|  |         from seminar import models as sm | ||||||
|  |         import django.contrib.auth | ||||||
|  |         User = django.contrib.auth.get_user_model() | ||||||
|  | 
 | ||||||
|  |         self.stderr.write('Vytvarim uzivatele "admin" (heslo "admin")') | ||||||
|  | 
 | ||||||
|  |         # pevna pseudo-nahodnost | ||||||
|  |         rnd = random.Random(x=42) | ||||||
|  | 
 | ||||||
|  |         # users | ||||||
|  |         admin = User.objects.create_superuser(username='admin', email='', password='admin') | ||||||
|  | 
 | ||||||
|  |         self.stderr.write('Vytvarim pseudo-nahodna data') | ||||||
|  | 
 | ||||||
|  |         orgs = [] | ||||||
|  |         for org in ['anet', 'bara', 'cyril', 'david', 'eva', 'filip']: | ||||||
|  |             o = User.objects.create_user(username=org, password=org) | ||||||
|  |             o.first_name = org.capitalize() | ||||||
|  |             o.save() | ||||||
|  |             orgs.append(o) | ||||||
|  | 
 | ||||||
|  |         # skoly | ||||||
|  |         sm.Skola.objects.create(mesto = u'Praha', stat='CZ', psc='101 00', ulice=u'Krátká 5', nazev=u'První SŠ') | ||||||
|  |         sm.Skola.objects.create(mesto = u'Praha', stat='CZ', psc='102 00', ulice=u'Dlouhá 5', nazev=u'Druhá SŠ') | ||||||
|  |         sm.Skola.objects.create(mesto = u'Praha', stat='CZ', psc='103 00', ulice=u'Široká 3', nazev=u'Třetí SŠ') | ||||||
|  |         sm.Skola.objects.create(mesto = u'Ostrava', stat='CZ', psc='700 00', ulice=u'Hluboká 42', nazev=u'Hutní gympl') | ||||||
|  |         sm.Skola.objects.create(mesto = u'Humenné', stat='SK', psc='012 34', ulice=u'Pltká 1', nazev=u'Sredná škuola') | ||||||
|  | 
 | ||||||
|  |         # resitele | ||||||
|  |         for i in range(20): | ||||||
|  |             skola = rnd.choice(sm.Skola.objects.all()) | ||||||
|  |             pohlavi = rnd.randint(0,1) | ||||||
|  |             sm.Resitel.objects.create(skola = skola, datum_prihlaseni = datetime.date(rnd.randint(2002, 2014), rnd.randint(1,12), 1), | ||||||
|  |                     jmeno = u'Řešitel' if pohlavi else u'Řešitelka', prijmeni = 'Číslo-%s' % (i), rok_maturity = rnd.randint(2015, 2019), | ||||||
|  |                     stat = skola.stat, zasilat = sm.Resitel.ZASILAT_NIKAM, pohlavi_muz = pohlavi) | ||||||
|  | 
 | ||||||
|  |         # rocniky | ||||||
|  |         for ri in range(17, 22): | ||||||
|  |             r = sm.Rocnik.objects.create(prvni_rok = 1993 + ri, rocnik = ri) | ||||||
|  | 
 | ||||||
|  |             # cisla | ||||||
|  |             cisel = rnd.randint(4, 6) | ||||||
|  |             cs = {} | ||||||
|  |             for ci in range(1, cisel + 1): | ||||||
|  |                 vydano = datetime.date(r.prvni_rok, ci + 6, 1) | ||||||
|  |                 deadline = datetime.date(r.prvni_rok, ci + 8, 1) if ci + 2 < cisel else None | ||||||
|  |                 c = sm.Cislo.objects.create(rocnik = r, cislo = str(ci), datum_vydani=vydano, datum_deadline=deadline) | ||||||
|  |                 cs[ci] = c | ||||||
|  | 
 | ||||||
|  |                 # problemy resene v ci | ||||||
|  |                 seq='#ABCDEFGHIJKLMNOPQRSTUVWXYZ' | ||||||
|  |                 if ci >= 3: | ||||||
|  |                     for pi in range(1, 4): | ||||||
|  |                         p = sm.Problem.objects.create(autor = rnd.choice(orgs), cislo_zadani=cs[ci-2], cislo_reseni=cs[ci], | ||||||
|  |                                 opravovatel = rnd.choice(orgs), kod = str(pi), nazev = u'Dummy úloha %s-%s' % (seq[ci], seq[pi]), | ||||||
|  |                                 stav = sm.Problem.STAV_ZADANY, typ = sm.Problem.TYP_ULOHA, body = rnd.randint(1, 5)) | ||||||
|  | 
 | ||||||
|  |                         for resi in range(rnd.randint(0, 7)): | ||||||
|  |                             res = sm.Reseni.objects.create(problem = p, resitel = rnd.choice(sm.Resitel.objects.all()), | ||||||
|  |                                     body = rnd.randint(0, p.body), cislo_body = cs[ci]) | ||||||
|  | 
 | ||||||
|  |         nastaveni = sm.Nastaveni.objects.create(aktualni_rocnik = sm.Rocnik.objects.last(), | ||||||
|  |                 aktualni_cislo = sm.Cislo.objects.last()) | ||||||
|  | 
 | ||||||
|  |         self.stderr.write('Vytvoreno %d uzivatelu, %d skol, %d resitelu, %d rocniku, %d cisel, %d problemu, %d reseni.' % | ||||||
|  |                 (User.objects.count(), sm.Skola.objects.count(), sm.Resitel.objects.count(), sm.Rocnik.objects.count(), | ||||||
|  |                 sm.Cislo.objects.count(), sm.Problem.objects.count(), sm.Reseni.objects.count())) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @ -56,7 +56,7 @@ class Skola(models.Model): | ||||||
| 
 | 
 | ||||||
|     # ISO 3166-1 dvojznakovy kod zeme velkym pismem (CZ, SK) |     # ISO 3166-1 dvojznakovy kod zeme velkym pismem (CZ, SK) | ||||||
|     # Ekvivalentní s CharField(max_length=2, default='CZ', ...) |     # Ekvivalentní s CharField(max_length=2, default='CZ', ...) | ||||||
|     stat = CountryField(u'kód státu', default='CZ', |     stat = CountryField(u'stát', default='CZ', | ||||||
|         help_text=u'ISO 3166-1 kód zeme velkými písmeny (CZ, SK, ...)') |         help_text=u'ISO 3166-1 kód zeme velkými písmeny (CZ, SK, ...)') | ||||||
| 
 | 
 | ||||||
|     def __str__(self): |     def __str__(self): | ||||||
|  | @ -85,7 +85,7 @@ class Resitel(models.Model): | ||||||
|     # Pohlaví. Že ho neznáme se snad nestane (a ušetří to práci při programování) |     # Pohlaví. Že ho neznáme se snad nestane (a ušetří to práci při programování) | ||||||
|     pohlavi_muz = models.BooleanField(u'pohlaví (muž)', default=False) |     pohlavi_muz = models.BooleanField(u'pohlaví (muž)', default=False) | ||||||
| 
 | 
 | ||||||
|     skola = models.OneToOneField(Skola, blank=True, null=True, verbose_name=u'škola') |     skola = models.ForeignKey(Skola, blank=True, null=True, verbose_name=u'škola') | ||||||
| 
 | 
 | ||||||
|     # Očekávaný rok maturity a vyřazení z aktivních řešitelů |     # Očekávaný rok maturity a vyřazení z aktivních řešitelů | ||||||
|     rok_maturity = models.IntegerField(u'rok maturity') |     rok_maturity = models.IntegerField(u'rok maturity') | ||||||
|  | @ -126,7 +126,7 @@ class Resitel(models.Model): | ||||||
| 
 | 
 | ||||||
|     # ISO 3166-1 dvojznakovy kod zeme velkym pismem (CZ, SK) |     # ISO 3166-1 dvojznakovy kod zeme velkym pismem (CZ, SK) | ||||||
|     # Ekvivalentní s CharField(max_length=2, default='CZ', ...) |     # Ekvivalentní s CharField(max_length=2, default='CZ', ...) | ||||||
|     stat = CountryField(u'kód státu', default='CZ', |     stat = CountryField(u'stát', default='CZ', | ||||||
|         help_text=u'ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)') |         help_text=u'ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)') | ||||||
| 
 | 
 | ||||||
|     def plne_jmeno(self): |     def plne_jmeno(self): | ||||||
|  | @ -242,6 +242,8 @@ class Problem(models.Model): | ||||||
|     cislo_reseni = models.ForeignKey(Cislo, verbose_name=u'číslo řešení', blank=True, null=True, related_name=u'resene_problemy', |     cislo_reseni = models.ForeignKey(Cislo, verbose_name=u'číslo řešení', blank=True, null=True, related_name=u'resene_problemy', | ||||||
|         help_text=u'Číslo s řešením úlohy, jen pro úlohy') |         help_text=u'Číslo s řešením úlohy, jen pro úlohy') | ||||||
| 
 | 
 | ||||||
|  |     body = models.IntegerField(u'maximum bodů', blank=True, null=True) | ||||||
|  | 
 | ||||||
|     def __str__(self): |     def __str__(self): | ||||||
|         return force_unicode(u'%s (%s)' % (self.nazev, self.stav)) |         return force_unicode(u'%s (%s)' % (self.nazev, self.stav)) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Tomas Gavenciak
						Tomas Gavenciak