diff --git a/client/src/components/rooms/RoomWidget.vue b/client/src/components/rooms/RoomWidget.vue index 056e14c4..2a56b919 100644 --- a/client/src/components/rooms/RoomWidget.vue +++ b/client/src/components/rooms/RoomWidget.vue @@ -20,7 +20,7 @@ import RoomEntryCountWidget from '@/components/rooms/RoomEntryCountWidget'; export default { - props: ['title', 'type', 'entries', 'group'], + props: ['title', 'appearance', 'entries', 'group'], components: { RoomEntryCountWidget, @@ -32,7 +32,7 @@ return this.entries.length }, roomClass() { - return `room-widget--${this.type}` + return `room-widget--${this.appearance}` } } } diff --git a/client/src/pages/rooms.vue b/client/src/pages/rooms.vue index 23f1ddf4..f8994d8c 100644 --- a/client/src/pages/rooms.vue +++ b/client/src/pages/rooms.vue @@ -19,21 +19,21 @@ return { rooms: [ { - title: 'Ein historische Festival', - type: 'red', - group: 'Klasse 3b - 2018/2019', + title: 'Ein historisches Festival', + group: 'Klasse 3b', + appearance: 'red', entries: [1, 1, 1, 1, 1, 1] }, { title: 'Erfahrungen Lehrbeginn', - type: 'green', - group: 'Klasse 3b - 2018/2019', + group: 'Klasse 3b', + appearance: 'green', entries: [1] }, { title: 'Interview «Mein neues Umfeld»', - type: 'brown', group: 'Hans Muster und 12 weitere Personen', + appearance: 'brown', entries: [1, 1, 1, 1, 1, 1] } diff --git a/server/book/factories.py b/server/book/factories.py index e08f158b..71d9535f 100644 --- a/server/book/factories.py +++ b/server/book/factories.py @@ -8,7 +8,7 @@ from wagtail.core.rich_text import RichText from book.blocks import ModalTextBlock, StudentEntryBlock from book.models import Book, Topic, Module, Chapter, ContentBlock, TextBlock -from core.factories import BasePageFactory, fake, DummyImageFactory, fake_title, fake_title_noparam, fake_paragraph +from core.factories import BasePageFactory, fake, DummyImageFactory, fake_paragraph class BookFactory(BasePageFactory): diff --git a/server/core/factories.py b/server/core/factories.py index 4b29278f..74c01bc9 100644 --- a/server/core/factories.py +++ b/server/core/factories.py @@ -13,15 +13,12 @@ from wagtail.images import get_image_model fake = Faker('de_DE') -def fake_title(x): +def fake_title(x=None): return fake.sentence(nb_words=random.randint(2, 4)).replace('.', '') -def fake_title_noparam(): - return fake_title(None) - def fake_paragraph(x=None): - return '
{}
'.format(fake_title_noparam()) + return '{}
'.format(fake_title()) class BasePageFactory(wagtail_factories.PageFactory): diff --git a/server/core/management/commands/dummy_rooms.py b/server/core/management/commands/dummy_rooms.py new file mode 100644 index 00000000..62720ecb --- /dev/null +++ b/server/core/management/commands/dummy_rooms.py @@ -0,0 +1,104 @@ +import os +import random +import shutil + +from django.conf import settings +from django.contrib.auth import get_user_model +from django.core.management import BaseCommand + +from user.factories import UserGroupFactory + +# room_data = [{ +# { +# 'title': 'Ein historisches Festival', +# 'type': 'red', +# 'group': 'Klasse 3b - 2018/2019' +# # 'entries': [1, 1, 1, 1, 1, 1] +# }, +# { +# 'title': 'Erfahrungen Lehrbeginn', +# 'type': 'green', +# 'group': 'Klasse 3b - 2018/2019' +# # 'entries': [1] +# }, +# { +# 'title': 'Interview «Mein neues Umfeld»', +# 'type': 'brown', +# 'group': 'Hans Muster und 12 weitere Personen' +# # 'entries': [1, 1, 1, 1, 1, 1] +# } +# }] + + +class Command(BaseCommand): + + def ensure_clean_dir(self, folder): + path = os.path.join(settings.MEDIA_ROOT, folder) + if os.path.exists(path): + shutil.rmtree(path) + if not os.path.exists(path): + os.makedirs(path) + + def filter_data(self, input_data, filter_keyword): + filters = [filter_keyword] if not isinstance(filter_keyword, list) else filter_keyword + return {k: v for (k, v) in input_data.items() if not (k in filters)} + + def handle(self, *args, **options): + # self.ensure_clean_dir('images') + # self.ensure_clean_dir('original_images') + # self.ensure_clean_dir('documents') + # + # site = wagtail_factories.SiteFactory.create(is_default_site=True) + # Page.objects.filter(title='Root').delete() + # + # u = UserFactory( + # username='test', + # is_staff=True, + # is_superuser=True + # ) + + for i in range(0, 6): + UserGroupFactory(users=(random.choices(get_user_model().objects.all(), k=3))) + + # for book_idx, book_data in enumerate(data): + # book = BookFactory.create(parent=site.root_page, **self.filter_data(book_data, 'topics')) + # + # default_topics = [{} for i in range(0, random.randint(5, 8))] + # topics_data = book_data.get('topics', default_topics) + # + # for topic_idx, topic_data in enumerate(topics_data): + # topic = TopicFactory.create(parent=book, **self.filter_data(topic_data, 'modules')) + # + # default_modules = [{} for i in range(0, random.randint(3, 6))] + # modules_data = topic_data.get('modules', default_modules) + # + # for module_idx, module_data in enumerate(modules_data): + # module = ModuleFactory.create(parent=topic, **self.filter_data(module_data, ['objective_groups', 'chapters'])) + # + # default_objective_groups = [{} for i in range(0, 2)] + # objective_group_data = module_data.get('objective_groups', default_objective_groups) + # + # for objective_group_idx, objective_group_entry in enumerate(objective_group_data): + # factory_params = self.filter_data(objective_group_entry, 'objectives') + # objective_group = ObjectiveGroupFactory.create(module=module, + # user=None, + # **factory_params) + # + # default_objectives = [{} for i in range(0, 4)] + # objectives_data = objective_group_entry.get('objectives', default_objectives) + # + # for objective_idx, objective_data in enumerate(objectives_data): + # objective = ObjectiveFactory.create(group=objective_group, **objective_data) + # + # default_chapters = [{} for i in range(0, 2)] + # chapters_data = module_data.get('chapters', default_chapters) + # + # for chapter_idx, chapter_data in enumerate(chapters_data): + # chapter = ChapterFactory.create(parent=module, **self.filter_data(chapter_data, 'content_blocks')) + # + # default_content_blocks = [{} for i in range(0, 4)] + # content_blocks_data = chapter_data.get('content_blocks', default_content_blocks) + # + # for content_block_idx, content_block_data in enumerate(content_blocks_data): + # # ContentBlockFactory.create(parent=chapter, **self.filter_data(content_block_data, 'contents')) + # ContentBlockFactory.create(parent=chapter, **content_block_data) diff --git a/server/core/settings.py b/server/core/settings.py index 99f7015e..ccad4f1a 100644 --- a/server/core/settings.py +++ b/server/core/settings.py @@ -48,7 +48,7 @@ INSTALLED_APPS = [ 'user', 'book', 'objectives', - 'news', + 'rooms', 'wagtail.contrib.forms', 'wagtail.contrib.redirects', diff --git a/server/news/admin.py b/server/news/admin.py deleted file mode 100644 index 846f6b40..00000000 --- a/server/news/admin.py +++ /dev/null @@ -1 +0,0 @@ -# Register your models here. diff --git a/server/news/models.py b/server/news/models.py deleted file mode 100644 index b28b04f6..00000000 --- a/server/news/models.py +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/server/objectives/models.py b/server/objectives/models.py index 5a3043ca..50758733 100644 --- a/server/objectives/models.py +++ b/server/objectives/models.py @@ -11,12 +11,11 @@ class ObjectiveGroup(models.Model): verbose_name_plural = 'Lernziel Gruppen' title = models.CharField('title', blank=True, null=False, max_length=255) - module = models.ForeignKey(Module, blank=False, null=False, on_delete=models.CASCADE) # a user can define her own objectives, hence this optional param user = models.ForeignKey(get_user_model(), blank=True, null=True, on_delete=models.CASCADE) - def __str__(self): + def __unicode__(self): return 'ObjectiveGroup {}-{}-{}'.format(self.id, self.module, self.title) @@ -26,10 +25,9 @@ class Objective(models.Model): verbose_name_plural = 'Lernziele' text = models.CharField('text', blank=True, null=False, max_length=255) - group = models.ForeignKey(ObjectiveGroup, blank=False, null=False, on_delete=models.CASCADE) - def __str__(self): + def __unicode__(self): return 'Objective {}-{}'.format(self.id, self.text) @@ -39,9 +37,8 @@ class ObjectiveProgressStatus(models.Model): verbose_name_plural = 'Lernzielstatus' done = models.BooleanField('Lernziel erledigt?', default=False) - objective = models.ForeignKey(Objective, blank=False, null=False, on_delete=models.CASCADE) user = models.ForeignKey(get_user_model(), blank=True, null=True, on_delete=models.CASCADE) - def __str__(self): + def __unicode__(self): return 'Lernzielstatus {}-{}'.format(self.objective, self.done) diff --git a/server/news/__init__.py b/server/rooms/__init__.py similarity index 100% rename from server/news/__init__.py rename to server/rooms/__init__.py diff --git a/server/news/factories.py b/server/rooms/admin.py similarity index 100% rename from server/news/factories.py rename to server/rooms/admin.py diff --git a/server/news/apps.py b/server/rooms/apps.py similarity index 77% rename from server/news/apps.py rename to server/rooms/apps.py index 5a7b92d0..ba92b486 100644 --- a/server/news/apps.py +++ b/server/rooms/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class NewsConfig(AppConfig): - name = 'news' + name = 'rooms' diff --git a/server/rooms/factories.py b/server/rooms/factories.py new file mode 100644 index 00000000..8563480a --- /dev/null +++ b/server/rooms/factories.py @@ -0,0 +1,16 @@ +import random + +import factory + +from core.factories import fake +from rooms.models import Room +from user.factories import UserGroupFactory + + +class RoomFactory(factory.django.DjangoModelFactory): + class Meta: + model = Room + + title = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(4, 8))) + user_group = factory.SubFactory(UserGroupFactory) + appearance = factory.LazyAttribute(lambda x: random.choice(['red', 'green', 'brown'])) diff --git a/server/rooms/migrations/0001_initial.py b/server/rooms/migrations/0001_initial.py new file mode 100644 index 00000000..2f7d48ae --- /dev/null +++ b/server/rooms/migrations/0001_initial.py @@ -0,0 +1,29 @@ +# Generated by Django 2.0.6 on 2018-08-23 10:14 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('user', '0002_usergroup'), + ] + + operations = [ + migrations.CreateModel( + name='Room', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(blank=True, max_length=255)), + ('appearance', models.CharField(blank=True, max_length=255)), + ('user_group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='user.UserGroup')), + ], + options={ + 'verbose_name': 'Raum', + 'verbose_name_plural': 'Räume', + }, + ), + ] diff --git a/server/news/migrations/__init__.py b/server/rooms/migrations/__init__.py similarity index 100% rename from server/news/migrations/__init__.py rename to server/rooms/migrations/__init__.py diff --git a/server/rooms/models.py b/server/rooms/models.py new file mode 100644 index 00000000..f1b14a12 --- /dev/null +++ b/server/rooms/models.py @@ -0,0 +1,17 @@ +from django.db import models +from django_extensions.db.models import TitleDescriptionModel + +from user.models import UserGroup + + +class Room(models.Model): + class Meta: + verbose_name = 'Raum' + verbose_name_plural = 'Räume' + + title = models.CharField(blank=True, null=False, max_length=255) + user_group = models.ForeignKey(UserGroup, blank=False, null=False, on_delete=models.CASCADE) + appearance = models.CharField(blank=True, null=False, max_length=255) + + def __unicode__(self): + return 'Room {}-{}-{}'.format(self.id, self.title, self.user_group) diff --git a/server/news/schema.py b/server/rooms/schema.py similarity index 100% rename from server/news/schema.py rename to server/rooms/schema.py diff --git a/server/user/admin.py b/server/user/admin.py index 6d53b53a..7a8c2690 100644 --- a/server/user/admin.py +++ b/server/user/admin.py @@ -1,6 +1,12 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin -from .models import User +from .models import User, UserGroup admin.site.register(User, UserAdmin) + + +@admin.register(UserGroup) +class UserGroupAdmin(admin.ModelAdmin): + list_display = ('id', 'name', 'year') + list_filter = ('year',) diff --git a/server/user/factories.py b/server/user/factories.py new file mode 100644 index 00000000..7425497d --- /dev/null +++ b/server/user/factories.py @@ -0,0 +1,25 @@ +import random + +import factory + +from user.models import UserGroup + + +class UserGroupFactory(factory.django.DjangoModelFactory): + class Meta: + model = UserGroup + + name = factory.Sequence(lambda n: 'Klasse {}{}'.format(n+1, random.choice(['a', 'b', 'c']))) + year = factory.LazyAttribute(lambda x: random.choice([2017, 2018, 2019])) + is_deleted = False + + @factory.post_generation + def users(self, create, extracted, **kwargs): + if not create: + # Simple build, do nothing. + return + + if extracted: + # A list of groups were passed in, use them + for user in extracted: + self.users.add(user) diff --git a/server/user/migrations/0002_usergroup.py b/server/user/migrations/0002_usergroup.py new file mode 100644 index 00000000..fe95d1f1 --- /dev/null +++ b/server/user/migrations/0002_usergroup.py @@ -0,0 +1,25 @@ +# Generated by Django 2.0.6 on 2018-08-23 10:14 + +from django.conf import settings +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('user', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='UserGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('year', models.PositiveIntegerField(validators=[django.core.validators.MinValueValidator(1900), django.core.validators.MaxValueValidator(2200)])), + ('is_deleted', models.BooleanField(default=False)), + ('users', models.ManyToManyField(to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/server/user/models.py b/server/user/models.py index 3d305253..1e553e25 100644 --- a/server/user/models.py +++ b/server/user/models.py @@ -1,5 +1,18 @@ +from django.contrib.auth import get_user_model from django.contrib.auth.models import AbstractUser +from django.core.validators import MinValueValidator, MaxValueValidator +from django.db import models class User(AbstractUser): pass + + +class UserGroup(models.Model): + name = models.CharField(max_length=100, blank=False, null=False) + year = models.PositiveIntegerField(blank=False, null=False, validators=[MinValueValidator(1900), MaxValueValidator(2200)]) + is_deleted = models.BooleanField(blank=False, null=False, default=False) + users = models.ManyToManyField(get_user_model()) + + def __unicode__(self): + return 'ObjectiveGroup {}-{}-{}'.format(self.id, self.module, self.title)