diff --git a/src/account/admin.py b/src/account/admin.py index 388129c8f6d559b75b77afdd0cdf57bab932fd9c..37427a6cd7aeb3a160d67350ecb520c66f2e7bf2 100644 --- a/src/account/admin.py +++ b/src/account/admin.py @@ -8,7 +8,7 @@ from . import resources @admin.register(models.Profile) class ProfileAdmin(ExportMixin, admin.ModelAdmin): - list_display = ('user_username', 'join_date') + list_display = ('user_username', 'full_name', 'join_date') resource_class = resources.SignUpResource def user_username(self, obj): diff --git a/src/account/models.py b/src/account/models.py index 0d401930c244a8ea9bbf38f192e12f69dd870bb2..71b79f0c59102fe236def8d5459f6e3170e9f417 100644 --- a/src/account/models.py +++ b/src/account/models.py @@ -29,10 +29,13 @@ class Profile(models.Model): nick = models.CharField(max_length=15, blank=True, default='') signed = models.BooleanField(default=False, null=False) groups = models.ManyToManyField(GroupChoice, related_name='profiles') - # Homeworks=models.ForeignKey(Homework) + + @property + def full_name(self): + return self.user.get_full_name() def __str__(self): - return self.user.username + return self.full_name class Deadline(SingletonModel): diff --git a/src/stats/admin.py b/src/stats/admin.py index a551546486611e9b0125f25096c0125c1c1e962f..050ebd1b03b37e58ab3bec15a2624270a5e37082 100644 --- a/src/stats/admin.py +++ b/src/stats/admin.py @@ -1,5 +1,21 @@ from django.contrib import admin -from .models import KszkEvent +from import_export.admin import ExportMixin +from . import models +from . import resources -admin.site.register(KszkEvent) + +@admin.register(models.Event) +class EventAdmin(ExportMixin, admin.ModelAdmin): + filter_horizontal = ('visitors', ) + list_filter = ('name', 'date') + search_fields = ('name', ) + resource_class = resources.EventResource + + +@admin.register(models.Note) +class NoteAdmin(ExportMixin, admin.ModelAdmin): + list_display = ('user', 'note', 'event', 'created_by', 'created_at', 'updated_at') + list_filter = ('user', 'created_by', 'event') + search_fields = ('event__name', 'note') + resource_class = resources.NoteResource diff --git a/src/stats/migrations/0005_auto_20180214_2206.py b/src/stats/migrations/0005_auto_20180214_2206.py new file mode 100644 index 0000000000000000000000000000000000000000..f4a0033cc39e3b8b311676b83ca7fdb22fa3bccf --- /dev/null +++ b/src/stats/migrations/0005_auto_20180214_2206.py @@ -0,0 +1,30 @@ +# Generated by Django 2.0.1 on 2018-02-14 21:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0017_auto_20180205_2004'), + ('stats', '0004_remove_kszkevent_num_of_pers'), + ] + + operations = [ + migrations.CreateModel( + name='Event', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('date', models.DateTimeField()), + ('visitors', models.ManyToManyField(related_name='visitor', to='account.Profile')), + ], + ), + migrations.RemoveField( + model_name='kszkevent', + name='visitors', + ), + migrations.DeleteModel( + name='KszkEvent', + ), + ] diff --git a/src/stats/migrations/0006_auto_20180214_2239.py b/src/stats/migrations/0006_auto_20180214_2239.py new file mode 100644 index 0000000000000000000000000000000000000000..11bcd479e58a3a965982f251caa3b021c98273f2 --- /dev/null +++ b/src/stats/migrations/0006_auto_20180214_2239.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0.1 on 2018-02-14 21:39 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('stats', '0005_auto_20180214_2206'), + ] + + operations = [ + migrations.AlterField( + model_name='event', + name='visitors', + field=models.ManyToManyField(related_name='visitor', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/src/stats/migrations/0007_auto_20180215_0018.py b/src/stats/migrations/0007_auto_20180215_0018.py new file mode 100644 index 0000000000000000000000000000000000000000..9cd65ce00b95c767f3bf9db33128446d83b79ad2 --- /dev/null +++ b/src/stats/migrations/0007_auto_20180215_0018.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.1 on 2018-02-14 23:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('stats', '0006_auto_20180214_2239'), + ] + + operations = [ + migrations.AlterField( + model_name='event', + name='visitors', + field=models.ManyToManyField(related_name='visitor', to='account.Profile'), + ), + ] diff --git a/src/stats/migrations/0008_note.py b/src/stats/migrations/0008_note.py new file mode 100644 index 0000000000000000000000000000000000000000..8b08926a7916ef37a514309d69c0f9b3ac8779c0 --- /dev/null +++ b/src/stats/migrations/0008_note.py @@ -0,0 +1,27 @@ +# Generated by Django 2.0.1 on 2018-02-21 00:18 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0017_auto_20180205_2004'), + ('stats', '0007_auto_20180215_0018'), + ] + + operations = [ + migrations.CreateModel( + name='Note', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('note', models.TextField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_notes', to='account.Profile')), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='stats.Event')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='account.Profile')), + ], + ), + ] diff --git a/src/stats/models.py b/src/stats/models.py index b3cea98f8d0779a9f8b033e69beb89750e7b3d79..aa38fd947c9ec32fd41c407f52387c1c683779b7 100644 --- a/src/stats/models.py +++ b/src/stats/models.py @@ -4,10 +4,27 @@ from django.utils import timezone from django.core.exceptions import ValidationError -class KszkEvent(models.Model): +class Event(models.Model): + name = models.CharField(max_length=255) date = models.DateTimeField(null=False) visitors = models.ManyToManyField(Profile, related_name='visitor') def clean(self): if self.date > timezone.now(): raise ValidationError('Invalid date') + + def __str__(self): + return self.name + + +class Note(models.Model): + event = models.ForeignKey(Event, related_name='notes', on_delete=models.CASCADE) + user = models.ForeignKey(Profile, related_name='notes', on_delete=models.CASCADE) + note = models.TextField() + + created_by = models.ForeignKey(Profile, related_name='created_notes', on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True, editable=False) + updated_at = models.DateTimeField(auto_now=True, editable=False) + + def __str__(self): + return self.note diff --git a/src/stats/resources.py b/src/stats/resources.py new file mode 100644 index 0000000000000000000000000000000000000000..712c971ae27eb0f4bebfd30be07eb952d8c5fbb7 --- /dev/null +++ b/src/stats/resources.py @@ -0,0 +1,41 @@ +from import_export import resources, widgets, fields + +from account.models import Profile +from . import models + + +class EventResource(resources.ModelResource): + visitors = fields.Field( + attribute='visitors', + widget=widgets.ManyToManyWidget(model=Profile, separator=' ,', field='full_name'), + ) + + class Meta: + model = models.Event + fields = ( + 'name', + 'date', + 'visitors', + ) + + +class NoteResource(resources.ModelResource): + created_by = fields.Field() + user = fields.Field() + + class Meta: + model = models.Note + fields = ( + 'user', + 'event__name', + 'note', + 'created_at', + 'updated_at', + 'created_by', + ) + + def dehydrate_created_by(self, obj): + return obj.created_by.full_name + + def dehydrate_user(self, obj): + return obj.user.full_name diff --git a/src/stats/serializers.py b/src/stats/serializers.py index 83569981c7ddc3d22fa64e94970bd98dddb71b85..0620c993155de89cea2f2c9e463d00737248b803 100644 --- a/src/stats/serializers.py +++ b/src/stats/serializers.py @@ -2,7 +2,7 @@ from rest_framework import serializers from . import models -class KszkEventSerializer(serializers.ModelSerializer): +class EventSerializer(serializers.ModelSerializer): class Meta: - model = models.KszkEvent - fields = ('date', 'visitors') + model = models.Event + fields = ('name', 'date', 'visitors') diff --git a/src/stats/urls.py b/src/stats/urls.py index ef0f4e2166c58ea7ceea950825e171cae29f6807..8f270ce8246724e9a29aaf99dd3d1e7d6690aec7 100644 --- a/src/stats/urls.py +++ b/src/stats/urls.py @@ -3,6 +3,6 @@ from rest_framework import routers from . import views router = routers.DefaultRouter() -router.register(r'events', views.KszkEventViewSet) +router.register(r'events', views.EventViewSet) urlpatterns = router.urls diff --git a/src/stats/views.py b/src/stats/views.py index c7ed3ecdf5621171f68cd8dcacc07621296b77c1..f2c91f1e70a8b38d620a0a500709f38f97359d9c 100644 --- a/src/stats/views.py +++ b/src/stats/views.py @@ -4,6 +4,6 @@ from . import models from . import serializers -class KszkEventViewSet(viewsets.ModelViewSet): - serializer_class = serializers.KszkEventSerializer - queryset = models.KszkEvent.objects.all() +class EventViewSet(viewsets.ModelViewSet): + serializer_class = serializers.EventSerializer + queryset = models.Event.objects.all()