diff --git a/infoscreen/admin.py b/infoscreen/admin.py index 5b2bce0..12b57cb 100644 --- a/infoscreen/admin.py +++ b/infoscreen/admin.py @@ -2,8 +2,15 @@ from django.contrib import admin from infoscreen.models import ( - Rotation, InfoItem, InfoInstance, ImageInfoItem, - ExternalImageInfoItem, ABBInfoItem, ExternalWebsiteInfoItem, VideoInfoItem) + Rotation, + InfoItem, + InfoInstance, + ImageInfoItem, + ExternalImageInfoItem, + ABBInfoItem, + ExternalWebsiteInfoItem, + VideoInfoItem, +) # Register your models here. admin.site.register(Rotation) diff --git a/infoscreen/apps.py b/infoscreen/apps.py index 8b14bab..5fa23eb 100644 --- a/infoscreen/apps.py +++ b/infoscreen/apps.py @@ -6,4 +6,4 @@ from django.apps import AppConfig class InfoscreenConfig(AppConfig): """Infoscreen app configuration.""" - name = 'infoscreen' + name = "infoscreen" diff --git a/infoscreen/migrations/0001_initial.py b/infoscreen/migrations/0001_initial.py index 92b5e32..6ea92e8 100644 --- a/infoscreen/migrations/0001_initial.py +++ b/infoscreen/migrations/0001_initial.py @@ -11,81 +11,173 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), + ("contenttypes", "0002_remove_content_type_name"), ] operations = [ migrations.CreateModel( - name='HSLDataModel', + name="HSLDataModel", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('data', models.TextField(default='', editable=False)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("data", models.TextField(default="", editable=False)), ], ), migrations.CreateModel( - name='InfoInstance', + name="InfoInstance", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('duration', models.FloatField(default=15.0)), - ('item_id', models.PositiveIntegerField()), - ('item_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("duration", models.FloatField(default=15.0)), + ("item_id", models.PositiveIntegerField()), + ( + "item_type", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="contenttypes.ContentType", + ), + ), ], ), migrations.CreateModel( - name='InfoItem', + name="InfoItem", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('expire_date', models.DateTimeField(blank=True, null=True)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=255)), + ("expire_date", models.DateTimeField(blank=True, null=True)), ], ), migrations.CreateModel( - name='Rotation', + name="Rotation", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=255)), ], ), migrations.CreateModel( - name='ABBInfoItem', + name="ABBInfoItem", fields=[ - ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ( + "infoitem_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="infoscreen.InfoItem", + ), + ), ], - bases=('infoscreen.infoitem',), + bases=("infoscreen.infoitem",), ), migrations.CreateModel( - name='ExternalImageInfoItem', + name="ExternalImageInfoItem", fields=[ - ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), - ('url', models.TextField()), + ( + "infoitem_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="infoscreen.InfoItem", + ), + ), + ("url", models.TextField()), ], - bases=('infoscreen.infoitem',), + bases=("infoscreen.infoitem",), ), migrations.CreateModel( - name='HslInfoItem', + name="HslInfoItem", fields=[ - ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ( + "infoitem_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="infoscreen.InfoItem", + ), + ), ], - bases=('infoscreen.infoitem',), + bases=("infoscreen.infoitem",), ), migrations.CreateModel( - name='ImageInfoItem', + name="ImageInfoItem", fields=[ - ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), - ('img', models.ImageField(upload_to='infoimages/')), + ( + "infoitem_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="infoscreen.InfoItem", + ), + ), + ("img", models.ImageField(upload_to="infoimages/")), ], - bases=('infoscreen.infoitem',), + bases=("infoscreen.infoitem",), ), migrations.CreateModel( - name='SossoInfoItem', + name="SossoInfoItem", fields=[ - ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ( + "infoitem_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="infoscreen.InfoItem", + ), + ), ], - bases=('infoscreen.infoitem',), + bases=("infoscreen.infoitem",), ), migrations.AddField( - model_name='infoinstance', - name='rotation', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='instances', to='infoscreen.Rotation'), + model_name="infoinstance", + name="rotation", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="instances", + to="infoscreen.Rotation", + ), ), ] diff --git a/infoscreen/migrations/0002_coffeeinfoitem.py b/infoscreen/migrations/0002_coffeeinfoitem.py index 254b344..24d61dd 100644 --- a/infoscreen/migrations/0002_coffeeinfoitem.py +++ b/infoscreen/migrations/0002_coffeeinfoitem.py @@ -9,15 +9,25 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('infoscreen', '0001_initial'), + ("infoscreen", "0001_initial"), ] operations = [ migrations.CreateModel( - name='CoffeeInfoItem', + name="CoffeeInfoItem", fields=[ - ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ( + "infoitem_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="infoscreen.InfoItem", + ), + ), ], - bases=('infoscreen.infoitem',), + bases=("infoscreen.infoitem",), ), ] diff --git a/infoscreen/migrations/0003_auto_20170329_1857.py b/infoscreen/migrations/0003_auto_20170329_1857.py index b6cb775..f967301 100644 --- a/infoscreen/migrations/0003_auto_20170329_1857.py +++ b/infoscreen/migrations/0003_auto_20170329_1857.py @@ -9,33 +9,63 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('infoscreen', '0002_coffeeinfoitem'), + ("infoscreen", "0002_coffeeinfoitem"), ] operations = [ migrations.CreateModel( - name='ApyInfoItem', + name="ApyInfoItem", fields=[ - ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ( + "infoitem_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="infoscreen.InfoItem", + ), + ), ], - bases=('infoscreen.infoitem',), + bases=("infoscreen.infoitem",), ), migrations.CreateModel( - name='EventInfoItem', + name="EventInfoItem", fields=[ - ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ( + "infoitem_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="infoscreen.InfoItem", + ), + ), ], - bases=('infoscreen.infoitem',), + bases=("infoscreen.infoitem",), ), migrations.CreateModel( - name='ExternalWebsiteInfoItem', + name="ExternalWebsiteInfoItem", fields=[ - ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), - ('url', models.TextField()), + ( + "infoitem_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="infoscreen.InfoItem", + ), + ), + ("url", models.TextField()), ], - bases=('infoscreen.infoitem',), + bases=("infoscreen.infoitem",), ), migrations.DeleteModel( - name='CoffeeInfoItem', + name="CoffeeInfoItem", ), ] diff --git a/infoscreen/migrations/0004_videoinfoitem.py b/infoscreen/migrations/0004_videoinfoitem.py index fe2f99e..d4ac180 100644 --- a/infoscreen/migrations/0004_videoinfoitem.py +++ b/infoscreen/migrations/0004_videoinfoitem.py @@ -9,16 +9,26 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('infoscreen', '0003_auto_20170329_1857'), + ("infoscreen", "0003_auto_20170329_1857"), ] operations = [ migrations.CreateModel( - name='VideoInfoItem', + name="VideoInfoItem", fields=[ - ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), - ('video', models.FileField(upload_to='infovideos/')), + ( + "infoitem_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="infoscreen.InfoItem", + ), + ), + ("video", models.FileField(upload_to="infovideos/")), ], - bases=('infoscreen.infoitem',), + bases=("infoscreen.infoitem",), ), ] diff --git a/infoscreen/migrations/0005_auto_20170913_1841.py b/infoscreen/migrations/0005_auto_20170913_1841.py index d23b561..be16c5b 100644 --- a/infoscreen/migrations/0005_auto_20170913_1841.py +++ b/infoscreen/migrations/0005_auto_20170913_1841.py @@ -8,18 +8,18 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('infoscreen', '0004_videoinfoitem'), + ("infoscreen", "0004_videoinfoitem"), ] operations = [ migrations.AlterField( - model_name='externalimageinfoitem', - name='url', + model_name="externalimageinfoitem", + name="url", field=models.URLField(), ), migrations.AlterField( - model_name='externalwebsiteinfoitem', - name='url', + model_name="externalwebsiteinfoitem", + name="url", field=models.URLField(), ), ] diff --git a/infoscreen/migrations/0006_delete_hsldatamodel.py b/infoscreen/migrations/0006_delete_hsldatamodel.py index fdc0f83..f7e2e53 100644 --- a/infoscreen/migrations/0006_delete_hsldatamodel.py +++ b/infoscreen/migrations/0006_delete_hsldatamodel.py @@ -8,14 +8,14 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('infoscreen', '0005_auto_20170913_1841'), + ("infoscreen", "0005_auto_20170913_1841"), ] operations = [ migrations.DeleteModel( - name='HSLDataModel', + name="HSLDataModel", ), migrations.DeleteModel( - name='HslInfoItem', + name="HslInfoItem", ), ] diff --git a/infoscreen/migrations/0007_lunchitem.py b/infoscreen/migrations/0007_lunchitem.py index ed201b6..cf07d57 100644 --- a/infoscreen/migrations/0007_lunchitem.py +++ b/infoscreen/migrations/0007_lunchitem.py @@ -7,15 +7,25 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('infoscreen', '0006_delete_hsldatamodel'), + ("infoscreen", "0006_delete_hsldatamodel"), ] operations = [ migrations.CreateModel( - name='LunchItem', + name="LunchItem", fields=[ - ('infoitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='infoscreen.InfoItem')), + ( + "infoitem_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="infoscreen.InfoItem", + ), + ), ], - bases=('infoscreen.infoitem',), + bases=("infoscreen.infoitem",), ), ] diff --git a/infoscreen/models.py b/infoscreen/models.py index 65058a1..2610f23 100644 --- a/infoscreen/models.py +++ b/infoscreen/models.py @@ -23,14 +23,14 @@ class InfoItem(models.Model): def get_template_url(self): """Get infoscreen template url.""" - raise NotImplementedError( - "inheriting classes must implement get_template_url") + raise NotImplementedError("inheriting classes must implement get_template_url") @staticmethod def get_create_template_url(): """Get create infoscreen template url command.""" raise NotImplementedError( - "inheriting classes must implement get_create_template_url") + "inheriting classes must implement get_create_template_url" + ) @classmethod def create_from_dict(cls, d): @@ -42,14 +42,13 @@ class InfoItem(models.Model): def update_from_dict(self, d): """Update model based on given dict.""" try: - expire_date = d.pop('expire_date', None) - self.expire_date = datetime.strptime( - expire_date, "%Y-%m-%d %H:%M:%S") + expire_date = d.pop("expire_date", None) + self.expire_date = datetime.strptime(expire_date, "%Y-%m-%d %H:%M:%S") except: pass dmap = { - 'name': 'name', + "name": "name", } for k, v in d.items(): try: @@ -61,13 +60,13 @@ class InfoItem(models.Model): def get_dict(self): """Convert django model to dict and return it.""" return { - 'id': self.id, - 'name': self.name, - 'item_type': ContentType.objects.get_for_model(self).id, - 'template_url': self.get_template_url(), - 'display_name': self.display_name, - 'create_template_url': self.get_create_template_url(), - 'options': {} + "id": self.id, + "name": self.name, + "item_type": ContentType.objects.get_for_model(self).id, + "template_url": self.get_template_url(), + "display_name": self.display_name, + "create_template_url": self.get_create_template_url(), + "options": {}, } def delete(self): @@ -75,8 +74,8 @@ class InfoItem(models.Model): # since generic foreign keys suck, delete info # items pointing here manually InfoInstance.objects.filter( - item_id=self.id, - item_type=ContentType.objects.get_for_model(self)).delete() + item_id=self.id, item_type=ContentType.objects.get_for_model(self) + ).delete() super().delete() @classmethod @@ -139,7 +138,7 @@ class ExternalWebsiteInfoItem(InfoItem): def get_dict(self): """Convert django model to dict and return it.""" d = super().get_dict() - d["options"] = {'url': self.url} + d["options"] = {"url": self.url} return d @classmethod @@ -152,23 +151,22 @@ class ExternalWebsiteInfoItem(InfoItem): def get_list(self): """Return list containing infoitem data.""" return { - 'id': self.id, - 'name': self.name, - 'url': self.url, + "id": self.id, + "name": self.name, + "url": self.url, } def update_from_dict(self, d): """Update model based on given dict.""" try: - expire_date = d.pop('expire_date', None) - self.expire_date = datetime.strptime( - expire_date, "%Y-%m-%d %H:%M:%S") + expire_date = d.pop("expire_date", None) + self.expire_date = datetime.strptime(expire_date, "%Y-%m-%d %H:%M:%S") except: pass dmap = { - 'name': 'name', - 'url': 'url', + "name": "name", + "url": "url", } for k, v in d.items(): try: @@ -241,14 +239,14 @@ class ImageInfoItem(InfoItem): def get_dict(self): """Convert django model to dict and return it.""" d = super().get_dict() - d["options"] = {'img': self.img.url} + d["options"] = {"img": self.img.url} return d class VideoInfoItem(InfoItem): """Class for Video Infoscreen item.""" - display_name = ("Video") + display_name = "Video" video = models.FileField(upload_to="infovideos/") def get_template_url(self): @@ -263,7 +261,7 @@ class VideoInfoItem(InfoItem): def get_dict(self): """Convert django model to dict and return it.""" d = super().get_dict() - d["options"] = {'video': self.video.url} + d["options"] = {"video": self.video.url} return d @@ -285,7 +283,7 @@ class ExternalImageInfoItem(InfoItem): def get_dict(self): """Convert django model to dict and return it.""" d = super().get_dict() - d["options"] = {'img': self.url} + d["options"] = {"img": self.url} return d @classmethod @@ -298,15 +296,14 @@ class ExternalImageInfoItem(InfoItem): def update_from_dict(self, d): """Update model based on given dict.""" try: - expire_date = d.pop('expire_date', None) - self.expire_date = datetime.strptime( - expire_date, "%Y-%m-%d %H:%M:%S") + expire_date = d.pop("expire_date", None) + self.expire_date = datetime.strptime(expire_date, "%Y-%m-%d %H:%M:%S") except: pass dmap = { - 'name': 'name', - 'url': 'url', + "name": "name", + "url": "url", } for k, v in d.items(): try: @@ -319,12 +316,14 @@ class ExternalImageInfoItem(InfoItem): class InfoInstance(models.Model): """Class for Info instance in Infoscreen.""" - rotation = models.ForeignKey('Rotation', related_name='instances', on_delete=models.CASCADE) + rotation = models.ForeignKey( + "Rotation", related_name="instances", on_delete=models.CASCADE + ) duration = models.FloatField(default=15.0) # seconds # generic relation to some kind of InfoItem item_id = models.PositiveIntegerField() item_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) - item = GenericForeignKey('item_type', 'item_id') + item = GenericForeignKey("item_type", "item_id") @classmethod def create_from_dict(cls, d): @@ -337,26 +336,21 @@ class InfoInstance(models.Model): except: raise RuntimeError("invalid parameters supplied supplied") try: - return cls.objects.create( - rotation=rotation, - item=item, - duration=duration - ) + return cls.objects.create(rotation=rotation, item=item, duration=duration) except: raise RuntimeError("error while adding instance to db") def get_dict(self): """Convert django model to dict and return it.""" return { - 'id': self.id, - 'item': self.item.get_dict(), - 'duration': self.duration, + "id": self.id, + "item": self.item.get_dict(), + "duration": self.duration, } def __str__(self): """Return model name.""" - return "{}: {} ({}s)".format( - self.rotation.name, self.item.name, self.duration) + return "{}: {} ({}s)".format(self.rotation.name, self.item.name, self.duration) class Rotation(models.Model): @@ -370,21 +364,20 @@ class Rotation(models.Model): # to avoid excluding items with no expire_date) now = timezone.now() instances = self.instances.all() - filtered = filter(lambda i: (i.item.expire_date or now) >= now, - list(instances)) + filtered = filter(lambda i: (i.item.expire_date or now) >= now, list(instances)) instance_list = list(map(lambda i: i.get_dict(), filtered)) return { - 'id': self.id, - 'name': self.name, - 'instances': instance_list, + "id": self.id, + "name": self.name, + "instances": instance_list, } def get_list(self): """Return list containing infoitem data.""" return { - 'id': self.id, - 'name': self.name, + "id": self.id, + "name": self.name, } def __str__(self): diff --git a/infoscreen/tests.py b/infoscreen/tests.py index e2064d9..8f40831 100644 --- a/infoscreen/tests.py +++ b/infoscreen/tests.py @@ -35,6 +35,6 @@ class InfoscreenTestCase(TestCase): That would mean that something meaningful has been included in the response. """ - resp = self.c.get('/infoscreen/items') + resp = self.c.get("/infoscreen/items") content = resp.json() self.assertTrue(len(content) > 0) diff --git a/infoscreen/urls.py b/infoscreen/urls.py index 3de40b3..68275cc 100644 --- a/infoscreen/urls.py +++ b/infoscreen/urls.py @@ -27,30 +27,31 @@ from infoscreen.views import createApyItem from infoscreen.views import get_apy_json urlpatterns = [ - url(r'^$', default), - url(r'^admin$', admin), - url(r'^(?P\d+)$', index), - url(r'^items$', info_items), - url(r'^rotation/(?P\d+)$', rotation), - url(r'^rotations$', rotations), - url(r'^instance$', createInstance), - url(r'^instance/(?P\d+)$', deleteInstance), - url(r'^types$', info_types), - url(r'^delete_item/(?P\d+)/(?P\d+)$', delete_info_item), - url(r'^create_external_image$', createExternalImageInfoItem), - url(r'^create_image$', create_image_item), - url(r'^create_video$', create_video_item), - url(r'^create_abbitem$', createABBItem), - url(r'^create_sossoitem$', createSossoItem), - url(r'^create_lunchitem$', createLunchItem), - url(r'^create_eventitem$', createEventItem), - url(r'^create_apyitem$', createApyItem), - url(r'^create_websiteitem$', createExternalWebsiteItem), - url(r'^create_rotation$', create_rotation), - url(r'^delete_rotation/(?P\d+)$', delete_rotation), - url(r'^apyjson', get_apy_json), + url(r"^$", default), + url(r"^admin$", admin), + url(r"^(?P\d+)$", index), + url(r"^items$", info_items), + url(r"^rotation/(?P\d+)$", rotation), + url(r"^rotations$", rotations), + url(r"^instance$", createInstance), + url(r"^instance/(?P\d+)$", deleteInstance), + url(r"^types$", info_types), + url(r"^delete_item/(?P\d+)/(?P\d+)$", delete_info_item), + url(r"^create_external_image$", createExternalImageInfoItem), + url(r"^create_image$", create_image_item), + url(r"^create_video$", create_video_item), + url(r"^create_abbitem$", createABBItem), + url(r"^create_sossoitem$", createSossoItem), + url(r"^create_lunchitem$", createLunchItem), + url(r"^create_eventitem$", createEventItem), + url(r"^create_apyitem$", createApyItem), + url(r"^create_websiteitem$", createExternalWebsiteItem), + url(r"^create_rotation$", create_rotation), + url(r"^delete_rotation/(?P\d+)$", delete_rotation), + url(r"^apyjson", get_apy_json), ] if settings.DEBUG: from django.contrib.staticfiles.urls import staticfiles_urlpatterns + urlpatterns += staticfiles_urlpatterns() diff --git a/infoscreen/views/admin_views.py b/infoscreen/views/admin_views.py index 45d107b..f251442 100644 --- a/infoscreen/views/admin_views.py +++ b/infoscreen/views/admin_views.py @@ -16,16 +16,27 @@ import threading import requests from infoscreen.models import ( - Rotation, InfoItem, InfoInstance, ABBInfoItem, ExternalImageInfoItem, - ImageInfoItem, SossoInfoItem, LunchItem, EventInfoItem, - ExternalWebsiteInfoItem, ImageUploadForm, ApyInfoItem, VideoInfoItem) + Rotation, + InfoItem, + InfoInstance, + ABBInfoItem, + ExternalImageInfoItem, + ImageInfoItem, + SossoInfoItem, + LunchItem, + EventInfoItem, + ExternalWebsiteInfoItem, + ImageUploadForm, + ApyInfoItem, + VideoInfoItem, +) -@login_required(login_url='/admin/login') -@permission_required('infoscreen.change_infoinstance', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("infoscreen.change_infoinstance", raise_exception=True) def admin(request, *args, **kwargs): """Render infoscreen admin page.""" - return render(request, 'infoscreen:infoscreen_admin.html', {}) + return render(request, "infoscreen:infoscreen_admin.html", {}) def create_item_generator(model): @@ -33,20 +44,23 @@ def create_item_generator(model): @ensure_csrf_cookie @require_http_methods(["POST"]) - @login_required(login_url='/admin/login') - @permission_required('infoscreen.add_infoinstance', raise_exception=True) + @login_required(login_url="/admin/login") + @permission_required("infoscreen.add_infoinstance", raise_exception=True) def create_item(request, *args, **kwargs): try: data = json.loads(request.body.decode("utf-8")) except json.JSONDecodeError: return HttpResponseBadRequest( - '{"status":"failure","error":"invalid json supplied"}') + '{"status":"failure","error":"invalid json supplied"}' + ) try: model.create_from_dict(data) return HttpResponse('{"status":"success"}') except RuntimeError as e: return HttpResponseBadRequest( - json.dumps({"status": "failure", "error": str(e)})) + json.dumps({"status": "failure", "error": str(e)}) + ) + return create_item @@ -55,8 +69,8 @@ def delete_item_generator(model): @ensure_csrf_cookie @require_http_methods(["DELETE"]) - @login_required(login_url='/admin/login') - @permission_required('infoscreen.delete_infoinstance', raise_exception=True) + @login_required(login_url="/admin/login") + @permission_required("infoscreen.delete_infoinstance", raise_exception=True) def delete_item(request, *args, **kwargs): idx = kwargs.pop("idx", 0) try: @@ -72,13 +86,14 @@ def delete_item_generator(model): resp = HttpResponse('{"error" : "could not delete item"}') resp.status_code = 500 return resp + return delete_item # due to model structure this is little complicated @ensure_csrf_cookie -@login_required(login_url='/admin/login') -@permission_required('infoscreen.delete_infoinstance', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("infoscreen.delete_infoinstance", raise_exception=True) @require_http_methods(["DELETE"]) def delete_info_item(request, *args, **kwargs): """Delete info item.""" @@ -102,42 +117,44 @@ def delete_info_item(request, *args, **kwargs): @require_http_methods(["POST"]) @ensure_csrf_cookie -@login_required(login_url='/admin/login') -@permission_required('infoscreen.add_infoinstance', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("infoscreen.add_infoinstance", raise_exception=True) def create_image_item(request, *args, **kwargs): """Create image Infoscreen item.""" form = ImageUploadForm(request.POST, request.FILES) if not form.is_valid(): - return HttpResponseBadRequest('{"status": "failure",' - '"error": "invalid data supplied"}') + return HttpResponseBadRequest( + '{"status": "failure",' '"error": "invalid data supplied"}' + ) - img = form.cleaned_data['image'] - name = form.cleaned_data['name'] + img = form.cleaned_data["image"] + name = form.cleaned_data["name"] ImageInfoItem.objects.create(img=img, name=name) return HttpResponse('{"status":"success"}') @require_http_methods(["POST"]) @ensure_csrf_cookie -@login_required(login_url='/admin/login') -@permission_required('infoscreen.add_infoinstance', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("infoscreen.add_infoinstance", raise_exception=True) def create_video_item(request, *args, **kwargs): """Create video Infoscreen item.""" form = UploadFileForm(request.POST, request.FILES) if not form.is_valid(): - return HttpResponseBadRequest('{"status": "failure",' - '"error": "invalid data supplied"}') + return HttpResponseBadRequest( + '{"status": "failure",' '"error": "invalid data supplied"}' + ) - video = form.cleaned_data['video'] - name = form.cleaned_data['name'] + video = form.cleaned_data["video"] + name = form.cleaned_data["name"] VideoInfoItem.objects.create(video=video, name=name) return HttpResponse('{"status": "success"}') @require_http_methods(["POST"]) @ensure_csrf_cookie -@login_required(login_url='/admin/login') -@permission_required('infoscreen.add_rotation', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("infoscreen.add_rotation", raise_exception=True) def create_rotation(request, *args, **kwargs): """Create rotation.""" try: @@ -150,16 +167,15 @@ def create_rotation(request, *args, **kwargs): Rotation.objects.create(name=name) resp = HttpResponse(status=200) except DatabaseError: - resp = HttpResponse( - '{"error" : "could not create rotation!"}', status=400) + resp = HttpResponse('{"error" : "could not create rotation!"}', status=400) return resp @require_http_methods(["DELETE"]) @ensure_csrf_cookie -@login_required(login_url='/admin/login') -@permission_required('infoscreen.delete_rotation', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("infoscreen.delete_rotation", raise_exception=True) def delete_rotation(request, *args, **kwargs): """Delete rotation.""" id = kwargs.pop("id", 0) @@ -169,8 +185,7 @@ def delete_rotation(request, *args, **kwargs): Rotation.objects.filter(id=id).delete() resp = HttpResponse(status=200) except DatabaseError: - resp = HttpResponse( - '{"error" : "could not delete rotation!"}', status=400) + resp = HttpResponse('{"error" : "could not delete rotation!"}', status=400) return resp diff --git a/infoscreen/views/public_views.py b/infoscreen/views/public_views.py index 3dcfa58..978543c 100644 --- a/infoscreen/views/public_views.py +++ b/infoscreen/views/public_views.py @@ -15,7 +15,7 @@ import requests @require_http_methods(["GET"]) def index(request, idx, *args, **kwargs): """Render infoscreen index page.""" - return render(request, 'infoscreen_index.html', {'rotation': idx}) + return render(request, "infoscreen_index.html", {"rotation": idx}) @require_http_methods(["GET"]) @@ -32,7 +32,8 @@ def default(request, *args, **kwargs): def get_apy_json(request): """Render APY diilikone page.""" return HttpResponse( - requests.get("https://api-diilikone.apy.fi/deals/top-groups").text) + requests.get("https://api-diilikone.apy.fi/deals/top-groups").text + ) @require_http_methods(["GET"]) @@ -61,10 +62,12 @@ def info_types(request, *args, **kwargs): types = [] classes = InfoItem.get_subclasses() for c in classes: - types.append({ - "name": c.display_name, - "create_template_url": c.get_create_template_url(), - }) + types.append( + { + "name": c.display_name, + "create_template_url": c.get_create_template_url(), + } + ) return HttpResponse(json.dumps(types)) diff --git a/kaehmy/apps.py b/kaehmy/apps.py index 7826c5f..592373c 100644 --- a/kaehmy/apps.py +++ b/kaehmy/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class KaehmyConfig(AppConfig): - name = 'kaehmy' + name = "kaehmy" diff --git a/kaehmy/forms.py b/kaehmy/forms.py index 7c0a80a..8190251 100644 --- a/kaehmy/forms.py +++ b/kaehmy/forms.py @@ -6,12 +6,16 @@ from kaehmy.models import PresetRole, CustomRole, Application, Comment, KaehmyBa class CheckboxSelectMultiple(forms.widgets.CheckboxSelectMultiple): - option_template_name = 'checkbox_option.html' + option_template_name = "checkbox_option.html" - def create_option(self, name, value, label, selected, index, subindex=None, attrs=None): - dic = super(CheckboxSelectMultiple, self).create_option(name, value, label, selected, index, subindex, attrs) + def create_option( + self, name, value, label, selected, index, subindex=None, attrs=None + ): + dic = super(CheckboxSelectMultiple, self).create_option( + name, value, label, selected, index, subindex, attrs + ) description = PresetRole.objects.get(id=value).description - dic['description'] = description + dic["description"] = description return dic def __init__(self, *args, **kwargs): @@ -25,30 +29,46 @@ class ApplicationForm(forms.ModelForm): """Meta for class Application.""" model = Application - fields = ['name', 'email', 'phone_number', 'year', - 'preset_roles', 'custom_roles', 'custom_role_name', - 'custom_role_is_board', 'text'] + fields = [ + "name", + "email", + "phone_number", + "year", + "preset_roles", + "custom_roles", + "custom_role_name", + "custom_role_is_board", + "text", + ] def __init__(self, *args, **kwargs): super(ApplicationForm, self).__init__(*args, **kwargs) - self.fields["email"].label = _('Email (not public)') - self.fields["phone_number"].label = _('Phone number (not public)') + self.fields["email"].label = _("Email (not public)") + self.fields["phone_number"].label = _("Phone number (not public)") custom_roles_exist = CustomRole.objects.all().exists() - self.fields["custom_roles"].widget = forms.widgets.CheckboxSelectMultiple() if custom_roles_exist else forms.HiddenInput() + self.fields["custom_roles"].widget = ( + forms.widgets.CheckboxSelectMultiple() + if custom_roles_exist + else forms.HiddenInput() + ) self.fields["custom_roles"].help_text = "" - self.fields["custom_roles"].label = _('Custom roles') + self.fields["custom_roles"].label = _("Custom roles") self.fields["custom_roles"].queryset = CustomRole.objects.all() for cat_id, category in KaehmyBaseRole.CATEGORIES: - key = 'preset_roles_{}'.format(cat_id) - qset = PresetRole.objects.filter(category=cat_id).order_by('category', '-is_board') + key = "preset_roles_{}".format(cat_id) + qset = PresetRole.objects.filter(category=cat_id).order_by( + "category", "-is_board" + ) self.fields[key] = forms.ModelMultipleChoiceField(qset) - self.fields[key].widget = CheckboxSelectMultiple(attrs={ - 'title': _('Preset roles'), - 'name': 'preset_roles', - }) + self.fields[key].widget = CheckboxSelectMultiple( + attrs={ + "title": _("Preset roles"), + "name": "preset_roles", + } + ) self.fields[key].help_text = "" self.fields[key].queryset = qset self.fields[key].label = _(category) @@ -57,33 +77,38 @@ class ApplicationForm(forms.ModelForm): def clean(self): cleaned_data = super(ApplicationForm, self).clean() for key in cleaned_data.keys(): - if 'preset_roles_' in key: - cleaned_data['preset_roles'] = cleaned_data['preset_roles'] | cleaned_data[key] + if "preset_roles_" in key: + cleaned_data["preset_roles"] = ( + cleaned_data["preset_roles"] | cleaned_data[key] + ) return cleaned_data def clean_phone_number(self): """Clean phone number field.""" - number = self.cleaned_data.get('phone_number') + number = self.cleaned_data.get("phone_number") if number.isdigit(): return number else: - raise ValidationError(_('Invalid phone number')) + raise ValidationError(_("Invalid phone number")) def clean_custom_role_name(self): """Check that no other custom role with same name exists.""" - custom_name = self.cleaned_data.get('custom_role_name') + custom_name = self.cleaned_data.get("custom_role_name") if not CustomRole.objects.filter(name=custom_name).exists(): return custom_name else: - raise ValidationError(_('Custom role with the same name already exists.')) + raise ValidationError(_("Custom role with the same name already exists.")) def non_role_fields(self): - return [self.fields[k] for k in self.fields.keys() if k not in ["preset_roles", "custom_roles"]] + return [ + self.fields[k] + for k in self.fields.keys() + if k not in ["preset_roles", "custom_roles"] + ] class CommentForm(forms.ModelForm): - class Meta: model = Comment - fields = ['name', 'email', 'message', 'parent'] + fields = ["name", "email", "message", "parent"] diff --git a/kaehmy/migrations/0001_initial.py b/kaehmy/migrations/0001_initial.py index ad54327..c1ef1d1 100644 --- a/kaehmy/migrations/0001_initial.py +++ b/kaehmy/migrations/0001_initial.py @@ -12,82 +12,188 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('webapp', '0037_auto_20180125_2131'), + ("webapp", "0037_auto_20180125_2131"), ] operations = [ migrations.CreateModel( - name='CommentParent', + name="CommentParent", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(default='', max_length=255, verbose_name='Name')), - ('email', models.EmailField(default='', max_length=254, verbose_name='Email')), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Timestamp')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "name", + models.CharField(default="", max_length=255, verbose_name="Name"), + ), + ( + "email", + models.EmailField(default="", max_length=254, verbose_name="Email"), + ), + ( + "timestamp", + models.DateTimeField( + default=django.utils.timezone.now, verbose_name="Timestamp" + ), + ), ], ), migrations.CreateModel( - name='CustomRole', + name="CustomRole", fields=[ - ('baserole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseRole')), + ( + "baserole_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.BaseRole", + ), + ), ], options={ - 'verbose_name_plural': 'Custom kaehmy roles', - 'verbose_name': 'Custom kaehmy role', + "verbose_name_plural": "Custom kaehmy roles", + "verbose_name": "Custom kaehmy role", }, - bases=('webapp.baserole',), + bases=("webapp.baserole",), ), migrations.CreateModel( - name='PresetRole', + name="PresetRole", fields=[ - ('presetrole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.PresetRole')), + ( + "presetrole_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.PresetRole", + ), + ), ], options={ - 'verbose_name_plural': 'Preset kaehmy roles', - 'verbose_name': 'Preset kaehmy role', + "verbose_name_plural": "Preset kaehmy roles", + "verbose_name": "Preset kaehmy role", }, - bases=('webapp.presetrole',), + bases=("webapp.presetrole",), ), migrations.CreateModel( - name='TelegramChannel', + name="TelegramChannel", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('channel_id', models.CharField(max_length=255, unique=True)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=255)), + ("channel_id", models.CharField(max_length=255, unique=True)), ], options={ - 'verbose_name_plural': 'Telegram channels', - 'verbose_name': 'Telegram channel', + "verbose_name_plural": "Telegram channels", + "verbose_name": "Telegram channel", }, ), migrations.CreateModel( - name='Application', + name="Application", fields=[ - ('commentparent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='kaehmy.CommentParent')), - ('phone_number', models.CharField(default='', max_length=10, verbose_name='Phone number')), - ('year', models.IntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, 'N')], verbose_name='Year')), - ('text', models.TextField(default='', max_length=300, verbose_name='Text')), - ('custom_role_name', models.CharField(blank=True, max_length=255, verbose_name='Custom role name')), - ('custom_role_is_board', models.BooleanField(verbose_name='Board member')), - ('custom_roles', models.ManyToManyField(blank=True, related_name='forms', to='kaehmy.CustomRole')), - ('preset_roles', models.ManyToManyField(blank=True, related_name='forms', to='kaehmy.PresetRole')), + ( + "commentparent_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="kaehmy.CommentParent", + ), + ), + ( + "phone_number", + models.CharField( + default="", max_length=10, verbose_name="Phone number" + ), + ), + ( + "year", + models.IntegerField( + choices=[(1, "1"), (2, "2"), (3, "3"), (4, "4"), (5, "N")], + verbose_name="Year", + ), + ), + ( + "text", + models.TextField(default="", max_length=300, verbose_name="Text"), + ), + ( + "custom_role_name", + models.CharField( + blank=True, max_length=255, verbose_name="Custom role name" + ), + ), + ( + "custom_role_is_board", + models.BooleanField(verbose_name="Board member"), + ), + ( + "custom_roles", + models.ManyToManyField( + blank=True, related_name="forms", to="kaehmy.CustomRole" + ), + ), + ( + "preset_roles", + models.ManyToManyField( + blank=True, related_name="forms", to="kaehmy.PresetRole" + ), + ), ], options={ - 'verbose_name_plural': 'Kaehmylomakkeet', - 'verbose_name': 'Kaehmylomake', + "verbose_name_plural": "Kaehmylomakkeet", + "verbose_name": "Kaehmylomake", }, - bases=('kaehmy.commentparent',), + bases=("kaehmy.commentparent",), ), migrations.CreateModel( - name='Comment', + name="Comment", fields=[ - ('commentparent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='kaehmy.CommentParent')), - ('message', models.TextField(verbose_name='Message')), - ('parent', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='kaehmy.CommentParent')), + ( + "commentparent_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="kaehmy.CommentParent", + ), + ), + ("message", models.TextField(verbose_name="Message")), + ( + "parent", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="messages", + to="kaehmy.CommentParent", + ), + ), ], options={ - 'verbose_name_plural': 'Kaehmykommentit', - 'verbose_name': 'Kaehmykommentti', + "verbose_name_plural": "Kaehmykommentit", + "verbose_name": "Kaehmykommentti", }, - bases=('kaehmy.commentparent',), + bases=("kaehmy.commentparent",), ), ] diff --git a/kaehmy/migrations/0002_auto_20180902_1929.py b/kaehmy/migrations/0002_auto_20180902_1929.py index 4da42b8..1e524a7 100644 --- a/kaehmy/migrations/0002_auto_20180902_1929.py +++ b/kaehmy/migrations/0002_auto_20180902_1929.py @@ -7,26 +7,59 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('webapp', '0047_auto_20180710_2110'), - ('kaehmy', '0001_initial'), + ("webapp", "0047_auto_20180710_2110"), + ("kaehmy", "0001_initial"), ] operations = [ migrations.CreateModel( - name='KaehmyBaseRole', + name="KaehmyBaseRole", fields=[ - ('baserole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseRole')), - ('category', models.CharField(choices=[('corporate', 'Corporate affairs'), ('freshman', 'Freshmen'), ('international', 'International'), ('external', 'External affairs'), ('media', 'Media'), ('tech', 'Technology'), ('wellbeing', 'Wellbeing'), ('elepaja', 'Elepaja'), ('ceremonies', 'Ceremonies'), ('culture', 'Culture'), ('studies', 'Studies'), ('sosso', 'Sössö magazine'), ('alumni', 'Alumni relations'), ('others', 'Others')], default='others', max_length=255, verbose_name='Category')), + ( + "baserole_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.BaseRole", + ), + ), + ( + "category", + models.CharField( + choices=[ + ("corporate", "Corporate affairs"), + ("freshman", "Freshmen"), + ("international", "International"), + ("external", "External affairs"), + ("media", "Media"), + ("tech", "Technology"), + ("wellbeing", "Wellbeing"), + ("elepaja", "Elepaja"), + ("ceremonies", "Ceremonies"), + ("culture", "Culture"), + ("studies", "Studies"), + ("sosso", "Sössö magazine"), + ("alumni", "Alumni relations"), + ("others", "Others"), + ], + default="others", + max_length=255, + verbose_name="Category", + ), + ), ], - bases=('webapp.baserole',), + bases=("webapp.baserole",), ), migrations.DeleteModel( - name='Application', + name="Application", ), migrations.DeleteModel( - name='customrole', + name="customrole", ), migrations.DeleteModel( - name='presetrole', + name="presetrole", ), ] diff --git a/kaehmy/migrations/0003_auto_20180902_1943.py b/kaehmy/migrations/0003_auto_20180902_1943.py index f94828f..622c932 100644 --- a/kaehmy/migrations/0003_auto_20180902_1943.py +++ b/kaehmy/migrations/0003_auto_20180902_1943.py @@ -7,57 +7,113 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('kaehmy', '0002_auto_20180902_1929'), + ("kaehmy", "0002_auto_20180902_1929"), ] operations = [ migrations.CreateModel( - name='Application', + name="Application", fields=[ - ('commentparent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='kaehmy.CommentParent')), - ('phone_number', models.CharField(default='', max_length=10, verbose_name='Phone number')), - ('year', models.IntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, 'N')], verbose_name='Year')), - ('text', models.TextField(default='', max_length=300, verbose_name='Text')), - ('custom_role_name', models.CharField(blank=True, max_length=255, verbose_name='Custom role name')), - ('custom_role_is_board', models.BooleanField(verbose_name='Board member')), + ( + "commentparent_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="kaehmy.CommentParent", + ), + ), + ( + "phone_number", + models.CharField( + default="", max_length=10, verbose_name="Phone number" + ), + ), + ( + "year", + models.IntegerField( + choices=[(1, "1"), (2, "2"), (3, "3"), (4, "4"), (5, "N")], + verbose_name="Year", + ), + ), + ( + "text", + models.TextField(default="", max_length=300, verbose_name="Text"), + ), + ( + "custom_role_name", + models.CharField( + blank=True, max_length=255, verbose_name="Custom role name" + ), + ), + ( + "custom_role_is_board", + models.BooleanField(verbose_name="Board member"), + ), ], options={ - 'verbose_name': 'Kaehmylomake', - 'verbose_name_plural': 'Kaehmylomakkeet', + "verbose_name": "Kaehmylomake", + "verbose_name_plural": "Kaehmylomakkeet", }, - bases=('kaehmy.commentparent',), + bases=("kaehmy.commentparent",), ), migrations.CreateModel( - name='CustomRole', + name="CustomRole", fields=[ - ('kaehmybaserole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='kaehmy.KaehmyBaseRole')), + ( + "kaehmybaserole_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="kaehmy.KaehmyBaseRole", + ), + ), ], options={ - 'verbose_name': 'Custom kaehmy role', - 'verbose_name_plural': 'Custom kaehmy roles', + "verbose_name": "Custom kaehmy role", + "verbose_name_plural": "Custom kaehmy roles", }, - bases=('kaehmy.kaehmybaserole',), + bases=("kaehmy.kaehmybaserole",), ), migrations.CreateModel( - name='PresetRole', + name="PresetRole", fields=[ - ('kaehmybaserole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='kaehmy.KaehmyBaseRole')), - ('description', models.TextField(verbose_name='Description')), + ( + "kaehmybaserole_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="kaehmy.KaehmyBaseRole", + ), + ), + ("description", models.TextField(verbose_name="Description")), ], options={ - 'verbose_name': 'Preset kaehmy role', - 'verbose_name_plural': 'Preset kaehmy roles', + "verbose_name": "Preset kaehmy role", + "verbose_name_plural": "Preset kaehmy roles", }, - bases=('kaehmy.kaehmybaserole',), + bases=("kaehmy.kaehmybaserole",), ), migrations.AddField( - model_name='application', - name='custom_roles', - field=models.ManyToManyField(blank=True, related_name='forms', to='kaehmy.CustomRole'), + model_name="application", + name="custom_roles", + field=models.ManyToManyField( + blank=True, related_name="forms", to="kaehmy.CustomRole" + ), ), migrations.AddField( - model_name='application', - name='preset_roles', - field=models.ManyToManyField(blank=True, related_name='forms', to='kaehmy.PresetRole'), + model_name="application", + name="preset_roles", + field=models.ManyToManyField( + blank=True, related_name="forms", to="kaehmy.PresetRole" + ), ), ] diff --git a/kaehmy/migrations/0004_auto_20181018_2121.py b/kaehmy/migrations/0004_auto_20181018_2121.py index 34165b7..b769eb7 100644 --- a/kaehmy/migrations/0004_auto_20181018_2121.py +++ b/kaehmy/migrations/0004_auto_20181018_2121.py @@ -6,13 +6,32 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('kaehmy', '0003_auto_20180902_1943'), + ("kaehmy", "0003_auto_20180902_1943"), ] operations = [ migrations.AlterField( - model_name='kaehmybaserole', - name='category', - field=models.CharField(choices=[('corporate', 'Corporate affairs'), ('freshman', 'Freshmen'), ('international', 'International'), ('external', 'External affairs'), ('media', 'Media'), ('tech', 'Technology'), ('wellbeing', 'Wellbeing'), ('elepaja', 'Elepaja'), ('ceremonies', 'Ceremonies'), ('studies', 'Studies'), ('sosso', 'Sössö magazine'), ('alumni', 'Alumni relations'), ('others', 'Others')], default='others', max_length=255, verbose_name='Category'), + model_name="kaehmybaserole", + name="category", + field=models.CharField( + choices=[ + ("corporate", "Corporate affairs"), + ("freshman", "Freshmen"), + ("international", "International"), + ("external", "External affairs"), + ("media", "Media"), + ("tech", "Technology"), + ("wellbeing", "Wellbeing"), + ("elepaja", "Elepaja"), + ("ceremonies", "Ceremonies"), + ("studies", "Studies"), + ("sosso", "Sössö magazine"), + ("alumni", "Alumni relations"), + ("others", "Others"), + ], + default="others", + max_length=255, + verbose_name="Category", + ), ), ] diff --git a/kaehmy/migrations/0005_auto_20190312_1458.py b/kaehmy/migrations/0005_auto_20190312_1458.py index 0213c16..47f249e 100644 --- a/kaehmy/migrations/0005_auto_20190312_1458.py +++ b/kaehmy/migrations/0005_auto_20190312_1458.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('kaehmy', '0004_auto_20181018_2121'), + ("kaehmy", "0004_auto_20181018_2121"), ] operations = [ migrations.AlterField( - model_name='application', - name='custom_role_is_board', - field=models.BooleanField(blank=True, verbose_name='Board member'), + model_name="application", + name="custom_role_is_board", + field=models.BooleanField(blank=True, verbose_name="Board member"), ), ] diff --git a/kaehmy/models.py b/kaehmy/models.py index f47374f..4bcc09f 100644 --- a/kaehmy/models.py +++ b/kaehmy/models.py @@ -10,56 +10,58 @@ from webapp.models import BaseRole # 2. Data migrate from webapp BaseRole to new kaehmy BaseRole # 3. Delete webapp BaseRole table -VERBOSE_NAME = _('Kaehmy') +VERBOSE_NAME = _("Kaehmy") class KaehmyBaseRole(BaseRole): """ABC""" CATEGORIES = ( - ('corporate', _('Corporate affairs')), - ('freshman', _('Freshmen')), - ('international', _('International')), - ('external', _('External affairs')), - ('media', _('Media')), - ('tech', _('Technology')), - ('wellbeing', _('Wellbeing')), - ('elepaja', _('Elepaja')), - ('ceremonies', _('Ceremonies')), - ('studies', _('Studies')), - ('sosso', _('Sössö magazine')), - ('alumni', _('Alumni relations')), - ('others', _('Others')), + ("corporate", _("Corporate affairs")), + ("freshman", _("Freshmen")), + ("international", _("International")), + ("external", _("External affairs")), + ("media", _("Media")), + ("tech", _("Technology")), + ("wellbeing", _("Wellbeing")), + ("elepaja", _("Elepaja")), + ("ceremonies", _("Ceremonies")), + ("studies", _("Studies")), + ("sosso", _("Sössö magazine")), + ("alumni", _("Alumni relations")), + ("others", _("Others")), + ) + category = models.CharField( + _("Category"), choices=CATEGORIES, default="others", max_length=255 ) - category = models.CharField(_('Category'), choices=CATEGORIES, default='others', max_length=255) class PresetRole(KaehmyBaseRole): """Model for kaehmy role.""" - description = models.TextField(_('Description')) + description = models.TextField(_("Description")) class Meta: - verbose_name = _('Preset kaehmy role') - verbose_name_plural = _('Preset kaehmy roles') + verbose_name = _("Preset kaehmy role") + verbose_name_plural = _("Preset kaehmy roles") class CustomRole(KaehmyBaseRole): """Model representing a user-specified custom occupation.""" class Meta: - verbose_name = _('Custom kaehmy role') - verbose_name_plural = _('Custom kaehmy roles') + verbose_name = _("Custom kaehmy role") + verbose_name_plural = _("Custom kaehmy roles") class CommentParent(models.Model): - name = models.CharField(_('Name'), max_length=255, default='') - email = models.EmailField(_('Email'), default='') - timestamp = models.DateTimeField(_('Timestamp'), default=timezone.now) + name = models.CharField(_("Name"), max_length=255, default="") + email = models.EmailField(_("Email"), default="") + timestamp = models.DateTimeField(_("Timestamp"), default=timezone.now) def __str__(self): - return 'Message parent #{}'.format(self.id) + return "Message parent #{}".format(self.id) class Comment(CommentParent): @@ -70,11 +72,13 @@ class Comment(CommentParent): """ class Meta: - verbose_name = _('Kaehmykommentti') - verbose_name_plural = _('Kaehmykommentit') + verbose_name = _("Kaehmykommentti") + verbose_name_plural = _("Kaehmykommentit") - message = models.TextField(_('Message')) - parent = models.ForeignKey('CommentParent', related_name='messages', on_delete=models.CASCADE) + message = models.TextField(_("Message")) + parent = models.ForeignKey( + "CommentParent", related_name="messages", on_delete=models.CASCADE + ) class Application(CommentParent): @@ -83,34 +87,36 @@ class Application(CommentParent): Allows user to choose from existing roles or to create custom ones. """ + YEAR_CHOICES = ( - (1, '1'), - (2, '2'), - (3, '3'), - (4, '4'), - (5, 'N'), + (1, "1"), + (2, "2"), + (3, "3"), + (4, "4"), + (5, "N"), ) class Meta: - verbose_name = _('Kaehmylomake') - verbose_name_plural = _('Kaehmylomakkeet') + verbose_name = _("Kaehmylomake") + verbose_name_plural = _("Kaehmylomakkeet") - phone_number = models.CharField( - _('Phone number'), max_length=10, default="") - year = models.IntegerField(_('Year'), choices=YEAR_CHOICES) - text = models.TextField(_('Text'), default="", max_length=300) + phone_number = models.CharField(_("Phone number"), max_length=10, default="") + year = models.IntegerField(_("Year"), choices=YEAR_CHOICES) + text = models.TextField(_("Text"), default="", max_length=300) custom_role_name = models.CharField( - _('Custom role name'), max_length=255, blank=True) - custom_role_is_board = models.BooleanField( - _('Board member'), blank=True) + _("Custom role name"), max_length=255, blank=True + ) + custom_role_is_board = models.BooleanField(_("Board member"), blank=True) custom_roles = models.ManyToManyField( - 'kaehmy.CustomRole', related_name='forms', blank=True) + "kaehmy.CustomRole", related_name="forms", blank=True + ) preset_roles = models.ManyToManyField( - 'kaehmy.PresetRole', related_name='forms', blank=True) + "kaehmy.PresetRole", related_name="forms", blank=True + ) def __str__(self): """Return model info.""" - return _('Kaehmy application: {}').format(self.name) + return _("Kaehmy application: {}").format(self.name) def comment_count(self): """Count comments for kaehmy.""" @@ -132,22 +138,30 @@ class Application(CommentParent): presets = [r.name.capitalize() for r in self.preset_roles.filter(is_board=True)] customs = [r.name.capitalize() for r in self.custom_roles.filter(is_board=True)] combined = presets + customs - return _('Board: {}').format(', '.join(combined)) if len(combined) > 0 else '' + return _("Board: {}").format(", ".join(combined)) if len(combined) > 0 else "" def official_roles(self): - presets = [r.name.capitalize() for r in self.preset_roles.filter(is_board=False)] - customs = [r.name.capitalize() for r in self.custom_roles.filter(is_board=False)] + presets = [ + r.name.capitalize() for r in self.preset_roles.filter(is_board=False) + ] + customs = [ + r.name.capitalize() for r in self.custom_roles.filter(is_board=False) + ] combined = presets + customs - return _('Official: {}').format(', '.join(combined)) if len(combined) > 0 else '' + return ( + _("Official: {}").format(", ".join(combined)) if len(combined) > 0 else "" + ) def all_roles(self): presets = [r.name.capitalize() for r in self.preset_roles.all()] customs = [r.name.capitalize() for r in self.custom_roles.all()] combined = presets + customs - return ', '.join(combined) if len(combined) > 0 else '' + return ", ".join(combined) if len(combined) > 0 else "" def has_any_board_role(self): - return self.preset_roles.filter(is_board=True).exists() or self.custom_roles.filter(is_board=True) + return self.preset_roles.filter( + is_board=True + ).exists() or self.custom_roles.filter(is_board=True) # Telegram channel entry for Kaehmys @@ -155,8 +169,8 @@ class TelegramChannel(models.Model): """Model containing the channel id of a Telegram chat""" class Meta: - verbose_name = _('Telegram channel') - verbose_name_plural = _('Telegram channels') + verbose_name = _("Telegram channel") + verbose_name_plural = _("Telegram channels") name = models.CharField(max_length=255) channel_id = models.CharField(max_length=255, unique=True) diff --git a/kaehmy/tables.py b/kaehmy/tables.py index ffbfe22..90baba7 100644 --- a/kaehmy/tables.py +++ b/kaehmy/tables.py @@ -8,6 +8,12 @@ from kaehmy.models import Application class ExportTable(tables.Table): class Meta: model = Application - exclude = ['text', 'messageparent_ptr', 'custom_role_name', 'custom_role_is_board', 'timestamp'] + exclude = [ + "text", + "messageparent_ptr", + "custom_role_name", + "custom_role_is_board", + "timestamp", + ] - all_roles = tables.Column(verbose_name=_('Roles'), orderable=False) + all_roles = tables.Column(verbose_name=_("Roles"), orderable=False) diff --git a/kaehmy/tgbot.py b/kaehmy/tgbot.py index 248f7eb..b3e0fdf 100644 --- a/kaehmy/tgbot.py +++ b/kaehmy/tgbot.py @@ -1,7 +1,7 @@ -''' +""" A telegram bot api for whatever purposes. TODO: kaehmy app is definitely not correct place for this -''' +""" import logging import requests from django.conf import settings @@ -9,16 +9,18 @@ from kaehmy.models import TelegramChannel class TelegramBot: - ''' + """ A telegram bot api for whatever purposes Currently only able to broadcast stuff to all registered channels using broadcast method. - ''' + """ def __init__(self, api_token=None): self.api_token = api_token or settings.TELEGRAM_BOT_TOKEN - self.send_message_url = "https://api.telegram.org/bot{}/sendMessage".format(self.api_token) + self.send_message_url = "https://api.telegram.org/bot{}/sendMessage".format( + self.api_token + ) def broadcast(self, message): channels_ids = TelegramChannel.objects.values_list("channel_id", flat=True) @@ -26,13 +28,9 @@ class TelegramBot: self.send_message(id_, message) def send_message(self, channel_id, message): - ''' + """ Send message to a chat with given channel_id - ''' - data = { - 'chat_id': channel_id, - 'text': message, - 'parse_mode': 'Markdown' - } + """ + data = {"chat_id": channel_id, "text": message, "parse_mode": "Markdown"} resp = requests.post(self.send_message_url, json=data) logging.debug(resp.content) diff --git a/kaehmy/translation.py b/kaehmy/translation.py index 0448e17..c5cac8a 100644 --- a/kaehmy/translation.py +++ b/kaehmy/translation.py @@ -6,13 +6,13 @@ from kaehmy.models import PresetRole, CustomRole @register(PresetRole) class PresetRoleTranslationOptions(TranslationOptions): - """ Class for PresetRole translation options""" + """Class for PresetRole translation options""" fields = () @register(CustomRole) class CustomRoleTranslationOptions(TranslationOptions): - """ Class for CustomROle translation options""" + """Class for CustomROle translation options""" fields = () diff --git a/kaehmy/urls.py b/kaehmy/urls.py index e385559..ce1bbb2 100644 --- a/kaehmy/urls.py +++ b/kaehmy/urls.py @@ -13,14 +13,15 @@ from kaehmy.views import export_view urlpatterns = [ # kaehmy - url(r'^new', view), - url(r'^submit', submit), - url(r'^add_comment', comment), - url(r'^statistics', statistics_view), - url(r'^export', export_view), - url(r'^$', list_view), + url(r"^new", view), + url(r"^submit", submit), + url(r"^add_comment", comment), + url(r"^statistics", statistics_view), + url(r"^export", export_view), + url(r"^$", list_view), ] if settings.DEBUG: from django.contrib.staticfiles.urls import staticfiles_urlpatterns + urlpatterns += staticfiles_urlpatterns() diff --git a/members/admin.py b/members/admin.py index 8124496..a36f950 100644 --- a/members/admin.py +++ b/members/admin.py @@ -8,4 +8,4 @@ admin.site.register(Member) admin.site.register(Request) admin.site.register(Payment) -admin.site.site_header = 'SIK Admin' +admin.site.site_header = "SIK Admin" diff --git a/members/apps.py b/members/apps.py index 77801d7..fbed47e 100644 --- a/members/apps.py +++ b/members/apps.py @@ -6,4 +6,4 @@ from django.apps import AppConfig class MembersConfig(AppConfig): """Class for Members app configurations.""" - name = 'members' + name = "members" diff --git a/members/forms.py b/members/forms.py index a946b2c..b10cda4 100644 --- a/members/forms.py +++ b/members/forms.py @@ -23,7 +23,7 @@ class MemberForm(forms.ModelForm): """Meta for Member model form.""" model = Member - fields = ['first_name', 'last_name', 'email', 'POR', 'AYY', 'jas'] + fields = ["first_name", "last_name", "email", "POR", "AYY", "jas"] class ImportResult: def __init__(self, members, payments): @@ -32,22 +32,27 @@ class MemberForm(forms.ModelForm): def _clean_boolean_field(self, key): value = self.data.get(key, None) - if value in ['1', '0']: + if value in ["1", "0"]: return bool(int(value)) else: - return value == 'on' + return value == "on" def clean_jas(self): - return self._clean_boolean_field('jas') + return self._clean_boolean_field("jas") def clean_AYY(self): - return self._clean_boolean_field('AYY') + return self._clean_boolean_field("AYY") @staticmethod - def csv_to_models(data, payment_source='AYY', delimiter=','): - clean_data = data.strip().split('\n') - clean_data = [row.rstrip(',').rstrip('\r').strip() for row in clean_data] - csv_reader = csv.DictReader(clean_data, fieldnames=MemberForm.Meta.fields, delimiter=delimiter, quoting=csv.QUOTE_NONE) + def csv_to_models(data, payment_source="AYY", delimiter=","): + clean_data = data.strip().split("\n") + clean_data = [row.rstrip(",").rstrip("\r").strip() for row in clean_data] + csv_reader = csv.DictReader( + clean_data, + fieldnames=MemberForm.Meta.fields, + delimiter=delimiter, + quoting=csv.QUOTE_NONE, + ) members = [] payments = [] @@ -57,10 +62,10 @@ class MemberForm(forms.ModelForm): line[key] = value.strip() except AttributeError as ex: logging.error('Invalid line in CSV: "{}"'.format(line)) - logging.error('Delimiter: {}'.format(delimiter)) + logging.error("Delimiter: {}".format(delimiter)) raise - email = line['email'] + email = line["email"] member_exists = False if Member.objects.filter(email=email).exists(): member_exists = True @@ -76,9 +81,9 @@ class MemberForm(forms.ModelForm): else: member = Member.objects.get(email=email) payment_data = { - 'source': payment_source, - 'member': member.id, - 'date': timezone.now(), + "source": payment_source, + "member": member.id, + "date": timezone.now(), } form = PaymentForm(payment_data) if not form.is_valid(): @@ -95,17 +100,15 @@ class PaymentForm(forms.ModelForm): member = forms.ModelChoiceField( queryset=Member.objects.all(), - widget=autocomplete.ModelSelect2(url='member-autocomplete') + widget=autocomplete.ModelSelect2(url="member-autocomplete"), ) class Meta: """Meta for Payment model form.""" model = Payment - fields = ['date', 'source', 'member'] - labels = { - 'member': _('Member') - } + fields = ["date", "source", "member"] + labels = {"member": _("Member")} class ApplicationForm(forms.ModelForm): @@ -115,13 +118,13 @@ class ApplicationForm(forms.ModelForm): """Meta for application model form.""" model = Request - fields = ['first_name', 'last_name', 'email', 'AYY', 'jas', 'POR'] + fields = ["first_name", "last_name", "email", "AYY", "jas", "POR"] def __init__(self, *args, **kwargs): super(ApplicationForm, self).__init__(*args, **kwargs) - self.fields['AYY'].label = _("I'm a member of AYY") - self.fields['jas'].label = _("I want to receive a weekly newsletter") + self.fields["AYY"].label = _("I'm a member of AYY") + self.fields["jas"].label = _("I want to receive a weekly newsletter") class UploadFileForm(forms.Form): diff --git a/members/migrations/0001_initial.py b/members/migrations/0001_initial.py index fa73b35..48e2360 100644 --- a/members/migrations/0001_initial.py +++ b/members/migrations/0001_initial.py @@ -12,29 +12,52 @@ class Migration(migrations.Migration): initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='Member', + name="Member", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_name', models.CharField(max_length=127)), - ('last_name', models.CharField(max_length=127)), - ('email', models.EmailField(max_length=254)), - ('POR', models.CharField(max_length=255)), - ('AYY', models.BooleanField(default=False)), - ('jas', models.BooleanField(default=False)), - ('created', models.DateTimeField(default=django.utils.timezone.now)), - ('paid', models.DateTimeField(default=datetime.datetime(1970, 1, 1, 0, 0))), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("first_name", models.CharField(max_length=127)), + ("last_name", models.CharField(max_length=127)), + ("email", models.EmailField(max_length=254)), + ("POR", models.CharField(max_length=255)), + ("AYY", models.BooleanField(default=False)), + ("jas", models.BooleanField(default=False)), + ("created", models.DateTimeField(default=django.utils.timezone.now)), + ( + "paid", + models.DateTimeField(default=datetime.datetime(1970, 1, 1, 0, 0)), + ), ], ), migrations.CreateModel( - name='MemberRequest', + name="MemberRequest", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='members.Member')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "member", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="members.Member" + ), + ), ], ), ] diff --git a/members/migrations/0002_auto_20170329_1857.py b/members/migrations/0002_auto_20170329_1857.py index 0a1187e..52a538a 100644 --- a/members/migrations/0002_auto_20170329_1857.py +++ b/members/migrations/0002_auto_20170329_1857.py @@ -9,13 +9,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('members', '0001_initial'), + ("members", "0001_initial"), ] operations = [ migrations.AlterField( - model_name='member', - name='paid', + model_name="member", + name="paid", field=models.DateTimeField(default=datetime.datetime(1970, 1, 1, 2, 0)), ), ] diff --git a/members/migrations/0003_auto_20170329_1928.py b/members/migrations/0003_auto_20170329_1928.py index ddffdda..94f3998 100644 --- a/members/migrations/0003_auto_20170329_1928.py +++ b/members/migrations/0003_auto_20170329_1928.py @@ -11,57 +11,81 @@ import django.utils.timezone class Migration(migrations.Migration): dependencies = [ - ('members', '0002_auto_20170329_1857'), + ("members", "0002_auto_20170329_1857"), ] operations = [ migrations.CreateModel( - name='Payment', + name="Payment", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateTimeField(default=datetime.datetime(1970, 1, 1, 2, 0))), - ('source', models.CharField(max_length=255)), - ('first_name', models.CharField(max_length=255)), - ('last_name', models.CharField(max_length=255)), - ('email', models.EmailField(max_length=255)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "date", + models.DateTimeField(default=datetime.datetime(1970, 1, 1, 2, 0)), + ), + ("source", models.CharField(max_length=255)), + ("first_name", models.CharField(max_length=255)), + ("last_name", models.CharField(max_length=255)), + ("email", models.EmailField(max_length=255)), ], ), migrations.CreateModel( - name='Request', + name="Request", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_name', models.CharField(max_length=127)), - ('last_name', models.CharField(max_length=127)), - ('email', models.EmailField(max_length=254)), - ('POR', models.CharField(default='ei_tiedossa', max_length=255)), - ('AYY', models.BooleanField(default=False)), - ('jas', models.BooleanField(default=False)), - ('submitted', models.DateTimeField(default=django.utils.timezone.now)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("first_name", models.CharField(max_length=127)), + ("last_name", models.CharField(max_length=127)), + ("email", models.EmailField(max_length=254)), + ("POR", models.CharField(default="ei_tiedossa", max_length=255)), + ("AYY", models.BooleanField(default=False)), + ("jas", models.BooleanField(default=False)), + ("submitted", models.DateTimeField(default=django.utils.timezone.now)), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.RemoveField( - model_name='memberrequest', - name='member', + model_name="memberrequest", + name="member", ), migrations.AlterField( - model_name='member', - name='POR', - field=models.CharField(default='ei_tiedossa', max_length=255), + model_name="member", + name="POR", + field=models.CharField(default="ei_tiedossa", max_length=255), ), migrations.AlterField( - model_name='member', - name='paid', + model_name="member", + name="paid", field=models.DateTimeField(default=django.utils.timezone.now), ), migrations.DeleteModel( - name='MemberRequest', + name="MemberRequest", ), migrations.AddField( - model_name='payment', - name='member', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='members.Member'), + model_name="payment", + name="member", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="members.Member", + ), ), ] diff --git a/members/migrations/0004_auto_20170512_1454.py b/members/migrations/0004_auto_20170512_1454.py index c391772..b88feb4 100644 --- a/members/migrations/0004_auto_20170512_1454.py +++ b/members/migrations/0004_auto_20170512_1454.py @@ -8,80 +8,80 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('members', '0003_auto_20170329_1928'), + ("members", "0003_auto_20170329_1928"), ] operations = [ migrations.RemoveField( - model_name='payment', - name='email', + model_name="payment", + name="email", ), migrations.RemoveField( - model_name='payment', - name='first_name', + model_name="payment", + name="first_name", ), migrations.RemoveField( - model_name='payment', - name='last_name', + model_name="payment", + name="last_name", ), migrations.AlterField( - model_name='member', - name='AYY', - field=models.BooleanField(default=False, verbose_name='AYY'), + model_name="member", + name="AYY", + field=models.BooleanField(default=False, verbose_name="AYY"), ), migrations.AlterField( - model_name='member', - name='POR', - field=models.CharField(max_length=255, verbose_name='Place of residence'), + model_name="member", + name="POR", + field=models.CharField(max_length=255, verbose_name="Place of residence"), ), migrations.AlterField( - model_name='member', - name='email', - field=models.EmailField(max_length=254, verbose_name='Email'), + model_name="member", + name="email", + field=models.EmailField(max_length=254, verbose_name="Email"), ), migrations.AlterField( - model_name='member', - name='first_name', - field=models.CharField(max_length=127, verbose_name='First name'), + model_name="member", + name="first_name", + field=models.CharField(max_length=127, verbose_name="First name"), ), migrations.AlterField( - model_name='member', - name='jas', - field=models.BooleanField(default=False, verbose_name='JAS'), + model_name="member", + name="jas", + field=models.BooleanField(default=False, verbose_name="JAS"), ), migrations.AlterField( - model_name='member', - name='last_name', - field=models.CharField(max_length=127, verbose_name='Last name'), + model_name="member", + name="last_name", + field=models.CharField(max_length=127, verbose_name="Last name"), ), migrations.AlterField( - model_name='request', - name='AYY', - field=models.BooleanField(default=False, verbose_name='AYY'), + model_name="request", + name="AYY", + field=models.BooleanField(default=False, verbose_name="AYY"), ), migrations.AlterField( - model_name='request', - name='POR', - field=models.CharField(max_length=255, verbose_name='Place of residence'), + model_name="request", + name="POR", + field=models.CharField(max_length=255, verbose_name="Place of residence"), ), migrations.AlterField( - model_name='request', - name='email', - field=models.EmailField(max_length=254, verbose_name='Email'), + model_name="request", + name="email", + field=models.EmailField(max_length=254, verbose_name="Email"), ), migrations.AlterField( - model_name='request', - name='first_name', - field=models.CharField(max_length=127, verbose_name='First name'), + model_name="request", + name="first_name", + field=models.CharField(max_length=127, verbose_name="First name"), ), migrations.AlterField( - model_name='request', - name='jas', - field=models.BooleanField(default=False, verbose_name='JAS'), + model_name="request", + name="jas", + field=models.BooleanField(default=False, verbose_name="JAS"), ), migrations.AlterField( - model_name='request', - name='last_name', - field=models.CharField(max_length=127, verbose_name='Last name'), + model_name="request", + name="last_name", + field=models.CharField(max_length=127, verbose_name="Last name"), ), ] diff --git a/members/migrations/0005_auto_20170513_1029.py b/members/migrations/0005_auto_20170513_1029.py index 32c81e4..d556b86 100644 --- a/members/migrations/0005_auto_20170513_1029.py +++ b/members/migrations/0005_auto_20170513_1029.py @@ -9,22 +9,31 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('members', '0004_auto_20170512_1454'), + ("members", "0004_auto_20170512_1454"), ] operations = [ migrations.RemoveField( - model_name='member', - name='paid', + model_name="member", + name="paid", ), migrations.AlterField( - model_name='payment', - name='date', - field=models.DateTimeField(default=datetime.datetime(2017, 5, 13, 10, 29, 50, 116064)), + model_name="payment", + name="date", + field=models.DateTimeField( + default=datetime.datetime(2017, 5, 13, 10, 29, 50, 116064) + ), ), migrations.AlterField( - model_name='payment', - name='source', - field=models.CharField(choices=[('AYY', 'AYY'), ('cash', 'Cash'), ('bank_transfer', 'Bank transfer')], max_length=255), + model_name="payment", + name="source", + field=models.CharField( + choices=[ + ("AYY", "AYY"), + ("cash", "Cash"), + ("bank_transfer", "Bank transfer"), + ], + max_length=255, + ), ), ] diff --git a/members/migrations/0006_auto_20170517_1309.py b/members/migrations/0006_auto_20170517_1309.py index aebf2fe..7c2ac55 100644 --- a/members/migrations/0006_auto_20170517_1309.py +++ b/members/migrations/0006_auto_20170517_1309.py @@ -9,13 +9,15 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('members', '0005_auto_20170513_1029'), + ("members", "0005_auto_20170513_1029"), ] operations = [ migrations.AlterField( - model_name='payment', - name='date', - field=models.DateTimeField(default=datetime.datetime(2017, 5, 17, 13, 9, 21, 49238)), + model_name="payment", + name="date", + field=models.DateTimeField( + default=datetime.datetime(2017, 5, 17, 13, 9, 21, 49238) + ), ), ] diff --git a/members/migrations/0007_auto_20170518_1538.py b/members/migrations/0007_auto_20170518_1538.py index b087919..d91b18e 100644 --- a/members/migrations/0007_auto_20170518_1538.py +++ b/members/migrations/0007_auto_20170518_1538.py @@ -9,13 +9,15 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('members', '0006_auto_20170517_1309'), + ("members", "0006_auto_20170517_1309"), ] operations = [ migrations.AlterField( - model_name='payment', - name='date', - field=models.DateTimeField(default=datetime.datetime(2017, 5, 18, 15, 38, 7, 668612)), + model_name="payment", + name="date", + field=models.DateTimeField( + default=datetime.datetime(2017, 5, 18, 15, 38, 7, 668612) + ), ), ] diff --git a/members/migrations/0008_auto_20170518_1540.py b/members/migrations/0008_auto_20170518_1540.py index 1d31da0..21e2a24 100644 --- a/members/migrations/0008_auto_20170518_1540.py +++ b/members/migrations/0008_auto_20170518_1540.py @@ -9,18 +9,18 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('members', '0007_auto_20170518_1538'), + ("members", "0007_auto_20170518_1538"), ] operations = [ migrations.AlterField( - model_name='member', - name='created', + model_name="member", + name="created", field=models.DateTimeField(default=datetime.datetime.now), ), migrations.AlterField( - model_name='payment', - name='date', + model_name="payment", + name="date", field=models.DateTimeField(default=datetime.datetime.now), ), ] diff --git a/members/migrations/0009_auto_20170526_1903.py b/members/migrations/0009_auto_20170526_1903.py index 44abc41..9fda6a3 100644 --- a/members/migrations/0009_auto_20170526_1903.py +++ b/members/migrations/0009_auto_20170526_1903.py @@ -9,13 +9,15 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('members', '0008_auto_20170518_1540'), + ("members", "0008_auto_20170518_1540"), ] operations = [ migrations.AlterField( - model_name='member', - name='created', - field=models.DateTimeField(default=datetime.datetime.now, verbose_name='Created'), + model_name="member", + name="created", + field=models.DateTimeField( + default=datetime.datetime.now, verbose_name="Created" + ), ), ] diff --git a/members/migrations/0010_auto_20170526_1910.py b/members/migrations/0010_auto_20170526_1910.py index 6422079..8fc3bc8 100644 --- a/members/migrations/0010_auto_20170526_1910.py +++ b/members/migrations/0010_auto_20170526_1910.py @@ -9,18 +9,28 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('members', '0009_auto_20170526_1903'), + ("members", "0009_auto_20170526_1903"), ] operations = [ migrations.AlterField( - model_name='payment', - name='date', - field=models.DateTimeField(default=datetime.datetime.now, verbose_name='Date'), + model_name="payment", + name="date", + field=models.DateTimeField( + default=datetime.datetime.now, verbose_name="Date" + ), ), migrations.AlterField( - model_name='payment', - name='source', - field=models.CharField(choices=[('AYY', 'AYY'), ('cash', 'Cash'), ('bank_transfer', 'Bank transfer')], max_length=255, verbose_name='Source'), + model_name="payment", + name="source", + field=models.CharField( + choices=[ + ("AYY", "AYY"), + ("cash", "Cash"), + ("bank_transfer", "Bank transfer"), + ], + max_length=255, + verbose_name="Source", + ), ), ] diff --git a/members/migrations/0011_auto_20170526_2013.py b/members/migrations/0011_auto_20170526_2013.py index 2c0a82a..3de412f 100644 --- a/members/migrations/0011_auto_20170526_2013.py +++ b/members/migrations/0011_auto_20170526_2013.py @@ -9,13 +9,15 @@ import django.utils.timezone class Migration(migrations.Migration): dependencies = [ - ('members', '0010_auto_20170526_1910'), + ("members", "0010_auto_20170526_1910"), ] operations = [ migrations.AlterField( - model_name='request', - name='submitted', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Submitted'), + model_name="request", + name="submitted", + field=models.DateTimeField( + default=django.utils.timezone.now, verbose_name="Submitted" + ), ), ] diff --git a/members/migrations/0012_memberconflict.py b/members/migrations/0012_memberconflict.py index f9ec985..f4a63c9 100644 --- a/members/migrations/0012_memberconflict.py +++ b/members/migrations/0012_memberconflict.py @@ -9,16 +9,38 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('members', '0011_auto_20170526_2013'), + ("members", "0011_auto_20170526_2013"), ] operations = [ migrations.CreateModel( - name='MemberConflict', + name="MemberConflict", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberconflict_first_member', to='members.Member')), - ('second_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberconflict_second_member', to='members.Member')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "first_member", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="memberconflict_first_member", + to="members.Member", + ), + ), + ( + "second_member", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="memberconflict_second_member", + to="members.Member", + ), + ), ], ), ] diff --git a/members/migrations/0013_auto_20170601_1822.py b/members/migrations/0013_auto_20170601_1822.py index 258e13a..a2ba4eb 100644 --- a/members/migrations/0013_auto_20170601_1822.py +++ b/members/migrations/0013_auto_20170601_1822.py @@ -9,13 +9,19 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('members', '0012_memberconflict'), + ("members", "0012_memberconflict"), ] operations = [ migrations.AlterField( - model_name='payment', - name='member', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='payments', to='members.Member'), + model_name="payment", + name="member", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="payments", + to="members.Member", + ), ), ] diff --git a/members/migrations/0014_auto_20170920_1457.py b/members/migrations/0014_auto_20170920_1457.py index 1397954..2ac7cef 100644 --- a/members/migrations/0014_auto_20170920_1457.py +++ b/members/migrations/0014_auto_20170920_1457.py @@ -8,18 +8,18 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('members', '0013_auto_20170601_1822'), + ("members", "0013_auto_20170601_1822"), ] operations = [ migrations.AlterField( - model_name='member', - name='email', - field=models.EmailField(max_length=254, unique=True, verbose_name='Email'), + model_name="member", + name="email", + field=models.EmailField(max_length=254, unique=True, verbose_name="Email"), ), migrations.AlterField( - model_name='request', - name='email', - field=models.EmailField(max_length=254, unique=True, verbose_name='Email'), + model_name="request", + name="email", + field=models.EmailField(max_length=254, unique=True, verbose_name="Email"), ), ] diff --git a/members/migrations/0015_auto_20170925_1917.py b/members/migrations/0015_auto_20170925_1917.py index 3313ac2..0210889 100644 --- a/members/migrations/0015_auto_20170925_1917.py +++ b/members/migrations/0015_auto_20170925_1917.py @@ -8,19 +8,19 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('members', '0014_auto_20170920_1457'), + ("members", "0014_auto_20170920_1457"), ] operations = [ migrations.RemoveField( - model_name='memberconflict', - name='first_member', + model_name="memberconflict", + name="first_member", ), migrations.RemoveField( - model_name='memberconflict', - name='second_member', + model_name="memberconflict", + name="second_member", ), migrations.DeleteModel( - name='MemberConflict', + name="MemberConflict", ), ] diff --git a/members/migrations/0016_auto_20170925_1924.py b/members/migrations/0016_auto_20170925_1924.py index 56f8934..affd392 100644 --- a/members/migrations/0016_auto_20170925_1924.py +++ b/members/migrations/0016_auto_20170925_1924.py @@ -9,18 +9,22 @@ import django.utils.timezone class Migration(migrations.Migration): dependencies = [ - ('members', '0015_auto_20170925_1917'), + ("members", "0015_auto_20170925_1917"), ] operations = [ migrations.AlterField( - model_name='member', - name='created', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Created'), + model_name="member", + name="created", + field=models.DateTimeField( + default=django.utils.timezone.now, verbose_name="Created" + ), ), migrations.AlterField( - model_name='payment', - name='date', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Date'), + model_name="payment", + name="date", + field=models.DateTimeField( + default=django.utils.timezone.now, verbose_name="Date" + ), ), ] diff --git a/members/migrations/0017_auto_20170926_1316.py b/members/migrations/0017_auto_20170926_1316.py index 8aea6fd..754dafe 100644 --- a/members/migrations/0017_auto_20170926_1316.py +++ b/members/migrations/0017_auto_20170926_1316.py @@ -8,12 +8,16 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('members', '0016_auto_20170925_1924'), + ("members", "0016_auto_20170925_1924"), ] operations = [ migrations.AlterModelOptions( - name='member', - options={'permissions': (('check_by_email', 'Can check if user exists by email'),)}, + name="member", + options={ + "permissions": ( + ("check_by_email", "Can check if user exists by email"), + ) + }, ), ] diff --git a/members/migrations/0018_auto_20170927_1918.py b/members/migrations/0018_auto_20170927_1918.py index 0c601a9..7534ac3 100644 --- a/members/migrations/0018_auto_20170927_1918.py +++ b/members/migrations/0018_auto_20170927_1918.py @@ -8,20 +8,29 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('members', '0017_auto_20170926_1316'), + ("members", "0017_auto_20170926_1316"), ] operations = [ migrations.AlterModelOptions( - name='member', - options={'permissions': (('check_by_email', 'Can check if user exists by email'), ('read_member', 'Can see member in list'))}, + name="member", + options={ + "permissions": ( + ("check_by_email", "Can check if user exists by email"), + ("read_member", "Can see member in list"), + ) + }, ), migrations.AlterModelOptions( - name='payment', - options={'permissions': (('read_payment', 'Can see payment in list'),)}, + name="payment", + options={"permissions": (("read_payment", "Can see payment in list"),)}, ), migrations.AlterModelOptions( - name='request', - options={'permissions': (('read_application', 'Can see member application in list'),)}, + name="request", + options={ + "permissions": ( + ("read_application", "Can see member application in list"), + ) + }, ), ] diff --git a/members/migrations/0019_auto_20171029_1143.py b/members/migrations/0019_auto_20171029_1143.py index 25433e9..22de0a1 100644 --- a/members/migrations/0019_auto_20171029_1143.py +++ b/members/migrations/0019_auto_20171029_1143.py @@ -8,12 +8,19 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('members', '0018_auto_20170927_1918'), + ("members", "0018_auto_20170927_1918"), ] operations = [ migrations.AlterModelOptions( - name='member', - options={'permissions': (('check_by_email', 'Can check if user exists by email'), ('read_member', 'Can see member in list')), 'verbose_name': 'Member', 'verbose_name_plural': 'Members'}, + name="member", + options={ + "permissions": ( + ("check_by_email", "Can check if user exists by email"), + ("read_member", "Can see member in list"), + ), + "verbose_name": "Member", + "verbose_name_plural": "Members", + }, ), ] diff --git a/members/models.py b/members/models.py index 3b14173..e735dd4 100644 --- a/members/models.py +++ b/members/models.py @@ -12,8 +12,9 @@ class BaseMember(models.Model): first_name = models.CharField(_("First name"), max_length=127) last_name = models.CharField(_("Last name"), max_length=127) email = models.EmailField(_("Email"), unique=True) - POR = models.CharField(_("Place of residence"), - max_length=255) # place of residence + POR = models.CharField( + _("Place of residence"), max_length=255 + ) # place of residence AYY = models.BooleanField(_("AYY"), default=False) jas = models.BooleanField(_("JAS"), default=False) @@ -34,7 +35,7 @@ class BaseMember(models.Model): self.email, self.POR, int(self.AYY), - int(self.jas) + int(self.jas), ] @@ -42,11 +43,9 @@ class Request(BaseMember): """Member request model represents one member request.""" class Meta: - permissions = ( - ('read_application', 'Can see member application in list'), - ) + permissions = (("read_application", "Can see member application in list"),) - submitted = models.DateTimeField(_('Submitted'), default=timezone.now) + submitted = models.DateTimeField(_("Submitted"), default=timezone.now) def to_member(self): """Convert array to member model.""" @@ -59,47 +58,54 @@ class Payment(models.Model): """Payment model representing one payment event.""" class Meta: - permissions = ( - ('read_payment', 'Can see payment in list'), - ) + permissions = (("read_payment", "Can see payment in list"),) - date = models.DateTimeField(_('Date'), default=timezone.now) - source = models.CharField(_('Source'), choices=[ - ('AYY', _('AYY')), - ('cash', _('Cash')), - ('bank_transfer', _('Bank transfer')), - ], max_length=255) + date = models.DateTimeField(_("Date"), default=timezone.now) + source = models.CharField( + _("Source"), + choices=[ + ("AYY", _("AYY")), + ("cash", _("Cash")), + ("bank_transfer", _("Bank transfer")), + ], + max_length=255, + ) - member = models.ForeignKey('Member', - on_delete=models.PROTECT, - blank=True, - null=True, - related_name='payments') + member = models.ForeignKey( + "Member", + on_delete=models.PROTECT, + blank=True, + null=True, + related_name="payments", + ) def __str__(self): """Return payment id and date.""" - return 'Payment no. {}, {}'.format(self.id, str(self.date)) + return "Payment no. {}, {}".format(self.id, str(self.date)) @staticmethod def find_payments_by_name(query_name): qs = Payment.objects.all() for term in query_name.split(): - qs = qs.filter(Q(member__first_name__icontains=term) | Q(member__last_name__icontains=term)) + qs = qs.filter( + Q(member__first_name__icontains=term) + | Q(member__last_name__icontains=term) + ) return qs class Member(BaseMember): """Member model represets one member on the registry.""" - created = models.DateTimeField(_('Created'), default=timezone.now) + created = models.DateTimeField(_("Created"), default=timezone.now) class Meta: permissions = ( - ('check_by_email', 'Can check if user exists by email'), - ('read_member', 'Can see member in list'), + ("check_by_email", "Can check if user exists by email"), + ("read_member", "Can see member in list"), ) - verbose_name = _('Member') - verbose_name_plural = _('Members') + verbose_name = _("Member") + verbose_name_plural = _("Members") @staticmethod def from_array(array): @@ -126,5 +132,5 @@ class Member(BaseMember): @staticmethod def get_members_with_latest_payment(members_query): """Return QuerySet of given members QS with last_paid attribute.""" - latest = Payment.objects.filter(member=OuterRef('pk')).order_by('-date') - return members_query.annotate(last_paid=Subquery(latest.values('date')[:1])) + latest = Payment.objects.filter(member=OuterRef("pk")).order_by("-date") + return members_query.annotate(last_paid=Subquery(latest.values("date")[:1])) diff --git a/members/permissions.py b/members/permissions.py index f117b81..66fb718 100644 --- a/members/permissions.py +++ b/members/permissions.py @@ -5,4 +5,4 @@ import logging class CheckByEmailPermission(BasePermission): def has_permission(self, request, view): - return request.user.has_perm('members.check_by_email') + return request.user.has_perm("members.check_by_email") diff --git a/members/resources.py b/members/resources.py index 507b1d4..6731e28 100644 --- a/members/resources.py +++ b/members/resources.py @@ -6,7 +6,7 @@ from .models import Member, Payment, Request class MemberResource(resources.ModelResource): class Meta: model = Member - exclude = ['id', 'created'] + exclude = ["id", "created"] class PaymentResource(resources.ModelResource): @@ -14,13 +14,13 @@ class PaymentResource(resources.ModelResource): class Meta: model = Payment - exclude = ['id'] + exclude = ["id"] def dehydrate_member(self, payment): - return '{} {}'.format(payment.member.first_name, payment.member.last_name) + return "{} {}".format(payment.member.first_name, payment.member.last_name) class ApplicationResource(resources.ModelResource): class Meta: model = Request - exclude = ['id'] + exclude = ["id"] diff --git a/members/serializers.py b/members/serializers.py index 9d1ff21..7d61487 100644 --- a/members/serializers.py +++ b/members/serializers.py @@ -7,11 +7,20 @@ from members.models import Member class MemberSerializer(serializers.ModelSerializer): """Model serializer for member.""" - paid = serializers.DateTimeField(source='last_paid') + paid = serializers.DateTimeField(source="last_paid") class Meta: """Meta of member serializer.""" model = Member - fields = ('id', 'first_name', 'last_name', 'email', - 'POR', 'AYY', 'jas', 'created', 'paid') + fields = ( + "id", + "first_name", + "last_name", + "email", + "POR", + "AYY", + "jas", + "created", + "paid", + ) diff --git a/members/tables.py b/members/tables.py index 89ecca1..2487a87 100644 --- a/members/tables.py +++ b/members/tables.py @@ -12,11 +12,16 @@ from members.models import Member, Payment, Request class MemberTable(tables.Table): """Table for member.""" - last_paid = tables.DateTimeColumn(verbose_name=_('Last paid')) + last_paid = tables.DateTimeColumn(verbose_name=_("Last paid")) options = tables.TemplateColumn( - ('') + _('Edit') + '', verbose_name="" + ( + '' + ) + + _("Edit") + + "", + verbose_name="", ) class Meta: @@ -26,24 +31,34 @@ class MemberTable(tables.Table): def render_last_paid(self, record): try: - return timezone.localtime(record.payments.filter(member=record).latest('date').date).strftime('%-d.%-m.%Y %H:%M') + return timezone.localtime( + record.payments.filter(member=record).latest("date").date + ).strftime("%-d.%-m.%Y %H:%M") except ObjectDoesNotExist: - return timezone.localtime(record.created).strftime('%-d.%-m.%Y %H:%M') + _(" (not paid)") + return timezone.localtime(record.created).strftime("%-d.%-m.%Y %H:%M") + _( + " (not paid)" + ) def order_last_paid(self, queryset, is_descending): - queryset = Member.get_members_with_latest_payment(queryset).order_by(('-' if is_descending else '') + 'last_paid') + queryset = Member.get_members_with_latest_payment(queryset).order_by( + ("-" if is_descending else "") + "last_paid" + ) return (queryset, True) class PaymentTable(tables.Table): """Table for payments.""" - member = tables.Column(accessor='member', verbose_name=_('Member')) + member = tables.Column(accessor="member", verbose_name=_("Member")) options = tables.TemplateColumn( - ('') + _('Edit') + '', - verbose_name="" + ( + '' + ) + + _("Edit") + + "", + verbose_name="", ) class Meta: @@ -56,9 +71,13 @@ class RequestTable(tables.Table): """Table for member applications.""" options = tables.TemplateColumn( - ('') + _('Edit') + '', - verbose_name="" + ( + '' + ) + + _("Edit") + + "", + verbose_name="", ) class Meta: diff --git a/members/tests.py b/members/tests.py index 53c3759..44685f9 100644 --- a/members/tests.py +++ b/members/tests.py @@ -17,16 +17,23 @@ class MemberRegisterTestCase(TestCase): def setUp(self): """Setup testing environment by creating member and admin.""" - memb = Member.objects.create(first_name="Tidus", last_name="Tester", email="tidus@tester.fi") - payment = Payment.objects.create(member=memb, source='AYY') + memb = Member.objects.create( + first_name="Tidus", last_name="Tester", email="tidus@tester.fi" + ) + payment = Payment.objects.create(member=memb, source="AYY") appl = Request.objects.create( - first_name="Liisa", last_name="Mattila", - email="liisa.mattila@pylly.com", POR="Kouvola", - AYY=True, jas=False) + first_name="Liisa", + last_name="Mattila", + email="liisa.mattila@pylly.com", + POR="Kouvola", + AYY=True, + jas=False, + ) - username, password = 'test_admin', 'password123' + username, password = "test_admin", "password123" test_admin = User.objects.create_superuser( - username, 'myemail@test.com', password) + username, "myemail@test.com", password + ) self.c = Client() self.c.login(username=username, password=password) @@ -39,84 +46,106 @@ class MemberRegisterTestCase(TestCase): """Test csv import only with single line in csv file.""" current_dir = os.path.dirname(os.path.abspath(__file__)) - with open(os.path.join(current_dir, 'test_resources', 'single_line_import.csv')) as csvFile: - response = self.c.post('/members/import_csv', { - 'csvFile': csvFile, - 'delimiter': ';', - 'payment_source': 'AYY' - }, follow=True) + with open( + os.path.join(current_dir, "test_resources", "single_line_import.csv") + ) as csvFile: + response = self.c.post( + "/members/import_csv", + {"csvFile": csvFile, "delimiter": ";", "payment_source": "AYY"}, + follow=True, + ) self.assertEqual(response.status_code, 200) def test_import_csv_multi_line(self): """Test csv import with multilined csv.""" current_dir = os.path.dirname(os.path.abspath(__file__)) - with open(os.path.join(current_dir, 'test_resources', 'multi_line_import.csv')) as csvFile: - response = self.c.post('/members/import_csv', { - 'csvFile': csvFile, - 'delimiter': ';', - 'payment_source': 'AYY' - }, follow=True) + with open( + os.path.join(current_dir, "test_resources", "multi_line_import.csv") + ) as csvFile: + response = self.c.post( + "/members/import_csv", + {"csvFile": csvFile, "delimiter": ";", "payment_source": "AYY"}, + follow=True, + ) self.assertEqual(response.status_code, 200) def test_autocomplete_search_found(self): """Test member autocomplete search""" - search_terms = 'Tidus' - response = self.c.get('/members/member-autocomplete?q={}'.format(search_terms), follow=True) - results = response.json()['results'] + search_terms = "Tidus" + response = self.c.get( + "/members/member-autocomplete?q={}".format(search_terms), follow=True + ) + results = response.json()["results"] self.assertEqual(len(results), 1) def test_autocomplete_search_not_found(self): """Test member autocomplete search""" - search_terms = 'Notfound' - response = self.c.get('/members/member-autocomplete?q={}'.format(search_terms), follow=True) - results = response.json()['results'] + search_terms = "Notfound" + response = self.c.get( + "/members/member-autocomplete?q={}".format(search_terms), follow=True + ) + results = response.json()["results"] self.assertEqual(len(results), 0) def test_export_members_excel(self): """Test if the user can download an excel file of the member register""" - resp = self.c.get('/members/export_members') - content_type = 'application/vnd.ms-excel' - self.assertIn(content_type, resp['Content-Type']) + resp = self.c.get("/members/export_members") + content_type = "application/vnd.ms-excel" + self.assertIn(content_type, resp["Content-Type"]) content = resp.content - arrays = pyexcel.get_array(file_content=content, file_type='xlsx') - tidus_array = ['Tidus', 'Tester', 'tidus@tester.fi', '', '0', '0'] + arrays = pyexcel.get_array(file_content=content, file_type="xlsx") + tidus_array = ["Tidus", "Tester", "tidus@tester.fi", "", "0", "0"] self.assertIn(tidus_array, arrays) def test_export_payments_excel(self): """Test if the user can download an excel file of the payment register""" - resp = self.c.get('/members/export_payments') - content_type = 'application/vnd.ms-excel' - self.assertIn(content_type, resp['Content-Type']) + resp = self.c.get("/members/export_payments") + content_type = "application/vnd.ms-excel" + self.assertIn(content_type, resp["Content-Type"]) content = resp.content - arrays = pyexcel.get_array(file_content=content, file_type='xlsx') - created = Payment.objects.get(member__email='tidus@tester.fi').date.strftime('%Y-%m-%d %H:%M:%S') - tidus_array = ['Tidus Tester', created, 'AYY'] + arrays = pyexcel.get_array(file_content=content, file_type="xlsx") + created = Payment.objects.get(member__email="tidus@tester.fi").date.strftime( + "%Y-%m-%d %H:%M:%S" + ) + tidus_array = ["Tidus Tester", created, "AYY"] self.assertIn(tidus_array, arrays) def test_export_applications_excel(self): """Test if the user can download an excel file of the member application register""" - resp = self.c.get('/members/export_applications') - content_type = 'application/vnd.ms-excel' - self.assertIn(content_type, resp['Content-Type']) + resp = self.c.get("/members/export_applications") + content_type = "application/vnd.ms-excel" + self.assertIn(content_type, resp["Content-Type"]) content = resp.content - arrays = pyexcel.get_array(file_content=content, file_type='xlsx') - submitted = Request.objects.get(email='liisa.mattila@pylly.com').submitted.strftime('%Y-%m-%d %H:%M:%S') - liisa_array = ['Liisa', 'Mattila', 'liisa.mattila@pylly.com', 'Kouvola', '1', '0', submitted] + arrays = pyexcel.get_array(file_content=content, file_type="xlsx") + submitted = Request.objects.get( + email="liisa.mattila@pylly.com" + ).submitted.strftime("%Y-%m-%d %H:%M:%S") + liisa_array = [ + "Liisa", + "Mattila", + "liisa.mattila@pylly.com", + "Kouvola", + "1", + "0", + submitted, + ] self.assertIn(liisa_array, arrays) def test_submit_member_application(self): """Test if submitting a member application works""" data = { - 'first_name': 'Seppo', 'last_name': 'Saastamoinen', - 'email': 'seppo@saastamoin.en', 'jas': 'on', - 'POR': 'Dipolin viinibaari' + "first_name": "Seppo", + "last_name": "Saastamoinen", + "email": "seppo@saastamoin.en", + "jas": "on", + "POR": "Dipolin viinibaari", } - resp = self.c.post('/members/submit_application', data=data) + resp = self.c.post("/members/submit_application", data=data) self.assertEqual(resp.status_code, 200) - self.assertTrue(Request.objects.filter(email='seppo@saastamoin.en').exists()) + self.assertTrue(Request.objects.filter(email="seppo@saastamoin.en").exists()) diff --git a/members/throttles.py b/members/throttles.py index 3004a82..0ab3018 100644 --- a/members/throttles.py +++ b/members/throttles.py @@ -6,10 +6,10 @@ from rest_framework.throttling import UserRateThrottle class BurstRateThrottle(UserRateThrottle): """Class for burst rate throttle.""" - scope = 'burst' + scope = "burst" class SustainedRateThrottle(UserRateThrottle): """Class for sustained rate throttle.""" - scope = 'sustained' + scope = "sustained" diff --git a/members/urls.py b/members/urls.py index 2f3a1c6..fac0273 100644 --- a/members/urls.py +++ b/members/urls.py @@ -41,86 +41,65 @@ from members.views import application_submit # from members.views import validateEmail, validate_success, validate_fail urlpatterns = [ - # landing page - url(r'^$', member_list), - url(r'^list$', member_list), - + url(r"^$", member_list), + url(r"^list$", member_list), # add member form view - url(r'^add$', member_add), - + url(r"^add$", member_add), # add many members view - url(r'^add_many$', member_add_many), - + url(r"^add_many$", member_add_many), # edit member information view - url(r'^edit/(?P\d+)$', member_edit), - + url(r"^edit/(?P\d+)$", member_edit), # delete confirmation view - url(r'^delete_member_confirm/(?P\d+)$', member_delete_confirm), - + url(r"^delete_member_confirm/(?P\d+)$", member_delete_confirm), # list all member applications - url(r'^applications$', application_list), - + url(r"^applications$", application_list), # edit member application - url(r'^edit_application/(?P\d+)$', application_edit), - + url(r"^edit_application/(?P\d+)$", application_edit), # post request targets - url(r'^submit_member$', member_submit), - url(r'^update_member$', member_update), - url(r'^delete_member$', member_delete), - url(r'^submit_payment$', payment_submit), - url(r'^update_payment$', payment_update), - url(r'^delete_payment$', payment_delete), - url(r'^submit_application$', application_submit), - url(r'^accept_application$', application_accept), - url(r'^delete_application$', application_delete), - + url(r"^submit_member$", member_submit), + url(r"^update_member$", member_update), + url(r"^delete_member$", member_delete), + url(r"^submit_payment$", payment_submit), + url(r"^update_payment$", payment_update), + url(r"^delete_payment$", payment_delete), + url(r"^submit_application$", application_submit), + url(r"^accept_application$", application_accept), + url(r"^delete_application$", application_delete), # the actual member application form - url(r'^application/$', application_form), - + url(r"^application/$", application_form), # delete confirmation view for applications - url(r'^delete_application_confirm/(?P\d+)$', - application_delete_confirm), - + url(r"^delete_application_confirm/(?P\d+)$", application_delete_confirm), # list all payment events - url(r'^payments$', payment_list), - + url(r"^payments$", payment_list), # add payment event - url(r'^add_payment$', payment_add), - + url(r"^add_payment$", payment_add), # edit payment event - url(r'^edit_payment/(?P\d+)$', payment_edit), - + url(r"^edit_payment/(?P\d+)$", payment_edit), # delete confirmation view - url(r'^delete_payment_confirm/(?P\d+)$', payment_delete_confirm), - + url(r"^delete_payment_confirm/(?P\d+)$", payment_delete_confirm), # post endpoint for confirming multiple entries - url(r'^add_many_confirm$', add_many_confirm), - + url(r"^add_many_confirm$", add_many_confirm), # settings page - url(r'^settings$', settings_page), - + url(r"^settings$", settings_page), # send CSV member data by POST - url(r'^import_csv', import_csv), - + url(r"^import_csv", import_csv), # export members as excel file - url(r'export_members', export_members_excel), - url(r'export_payments', export_payments_excel), - url(r'export_applications', export_applications_excel), - + url(r"export_members", export_members_excel), + url(r"export_payments", export_payments_excel), + url(r"export_applications", export_applications_excel), # rest api url - url(r'^api/members/(?P\d+)$', MemberDetail.as_view()), - + url(r"^api/members/(?P\d+)$", MemberDetail.as_view()), # member select autocomplete view url( - r'^member-autocomplete/$', + r"^member-autocomplete/$", MemberAutoComplete.as_view(), - name='member-autocomplete', + name="member-autocomplete", ), - - url(r'^check', CheckByEmail.as_view()) + url(r"^check", CheckByEmail.as_view()), ] if settings.DEBUG: from django.contrib.staticfiles.urls import staticfiles_urlpatterns + urlpatterns += staticfiles_urlpatterns() diff --git a/members/views/applications.py b/members/views/applications.py index 5f4bfd0..42fbf2e 100644 --- a/members/views/applications.py +++ b/members/views/applications.py @@ -21,52 +21,53 @@ from members.views import error_view @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.read_application', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.read_application", raise_exception=True) def application_list(request, *args, **kwargs): """List member applications not yet processed.""" applications = Request.objects.all() application_count = len(applications) - table = RequestTable(applications, - request=request, - exclude=['id'], - attrs={'class': 'table table-bordered table-hover'}) + table = RequestTable( + applications, + request=request, + exclude=["id"], + attrs={"class": "table table-bordered table-hover"}, + ) - table.paginate(page=request.GET.get('page', 1), per_page=25) + table.paginate(page=request.GET.get("page", 1), per_page=25) table_html = convert_table_to_html(table, request) context = { - 'table': table_html, - 'application_count': application_count, - 'notification': request.GET.get('notification', None) + "table": table_html, + "application_count": application_count, + "notification": request.GET.get("notification", None), } - return render(request, 'application_list.html', context) + return render(request, "application_list.html", context) @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.change_request', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.change_request", raise_exception=True) def application_edit(request, *args, **kwargs): """Edit member request information.""" - i = kwargs.pop('index', None) + i = kwargs.pop("index", None) if i is None: - return error_view(request, _('No application id specified')) + return error_view(request, _("No application id specified")) else: application = Request.objects.get(id=i) form = ApplicationForm(instance=application) return render( - request, - 'application_edit.html', - {'application_id': i, 'form': form}) + request, "application_edit.html", {"application_id": i, "form": form} + ) @ensure_csrf_cookie @require_http_methods(["POST"]) -@login_required(login_url='/admin/login') -@permission_required('members.add_member', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.add_member", raise_exception=True) def application_accept(request, *args, **kwargs): """Accept application.""" - id = request.POST.get('id', None) + id = request.POST.get("id", None) if id is not None: application = Request.objects.get(id=id) else: @@ -78,9 +79,12 @@ def application_accept(request, *args, **kwargs): application = form.save() if Member.objects.filter(email=application.email).exists(): - return error_view(request, _( - 'Email {} is already in use by a member. Application cannot be accepted.' - ).format(application.email)) + return error_view( + request, + _( + "Email {} is already in use by a member. Application cannot be accepted." + ).format(application.email), + ) member = application.to_member() member.save() @@ -88,24 +92,25 @@ def application_accept(request, *args, **kwargs): logging.info( "Accepted application in member " - "register with the following info: {}" - .format(form)) - notification = "{} {}.".format(_("Successfully accepted application"), - str(application)) + "register with the following info: {}".format(form) + ) + notification = "{} {}.".format( + _("Successfully accepted application"), str(application) + ) - subject = _('Jäsenhakemuksesi Sähköinsinöörikiltaan on hyväksytty!') + subject = _("Jäsenhakemuksesi Sähköinsinöörikiltaan on hyväksytty!") message = render_to_string( - 'members:email_application_accept.html', { - 'first_name': application.first_name - } + "members:email_application_accept.html", + {"first_name": application.first_name}, ) send_email(member.email, subject, message) return HttpResponseRedirect( - '/members/list?notification={}'.format(html.escape(notification))) + "/members/list?notification={}".format(html.escape(notification)) + ) except Exception as ex: - logging.exception('Exception while accepting application') + logging.exception("Exception while accepting application") return error_view(request, str(ex)) else: logging.info(form) @@ -114,52 +119,55 @@ def application_accept(request, *args, **kwargs): @ensure_csrf_cookie @require_http_methods(["POST"]) -@login_required(login_url='/admin/login') -@permission_required('members.delete_request', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.delete_request", raise_exception=True) def application_delete(request, *args, **kwargs): """Delete member application.""" try: - id = request.POST['id'] + id = request.POST["id"] except KeyError: - return error_view(request, _('No application id specified')) + return error_view(request, _("No application id specified")) try: application = Request.objects.get(id=id) - notification = "{} {}.".format(_("Successfully deleted application"), - str(application)) + notification = "{} {}.".format( + _("Successfully deleted application"), str(application) + ) application.delete() logging.info( - "Delete application in member register with the following id: {}" - .format(id)) + "Delete application in member register with the following id: {}".format(id) + ) return HttpResponseRedirect( - '/members/applications?notification={}' - .format(html.escape(notification))) + "/members/applications?notification={}".format(html.escape(notification)) + ) except: - return error_view(request, _('Could not delete application object')) + return error_view(request, _("Could not delete application object")) @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.delete_request', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.delete_request", raise_exception=True) def application_delete_confirm(request, *args, **kwargs): """Confirm application deletion.""" - i = kwargs.pop('index', None) + i = kwargs.pop("index", None) if i is None: - return error_view(request, _('No application id specified')) + return error_view(request, _("No application id specified")) else: application = Request.objects.get(id=i) form = ApplicationForm(instance=application) - return render(request, - 'application_delete_confirm.html', - {'application_id': i, 'form': form}) + return render( + request, + "application_delete_confirm.html", + {"application_id": i, "form": form}, + ) @ensure_csrf_cookie def application_form(request, *args, **kwargs): """Render member application form.""" form = ApplicationForm() - return render(request, 'application_index.html', {'form': form}) + return render(request, "application_index.html", {"form": form}) @ensure_csrf_cookie @@ -171,19 +179,22 @@ def application_submit(request, *args, **kwargs): form.save() try: application = form.instance - email = form.cleaned_data.get('email', '') + email = form.cleaned_data.get("email", "") - subject = _('Jäsenhakemuksesi Sähköinsinöörikiltaan on lähetetty onnistuneesti!') + subject = _( + "Jäsenhakemuksesi Sähköinsinöörikiltaan on lähetetty onnistuneesti!" + ) message = render_to_string( - 'members:email_application_submit.html', { - 'application': application, - 'ayy': _('Kyllä') if application.AYY else _('Ei'), - 'jas': _('Kyllä') if application.jas else _('Ei') - } + "members:email_application_submit.html", + { + "application": application, + "ayy": _("Kyllä") if application.AYY else _("Ei"), + "jas": _("Kyllä") if application.jas else _("Ei"), + }, ) send_email(email, subject, message) finally: - return render(request, 'application_success.html', {}) + return render(request, "application_success.html", {}) else: return error_view(request, form.errors) diff --git a/members/views/members.py b/members/views/members.py index 7ab784d..0efdee7 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -3,7 +3,12 @@ from django.contrib.auth.decorators import permission_required, login_required from django.utils.decorators import method_decorator from django.views.decorators.http import require_http_methods from django.views.decorators.csrf import ensure_csrf_cookie -from django.http import HttpResponse, HttpResponseRedirect, JsonResponse, HttpResponseForbidden +from django.http import ( + HttpResponse, + HttpResponseRedirect, + JsonResponse, + HttpResponseForbidden, +) from django.conf import settings from django.utils.translation import ugettext as _ from django.forms.models import model_to_dict @@ -28,22 +33,24 @@ from members.views.utils import * @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.read_member', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.read_member", raise_exception=True) def member_list(request, *args, **kwargs): """Render members list.""" - search = request.GET.get('q', None) + search = request.GET.get("q", None) if search: members = Member.find_members_by_name(search) else: members = Member.objects.all() - table = MemberTable(members, - request=request, - exclude=['id'], - attrs={'class': 'table table-bordered table-hover'}) + table = MemberTable( + members, + request=request, + exclude=["id"], + attrs={"class": "table table-bordered table-hover"}, + ) - table.paginate(page=request.GET.get('page', 1), per_page=25) + table.paginate(page=request.GET.get("page", 1), per_page=25) table_html = convert_table_to_html(table, request) queryset = Member.get_members_with_latest_payment(members) @@ -51,61 +58,64 @@ def member_list(request, *args, **kwargs): f_day = 1 f_month = 9 now = timezone.now() - if (now.month >= f_month): + if now.month >= f_month: filter_date = timezone.make_aware(datetime.datetime(now.year, f_month, f_day)) else: - filter_date = timezone.make_aware(datetime.datetime(now.year - 1, f_month, f_day)) + filter_date = timezone.make_aware( + datetime.datetime(now.year - 1, f_month, f_day) + ) context = { - 'table': table_html, - 'member_count': len(members), - 'paid_count': len(queryset.filter(last_paid__gte=filter_date)), - 'notification': request.GET.get('notification', None), + "table": table_html, + "member_count": len(members), + "paid_count": len(queryset.filter(last_paid__gte=filter_date)), + "notification": request.GET.get("notification", None), } - return render(request, 'member_list.html', context) + return render(request, "member_list.html", context) @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.add_member', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.add_member", raise_exception=True) def member_add(request, *args, **kwargs): """Render add member page.""" form = MemberForm() - return render(request, 'member_add.html', {'form': form}) + return render(request, "member_add.html", {"form": form}) @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.delete_member', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.delete_member", raise_exception=True) def member_delete_confirm(request, *args, **kwargs): """Render member deletion confirmation page.""" - i = kwargs.pop('index', None) + i = kwargs.pop("index", None) if i is None: - return error_view(request, _('No member id specified')) + return error_view(request, _("No member id specified")) else: member = Member.objects.get(id=i) form = MemberForm(instance=member) - return render(request, 'member_delete_confirm.html', - {'member_id': i, 'form': form}) + return render( + request, "member_delete_confirm.html", {"member_id": i, "form": form} + ) @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.add_member', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.add_member", raise_exception=True) def member_add_many(request, *args, **kwargs): """Render add multiple members page.""" - return render(request, 'member_add_many.html', {}) + return render(request, "member_add_many.html", {}) @ensure_csrf_cookie @require_http_methods(["POST"]) -@login_required(login_url='/admin/login') -@permission_required('members.add_member', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.add_member", raise_exception=True) def add_many_confirm(request, *args, **kwargs): - models = request.session['models'] - payment_source = request.session['payment_source'] + models = request.session["models"] + payment_source = request.session["payment_source"] try: members, payments = models.members, models.payments @@ -120,40 +130,47 @@ def add_many_confirm(request, *args, **kwargs): msg = "Successfully imported {} members and {} payments." notification = _(msg).format(len(members), len(payments)) - return HttpResponseRedirect('/members/list?notification={}'.format(html.escape(notification))) + return HttpResponseRedirect( + "/members/list?notification={}".format(html.escape(notification)) + ) except Exception as ex: logging.exception('Failed to save models after "add many."') - return error_view(request, _('Failed to import members')) + return error_view(request, _("Failed to import members")) @ensure_csrf_cookie @require_http_methods(["POST"]) -@login_required(login_url='/admin/login') -@permission_required('members.add_member', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.add_member", raise_exception=True) def member_submit(request, *args, **kwargs): """Add member based on data gained from member form.""" form = MemberForm(request.POST) if form.is_valid(): form.save() - logging.info("Saved new member to member register" - "with the following info: {}".format(form.cleaned_data)) - notification = "{} {} {}.".format(_("Successfully added member"), - form.cleaned_data['last_name'], - form.cleaned_data['first_name']) + logging.info( + "Saved new member to member register" + "with the following info: {}".format(form.cleaned_data) + ) + notification = "{} {} {}.".format( + _("Successfully added member"), + form.cleaned_data["last_name"], + form.cleaned_data["first_name"], + ) return HttpResponseRedirect( - '/members/list?notification={}'.format(html.escape(notification))) + "/members/list?notification={}".format(html.escape(notification)) + ) else: return error_view(request, form.errors) @ensure_csrf_cookie @require_http_methods(["POST"]) -@login_required(login_url='/admin/login') -@permission_required('members.change_member', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.change_member", raise_exception=True) def member_update(request, *args, **kwargs): """Update member information.""" - id = request.POST.get('id', None) + id = request.POST.get("id", None) logging.debug(id) if id is not None: member = Member.objects.get(id=id) @@ -165,61 +182,63 @@ def member_update(request, *args, **kwargs): form.save() logging.info( - "Updated member in member register with the following info: {}" - .format(form)) - notification = "{} {} {}.".format(_("Successfully updated member"), - member.last_name, member.first_name) + "Updated member in member register with the following info: {}".format(form) + ) + notification = "{} {} {}.".format( + _("Successfully updated member"), member.last_name, member.first_name + ) return HttpResponseRedirect( - '/members/list?notification={}'.format(html.escape(notification))) + "/members/list?notification={}".format(html.escape(notification)) + ) else: return error_view(request, form.errors) @ensure_csrf_cookie @require_http_methods(["POST"]) -@login_required(login_url='/admin/login') -@permission_required('members.delete_member', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.delete_member", raise_exception=True) def member_delete(request, *args, **kwargs): """Delete member.""" try: - id = request.POST['id'] + id = request.POST["id"] except KeyError: - return error_view(request, _('No member id specified')) + return error_view(request, _("No member id specified")) try: member = Member.objects.get(id=id) - notification = "{} {} {}.".format(_("Successfully deleted member"), - member.last_name, member.first_name) + notification = "{} {} {}.".format( + _("Successfully deleted member"), member.last_name, member.first_name + ) member.delete() logging.info( - "Delete member in member register with the following id: {}" - .format(id)) + "Delete member in member register with the following id: {}".format(id) + ) return HttpResponseRedirect( - '/members/list?notification={}'.format(html.escape(notification))) + "/members/list?notification={}".format(html.escape(notification)) + ) except: - return error_view(request, _('Could not delete member object')) + return error_view(request, _("Could not delete member object")) @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.change_member', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.change_member", raise_exception=True) def member_edit(request, *args, **kwargs): """Edit member information.""" - i = kwargs.pop('index', None) + i = kwargs.pop("index", None) if i is None: - return error_view(request, _('No member id specified')) + return error_view(request, _("No member id specified")) else: member = Member.objects.get(id=i) form = MemberForm(instance=member) - return render( - request, 'member_edit.html', {'member_id': i, 'form': form}) + return render(request, "member_edit.html", {"member_id": i, "form": form}) -@method_decorator(login_required(login_url='/admin/login'), name='dispatch') -@method_decorator(permission_required('members.change_member'), name='dispatch') +@method_decorator(login_required(login_url="/admin/login"), name="dispatch") +@method_decorator(permission_required("members.change_member"), name="dispatch") class MemberAutoComplete(autocomplete.Select2QuerySetView): - def get_queryset(self): qs = Member.objects.all() @@ -236,7 +255,7 @@ class CheckByEmail(APIView): permission_classes = (CheckByEmailPermission,) def get(self, request, format=None): - email = request.query_params.get('email') + email = request.query_params.get("email") exists = bool(email and Member.objects.filter(email=email).exists()) - resp = {'exists': exists} + resp = {"exists": exists} return JsonResponse(resp) diff --git a/members/views/payments.py b/members/views/payments.py index 47b73eb..5511129 100644 --- a/members/views/payments.py +++ b/members/views/payments.py @@ -18,143 +18,142 @@ from members.views import error_view @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.read_payment', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.read_payment", raise_exception=True) def payment_list(request, *args, **kwargs): """Render list of payments.""" - search = request.GET.get('q', None) + search = request.GET.get("q", None) if search: payments = Payment.find_payments_by_name(search) else: payments = Payment.objects.all() - table = PaymentTable(payments, - request=request, - exclude=['id'], - attrs={'class': 'table table-bordered table-hover'}) + table = PaymentTable( + payments, + request=request, + exclude=["id"], + attrs={"class": "table table-bordered table-hover"}, + ) - table.paginate(page=request.GET.get('page', 1), per_page=25) + table.paginate(page=request.GET.get("page", 1), per_page=25) table_html = convert_table_to_html(table, request) context = { - 'table': table_html, - 'payment_count': len(payments), - 'notification': request.GET.get('notification', None) + "table": table_html, + "payment_count": len(payments), + "notification": request.GET.get("notification", None), } - return render(request, 'payment_list.html', context) + return render(request, "payment_list.html", context) @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.add_payment', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.add_payment", raise_exception=True) def payment_add(request, *args, **kwargs): """Render add payment form.""" form = PaymentForm() - return render(request, 'payment_add.html', {'form': form}) + return render(request, "payment_add.html", {"form": form}) @ensure_csrf_cookie @require_http_methods(["POST"]) -@login_required(login_url='/admin/login') -@permission_required('members.add_payment', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.add_payment", raise_exception=True) def payment_submit(request, *args, **kwargs): """Submit payment.""" form = PaymentForm(request.POST) if form.is_valid(): form.save() logging.info( - "Saved new payment to member register with the following info: {}" - .format(form.cleaned_data)) + "Saved new payment to member register with the following info: {}".format( + form.cleaned_data + ) + ) notification = "{} {}.".format( - _("Successfully added payment for member"), - form.cleaned_data['member']) + _("Successfully added payment for member"), form.cleaned_data["member"] + ) return HttpResponseRedirect( - '/members/payments?notification={}' - .format(html.escape(notification))) + "/members/payments?notification={}".format(html.escape(notification)) + ) else: return error_view(request, form.errors) @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.change_payment', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.change_payment", raise_exception=True) def payment_edit(request, *args, **kwargs): """Edit payment.""" - i = kwargs.pop('index', None) + i = kwargs.pop("index", None) if i is None: - return error_view(request, _('No payment id specified')) + return error_view(request, _("No payment id specified")) else: payment = Payment.objects.get(id=i) form = PaymentForm(instance=payment) - return render(request, - 'payment_edit.html', - {'payment_id': i, 'form': form}) + return render(request, "payment_edit.html", {"payment_id": i, "form": form}) @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.delete_payment', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.delete_payment", raise_exception=True) def payment_delete_confirm(request, *args, **kwargs): """Render payment delete confirmation page.""" - i = kwargs.pop('index', None) + i = kwargs.pop("index", None) if i is None: - return error_view(request, _('No payment id specified')) + return error_view(request, _("No payment id specified")) else: payment = Payment.objects.get(id=i) form = PaymentForm(instance=payment) - return render(request, - 'payment_delete_confirm.html', - {'payment_id': i, 'form': form}) + return render( + request, "payment_delete_confirm.html", {"payment_id": i, "form": form} + ) @ensure_csrf_cookie @require_http_methods(["POST"]) -@login_required(login_url='/admin/login') -@permission_required('members.delete_payment', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.delete_payment", raise_exception=True) def payment_delete(request, *args, **kwargs): """Delete payment.""" try: - id = request.POST['id'] + id = request.POST["id"] except KeyError: - return error_view(request, _('No payment id specified')) + return error_view(request, _("No payment id specified")) try: payment = Payment.objects.get(id=id) - notification = "{} {}.".format( - _("Successfully deleted payment"), str(payment)) + notification = "{} {}.".format(_("Successfully deleted payment"), str(payment)) payment.delete() - logging.info( - "Delete payment '{}' in member register".format(str(payment))) + logging.info("Delete payment '{}' in member register".format(str(payment))) return HttpResponseRedirect( - '/members/payments?notification={}' - .format(html.escape(notification))) + "/members/payments?notification={}".format(html.escape(notification)) + ) except: - return error_view(request, _('Could not delete payment object')) + return error_view(request, _("Could not delete payment object")) @ensure_csrf_cookie @require_http_methods(["POST"]) -@login_required(login_url='/admin/login') -@permission_required('members.change_payment', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.change_payment", raise_exception=True) def payment_update(request, *args, **kwargs): """Update payment information.""" form = PaymentForm(request.POST) if form.is_valid(): - id = request.POST['id'] + id = request.POST["id"] payment = Payment.objects.get(id=id) form = PaymentForm(request.POST, instance=payment) form.save() logging.info( - "Updated member in member register with the following info: {}" - .format(form)) - notification = "{} {}.".format( - _("Successfully updated payment"), str(payment)) + "Updated member in member register with the following info: {}".format(form) + ) + notification = "{} {}.".format(_("Successfully updated payment"), str(payment)) return HttpResponseRedirect( - '/members/payments?notification={}' - .format(html.escape(notification))) + "/members/payments?notification={}".format(html.escape(notification)) + ) else: - return error_view(request, _('Could not update payment object')) + return error_view(request, _("Could not update payment object")) diff --git a/members/views/utils.py b/members/views/utils.py index e904ded..36bf60c 100644 --- a/members/views/utils.py +++ b/members/views/utils.py @@ -21,7 +21,13 @@ from rest_framework import generics from rest_framework import permissions from members.models import Member, Request, Payment -from members.forms import MemberForm, PaymentForm, ApplicationForm, CSVValidationError, UploadFileForm +from members.forms import ( + MemberForm, + PaymentForm, + ApplicationForm, + CSVValidationError, + UploadFileForm, +) from members.tables import MemberTable, PaymentTable, RequestTable from members.resources import MemberResource, PaymentResource, ApplicationResource @@ -32,12 +38,15 @@ class MemberDetail(generics.RetrieveAPIView): queryset = Member.objects.all() serializer_class = MemberSerializer - permission_classes = (permissions.DjangoModelPermissions, ) - throttle_classes = (BurstRateThrottle, SustainedRateThrottle, ) + permission_classes = (permissions.DjangoModelPermissions,) + throttle_classes = ( + BurstRateThrottle, + SustainedRateThrottle, + ) def error_view(request, message, status=400): - return render(request, 'error.html', {'error': message}, status=400) + return render(request, "error.html", {"error": message}, status=400) def validate_recaptcha(response): @@ -48,15 +57,15 @@ def validate_recaptcha(response): :return: Boolean, success or not """ values = { - 'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY, - 'response': response, + "secret": settings.GOOGLE_RECAPTCHA_SECRET_KEY, + "response": response, } url = "https://www.google.com/recaptcha/api/siteverify" - headers = {'Content-type': 'application/x-www-form-urlencoded'} + headers = {"Content-type": "application/x-www-form-urlencoded"} resp = requests.post(url, values, headers=headers) try: result = json.loads(resp.text) - logging.info('Recaptcha response: {}'.format(result)) + logging.info("Recaptcha response: {}".format(result)) return result["success"] except: return False @@ -87,81 +96,88 @@ def convert_table_to_html(table, request): @ensure_csrf_cookie @require_http_methods(["GET"]) -@login_required(login_url='/admin/login') -@permission_required('members.change_member', raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required("members.change_member", raise_exception=True) def settings_page(request, *args, **kwargs): """Render member app settings page.""" - return render(request, 'settings.html', {}) + return render(request, "settings.html", {}) @ensure_csrf_cookie @require_http_methods(["POST"]) -@login_required(login_url='/admin/login') -@permission_required(['members.change_member', 'members.change_payment'], raise_exception=True) +@login_required(login_url="/admin/login") +@permission_required( + ["members.change_member", "members.change_payment"], raise_exception=True +) def import_csv(request, *args, **kwargs): """Get csv data imported to page and create members based on that.""" try: - csv_in_memory_file = request.FILES.get('csvFile') + csv_in_memory_file = request.FILES.get("csvFile") csv_file = csv_in_memory_file.file - data = csv_file.read().decode('utf-8') + data = csv_file.read().decode("utf-8") - delimiter = request.POST.get('delimiter', ',') - payment_source = request.POST['payment_source'] + delimiter = request.POST.get("delimiter", ",") + payment_source = request.POST["payment_source"] except: - return error_view(request, _('Missing CSV file')) + return error_view(request, _("Missing CSV file")) try: - result = MemberForm.csv_to_models(data, payment_source=payment_source, delimiter=delimiter) + result = MemberForm.csv_to_models( + data, payment_source=payment_source, delimiter=delimiter + ) except CSVValidationError as ex: - logging.exception('Model validation error') + logging.exception("Model validation error") return error_view(request, ex.form_errors) except Exception as ex: - logging.exception('Other error in CSV import') + logging.exception("Other error in CSV import") return error_view(request, str(ex)) - member_table = MemberTable(result.members, - request=request, - exclude=['id', 'options'], - attrs={'class': 'table table-bordered table-hover'}) + member_table = MemberTable( + result.members, + request=request, + exclude=["id", "options"], + attrs={"class": "table table-bordered table-hover"}, + ) - member_table.paginate(page=request.GET.get('page', 1), per_page=999999) + member_table.paginate(page=request.GET.get("page", 1), per_page=999999) member_table_html = convert_table_to_html(member_table, request) - payment_table = PaymentTable(result.payments, - request=request, - exclude=['id', 'options'], - attrs={'class': 'table table-bordered table-hover'}) + payment_table = PaymentTable( + result.payments, + request=request, + exclude=["id", "options"], + attrs={"class": "table table-bordered table-hover"}, + ) - payment_table.paginate(page=request.GET.get('page', 1), per_page=999999) + payment_table.paginate(page=request.GET.get("page", 1), per_page=999999) payment_table_html = convert_table_to_html(payment_table, request) - request.session['models'] = result - request.session['payment_source'] = payment_source - context = { - 'members': member_table_html, - 'payments': payment_table_html - } - return render(request, 'member_add_many_confirm.html', context) + request.session["models"] = result + request.session["payment_source"] = payment_source + context = {"members": member_table_html, "payments": payment_table_html} + return render(request, "member_add_many_confirm.html", context) def make_excel_response(Resource): res = Resource() dataset = res.export() - response = HttpResponse(dataset.xlsx, content_type='application/vnd.ms-excel; charset=utf-8') - response['Content-Disposition'] = 'attachment; filename="export.xlsx"' + response = HttpResponse( + dataset.xlsx, content_type="application/vnd.ms-excel; charset=utf-8" + ) + response["Content-Disposition"] = 'attachment; filename="export.xlsx"' return response -@require_http_methods(['GET']) +@require_http_methods(["GET"]) def export_members_excel(request, *args, **kwargs): return make_excel_response(MemberResource) -@require_http_methods(['GET']) +@require_http_methods(["GET"]) def export_payments_excel(request, *args, **kwargs): return make_excel_response(PaymentResource) -@require_http_methods(['GET']) +@require_http_methods(["GET"]) def export_applications_excel(request, *args, **kwargs): return make_excel_response(ApplicationResource) diff --git a/misc/namegenerator.py b/misc/namegenerator.py index 40adfbe..95223a7 100644 --- a/misc/namegenerator.py +++ b/misc/namegenerator.py @@ -3,14 +3,18 @@ import os def generate_names(n): - ''' + """ generates list of n random names returns tuple(first, last) - ''' - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), "firstnames.txt")) as f: - fs = f.read().split('\n') - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), "lastnames.txt")) as f: - ls = f.read().split('\n') + """ + with open( + os.path.join(os.path.dirname(os.path.realpath(__file__)), "firstnames.txt") + ) as f: + fs = f.read().split("\n") + with open( + os.path.join(os.path.dirname(os.path.realpath(__file__)), "lastnames.txt") + ) as f: + ls = f.read().split("\n") names = [] for i in range(n): diff --git a/ohlhafv/apps.py b/ohlhafv/apps.py index 5ec65cf..f80bd45 100644 --- a/ohlhafv/apps.py +++ b/ohlhafv/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class OhlhafvConfig(AppConfig): - name = 'ohlhafv' + name = "ohlhafv" diff --git a/ohlhafv/forms.py b/ohlhafv/forms.py index 555856d..78a58ba 100644 --- a/ohlhafv/forms.py +++ b/ohlhafv/forms.py @@ -14,4 +14,4 @@ class OhlhafvForm(forms.ModelForm): """Meta class for Ohlhafv form.""" model = OhlhafvChallenge - fields = ['challenger', 'victim', 'victim_email', 'series', 'message'] + fields = ["challenger", "victim", "victim_email", "series", "message"] diff --git a/ohlhafv/migrations/0001_initial.py b/ohlhafv/migrations/0001_initial.py index 9b34fac..9dee15f 100644 --- a/ohlhafv/migrations/0001_initial.py +++ b/ohlhafv/migrations/0001_initial.py @@ -9,24 +9,55 @@ class Migration(migrations.Migration): initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='OhlhafvChallenge', + name="OhlhafvChallenge", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('challenger', models.CharField(max_length=255, verbose_name='Challenger')), - ('victim', models.CharField(max_length=255, verbose_name='Victim')), - ('challenger_email', models.EmailField(max_length=254, verbose_name='Challenger email')), - ('victim_email', models.EmailField(max_length=254, verbose_name='Victim email')), - ('series', models.CharField(choices=[('0.33 L', '0.33 L'), ('0.5 L', '0.5 L'), ('1.0 L', '1.0 L'), ('Team', 'Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0 L)')], max_length=10, verbose_name='Series')), - ('message', models.TextField(blank=True, verbose_name='Message')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "challenger", + models.CharField(max_length=255, verbose_name="Challenger"), + ), + ("victim", models.CharField(max_length=255, verbose_name="Victim")), + ( + "challenger_email", + models.EmailField(max_length=254, verbose_name="Challenger email"), + ), + ( + "victim_email", + models.EmailField(max_length=254, verbose_name="Victim email"), + ), + ( + "series", + models.CharField( + choices=[ + ("0.33 L", "0.33 L"), + ("0.5 L", "0.5 L"), + ("1.0 L", "1.0 L"), + ( + "Team", + "Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0 L)", + ), + ], + max_length=10, + verbose_name="Series", + ), + ), + ("message", models.TextField(blank=True, verbose_name="Message")), ], options={ - 'verbose_name': 'Ohlhafv challenge', - 'verbose_name_plural': 'Ohlhafv challenges', + "verbose_name": "Ohlhafv challenge", + "verbose_name_plural": "Ohlhafv challenges", }, ), ] diff --git a/ohlhafv/migrations/0002_remove_ohlhafvchallenge_challenger_email.py b/ohlhafv/migrations/0002_remove_ohlhafvchallenge_challenger_email.py index 3316c02..a77b2a4 100644 --- a/ohlhafv/migrations/0002_remove_ohlhafvchallenge_challenger_email.py +++ b/ohlhafv/migrations/0002_remove_ohlhafvchallenge_challenger_email.py @@ -8,12 +8,12 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('ohlhafv', '0001_initial'), + ("ohlhafv", "0001_initial"), ] operations = [ migrations.RemoveField( - model_name='ohlhafvchallenge', - name='challenger_email', + model_name="ohlhafvchallenge", + name="challenger_email", ), ] diff --git a/ohlhafv/models.py b/ohlhafv/models.py index 3691ff7..ed53131 100644 --- a/ohlhafv/models.py +++ b/ohlhafv/models.py @@ -12,32 +12,32 @@ from phonenumber_field.modelfields import PhoneNumberField import logging -VERBOSE_NAME = _('Ohlhafv') +VERBOSE_NAME = _("Ohlhafv") class OhlhafvChallenge(models.Model): """Model containing all info about ohlhafv challenge.""" class Meta: - verbose_name = _('Ohlhafv challenge') - verbose_name_plural = _('Ohlhafv challenges') + verbose_name = _("Ohlhafv challenge") + verbose_name_plural = _("Ohlhafv challenges") SERIES_CHOICES = ( - ('0.33 L', '0.33 L'), - ('0.5 L', '0.5 L'), - ('1.0 L', '1.0 L'), - ('Team', _('Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0 L)')) + ("0.33 L", "0.33 L"), + ("0.5 L", "0.5 L"), + ("1.0 L", "1.0 L"), + ("Team", _("Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0 L)")), ) - challenger = models.CharField(_('Challenger'), max_length=255) - victim = models.CharField(_('Victim'), max_length=255) - victim_email = models.EmailField(_('Victim email')) - series = models.CharField(_('Series'), choices=SERIES_CHOICES, max_length=10) - message = models.TextField(_('Message'), blank=True, null=False) + challenger = models.CharField(_("Challenger"), max_length=255) + victim = models.CharField(_("Victim"), max_length=255) + victim_email = models.EmailField(_("Victim email")) + series = models.CharField(_("Series"), choices=SERIES_CHOICES, max_length=10) + message = models.TextField(_("Message"), blank=True, null=False) def __str__(self): """Return model info.""" - return _('Ohlhafv challenge: {} vs. {}').format(self.challenger, self.victim) + return _("Ohlhafv challenge: {} vs. {}").format(self.challenger, self.victim) auditlog.register(OhlhafvChallenge) diff --git a/ohlhafv/urls.py b/ohlhafv/urls.py index db56349..572edd2 100644 --- a/ohlhafv/urls.py +++ b/ohlhafv/urls.py @@ -8,11 +8,12 @@ from ohlhafv.views import * urlpatterns = [ # ohlhafv - url(r'^submit', ohlhafv_submit), - url(r'^list', ohlhafv_list), - url(r'^$', ohlhafv_view) + url(r"^submit", ohlhafv_submit), + url(r"^list", ohlhafv_list), + url(r"^$", ohlhafv_view), ] if settings.DEBUG: from django.contrib.staticfiles.urls import staticfiles_urlpatterns + urlpatterns += staticfiles_urlpatterns() diff --git a/sikweb/base.py b/sikweb/base.py index 03f1864..3f24aaf 100644 --- a/sikweb/base.py +++ b/sikweb/base.py @@ -11,7 +11,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ -SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' +SESSION_SERIALIZER = "django.contrib.sessions.serializers.PickleSerializer" # Logger level @@ -20,49 +20,47 @@ LOGPATH = os.path.join(BASE_DIR, "logs", "debug.log") def disable_pyexcel_logs(record): - if record.module in ['loader', 'utils', 'source_plugin', 'plugin']: + if record.module in ["loader", "utils", "source_plugin", "plugin"]: return False return True LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'filters': { - 'disable_pyexcel_logs': { - '()': 'django.utils.log.CallbackFilter', - 'callback': disable_pyexcel_logs + "version": 1, + "disable_existing_loggers": False, + "filters": { + "disable_pyexcel_logs": { + "()": "django.utils.log.CallbackFilter", + "callback": disable_pyexcel_logs, }, }, - 'formatters': { - 'verbose': { - 'format': '%(levelname)s %(asctime)s %(module)s: %(message)s' + "formatters": { + "verbose": {"format": "%(levelname)s %(asctime)s %(module)s: %(message)s"}, + }, + "handlers": { + "file": { + "level": "DEBUG", + "class": "logging.FileHandler", + "filename": LOGPATH, + "formatter": "verbose", + }, + "console": { + "level": "DEBUG", + "class": "logging.StreamHandler", + "formatter": "verbose", + "filters": ["disable_pyexcel_logs"], }, }, - 'handlers': { - 'file': { - 'level': 'DEBUG', - 'class': 'logging.FileHandler', - 'filename': LOGPATH, - 'formatter': 'verbose', - }, - 'console': { - 'level': 'DEBUG', - 'class': 'logging.StreamHandler', - 'formatter': 'verbose', - 'filters': ['disable_pyexcel_logs'], - }, + "root": { + "handlers": ["file", "console"], + "level": "DEBUG", + "propagate": True, }, - 'root': { - 'handlers': ['file', 'console'], - 'level': 'DEBUG', - 'propagate': True, - }, - 'loggers': { - 'django': { - 'handlers': ['file', 'console'], - 'level': 'WARNING', - 'propagate': True, + "loggers": { + "django": { + "handlers": ["file", "console"], + "level": "WARNING", + "propagate": True, }, }, } @@ -71,121 +69,117 @@ LOGGING = { # Application definition INSTALLED_APPS = [ - 'modeltranslation', # has to be before admin for translation admin to work - 'suit', - 'dal', - 'dal_select2', - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'rest_framework.authtoken', - 'corsheaders', - 'webapp', - 'members', - 'infoscreen', - 'kaehmy', - 'ohlhafv', - 'rest_framework', - 'rest_framework_jwt', - 'django_nose', - 'bootstrap3', - 'django_tables2', - 'auditlog', - 'phonenumber_field', - 'import_export', - 'django_filters', + "modeltranslation", # has to be before admin for translation admin to work + "suit", + "dal", + "dal_select2", + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + "rest_framework.authtoken", + "corsheaders", + "webapp", + "members", + "infoscreen", + "kaehmy", + "ohlhafv", + "rest_framework", + "rest_framework_jwt", + "django_nose", + "bootstrap3", + "django_tables2", + "auditlog", + "phonenumber_field", + "import_export", + "django_filters", ] IMPORT_EXPORT_USE_TRANSACTIONS = True -TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' +TEST_RUNNER = "django_nose.NoseTestSuiteRunner" NOSE_ARGS = [ - '--with-coverage', - '--cover-package=webapp,members,infoscreen', - '--exclude-dir={}'.format(os.path.join(BASE_DIR, 'members', 'migrations')), - '--exclude-dir={}'.format(os.path.join(BASE_DIR, - 'infoscreen', 'migrations')), - '--exclude-dir={}'.format(os.path.join(BASE_DIR, 'webapp', 'migrations')), + "--with-coverage", + "--cover-package=webapp,members,infoscreen", + "--exclude-dir={}".format(os.path.join(BASE_DIR, "members", "migrations")), + "--exclude-dir={}".format(os.path.join(BASE_DIR, "infoscreen", "migrations")), + "--exclude-dir={}".format(os.path.join(BASE_DIR, "webapp", "migrations")), ] MIDDLEWARE = [ - 'sikweb.middleware.ForceDefaultLanguageMiddleware', - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.locale.LocaleMiddleware', - 'corsheaders.middleware.CorsMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'auditlog.middleware.AuditlogMiddleware' + "sikweb.middleware.ForceDefaultLanguageMiddleware", + "django.middleware.security.SecurityMiddleware", + "whitenoise.middleware.WhiteNoiseMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.locale.LocaleMiddleware", + "corsheaders.middleware.CorsMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", + "auditlog.middleware.AuditlogMiddleware", ] CORS_ORIGIN_ALLOW_ALL = True -ROOT_URLCONF = 'sikweb.urls' +ROOT_URLCONF = "sikweb.urls" TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': ['templates'], - 'OPTIONS': { - 'loaders': [ - 'app_namespace.Loader', - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": ["templates"], + "OPTIONS": { + "loaders": [ + "app_namespace.Loader", + "django.template.loaders.filesystem.Loader", + "django.template.loaders.app_directories.Loader", ], - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.template.context_processors.i18n', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - 'django.template.context_processors.static', - 'dealer.contrib.django.context_processor', + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.template.context_processors.i18n", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + "django.template.context_processors.static", + "dealer.contrib.django.context_processor", ], }, }, ] -WSGI_APPLICATION = 'sikweb.wsgi.application' +WSGI_APPLICATION = "sikweb.wsgi.application" # Password validation # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { - 'NAME': 'django.contrib.auth.password_validation.' - 'UserAttributeSimilarityValidator', + "NAME": "django.contrib.auth.password_validation." + "UserAttributeSimilarityValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.' - 'MinimumLengthValidator', + "NAME": "django.contrib.auth.password_validation." "MinimumLengthValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.' - 'CommonPasswordValidator', + "NAME": "django.contrib.auth.password_validation." "CommonPasswordValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.' - 'NumericPasswordValidator', + "NAME": "django.contrib.auth.password_validation." "NumericPasswordValidator", }, ] REST_FRAMEWORK = { - 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticated', - 'rest_framework.permissions.DjangoModelPermissions', - 'rest_framework.permissions.IsAdminUser', + "DEFAULT_PERMISSION_CLASSES": ( + "rest_framework.permissions.IsAuthenticated", + "rest_framework.permissions.DjangoModelPermissions", + "rest_framework.permissions.IsAdminUser", ), - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', + "DEFAULT_AUTHENTICATION_CLASSES": ( + "rest_framework_jwt.authentication.JSONWebTokenAuthentication", ), # 'DEFAULT_THROTTLE_CLASSES': ( # 'members.throttles.BurstRateThrottle', @@ -195,11 +189,9 @@ REST_FRAMEWORK = { # 'burst': '60/min', # 'sustained': '1000/day' # }, - 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', - 'PAGE_SIZE': 1000, - 'DEFAULT_FILTER_BACKENDS': ( - 'django_filters.rest_framework.DjangoFilterBackend', - ), + "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination", + "PAGE_SIZE": 1000, + "DEFAULT_FILTER_BACKENDS": ("django_filters.rest_framework.DjangoFilterBackend",), } # Email settings (tested working with gmail) @@ -213,17 +205,15 @@ REST_FRAMEWORK = { # https://docs.djangoproject.com/en/1.9/topics/i18n/ LANGUAGES = ( - ('fi', _('Finnish')), - ('en', _('English')), + ("fi", _("Finnish")), + ("en", _("English")), ) -LANGUAGE_CODE = 'fi' +LANGUAGE_CODE = "fi" -LOCALE_PATHS = ( - os.path.join(BASE_DIR, 'locale'), -) +LOCALE_PATHS = (os.path.join(BASE_DIR, "locale"),) -TIME_ZONE = 'Europe/Helsinki' +TIME_ZONE = "Europe/Helsinki" USE_I18N = True @@ -235,30 +225,26 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.9/howto/static-files/ STATICFILES_FINDERS = ( - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - 'django.contrib.staticfiles.finders.FileSystemFinder', + "django.contrib.staticfiles.finders.AppDirectoriesFinder", + "django.contrib.staticfiles.finders.FileSystemFinder", ) -STATIC_URL = '/static/' -STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static') -STATICFILES_DIRS = ( - os.path.join(BASE_DIR, 'static'), -) -MEDIA_ROOT = os.path.join(BASE_DIR, 'media') -MEDIA_URL = '/media/' +STATIC_URL = "/static/" +STATIC_ROOT = os.path.join(BASE_DIR, "collected_static") +STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),) +MEDIA_ROOT = os.path.join(BASE_DIR, "media") +MEDIA_URL = "/media/" -LOGIN_URL = '/login/' -LOGIN_REDIRECT_URL = '/admin' +LOGIN_URL = "/login/" +LOGIN_REDIRECT_URL = "/admin" SUIT_CONFIG = { # header - 'ADMIN_NAME': 'SIK Admin', + "ADMIN_NAME": "SIK Admin", # 'HEADER_DATE_FORMAT': 'l, j. F Y', # 'HEADER_TIME_FORMAT': 'H:i', - # forms # 'SHOW_REQUIRED_ASTERISK': True, # Default True # 'CONFIRM_UNSAVED_CHANGES': True, # Default True - # menu # 'SEARCH_URL': '/admin/auth/user/', # 'MENU_ICONS': { @@ -273,11 +259,8 @@ SUIT_CONFIG = { # {'label': 'Settings', 'icon':'icon-cog', 'models': ('auth.user', 'auth.group')}, # {'label': 'Support', 'icon':'icon-question-sign', 'url': '/support/'}, # ), - # misc # 'LIST_PER_PAGE': 15 } -JWT_AUTH = { - 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7) -} +JWT_AUTH = {"JWT_EXPIRATION_DELTA": datetime.timedelta(days=7)} diff --git a/sikweb/middleware.py b/sikweb/middleware.py index 11e924d..cc385f3 100644 --- a/sikweb/middleware.py +++ b/sikweb/middleware.py @@ -8,9 +8,10 @@ def ForceDefaultLanguageMiddleware(get_response): Should be installed *before* any middleware that checks request.META['HTTP_ACCEPT_LANGUAGE'], namely django.middleware.locale.LocaleMiddleware """ + def process_request(request): - if 'HTTP_ACCEPT_LANGUAGE' in request.META: - del request.META['HTTP_ACCEPT_LANGUAGE'] + if "HTTP_ACCEPT_LANGUAGE" in request.META: + del request.META["HTTP_ACCEPT_LANGUAGE"] return get_response(request) return process_request diff --git a/sikweb/settings.py b/sikweb/settings.py index 1a9f4dc..aa87f7a 100644 --- a/sikweb/settings.py +++ b/sikweb/settings.py @@ -1,4 +1,3 @@ - """ Django settings for sikweb project. @@ -15,8 +14,8 @@ import sentry_sdk from sentry_sdk.integrations.django import DjangoIntegration from sikweb.base import * -SENTRY_DSN = os.getenv('SENTRY_DSN', '') -DEPLOY_ENV = os.getenv('DEPLOY_ENV', 'production') +SENTRY_DSN = os.getenv("SENTRY_DSN", "") +DEPLOY_ENV = os.getenv("DEPLOY_ENV", "production") # Setup sentry sentry_sdk.init( @@ -25,52 +24,56 @@ sentry_sdk.init( integrations=[DjangoIntegration()], # If you wish to associate users to errors (assuming you are using # django.contrib.auth) you may enable sending PII data. - send_default_pii=True + send_default_pii=True, ) # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = os.getenv('DEBUG', False) == 'True' +DEBUG = os.getenv("DEBUG", False) == "True" -URL = os.getenv('HOST', 'api.sahkoinsinoorikilta.fi') -FRONTEND_URL = os.getenv('FRONTEND_URL', 'sahkoinsinoorikilta.fi') -ALLOWED_HOSTS = ['localhost', '127.0.0.1', FRONTEND_URL, URL] +URL = os.getenv("HOST", "api.sahkoinsinoorikilta.fi") +FRONTEND_URL = os.getenv("FRONTEND_URL", "sahkoinsinoorikilta.fi") +ALLOWED_HOSTS = ["localhost", "127.0.0.1", FRONTEND_URL, URL] if DEBUG: - ALLOWED_HOSTS = ['*'] + ALLOWED_HOSTS = ["*"] USE_X_FORWARDED_HOST = True -SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') +SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('SECRET_KEY', '7p$85^4ibb^p4-=vs44b7!y0e-zemugze18@a#30&71=a8)dp(') +SECRET_KEY = os.getenv( + "SECRET_KEY", "7p$85^4ibb^p4-=vs44b7!y0e-zemugze18@a#30&71=a8)dp(" +) # ReCaptcha # http://www.yaconiello.com/blog/integrating-google-recaptcha-to-django/ -GOOGLE_RECAPTCHA_SITE_KEY = os.getenv('GOOGLE_RECAPTCHA_SITE_KEY', 'YOUR-PUBLIC-KEY') -GOOGLE_RECAPTCHA_SECRET_KEY = os.getenv('GOOGLE_RECAPTCHA_SECRET_KEY', 'YOUR-PRIVATE-KEY') +GOOGLE_RECAPTCHA_SITE_KEY = os.getenv("GOOGLE_RECAPTCHA_SITE_KEY", "YOUR-PUBLIC-KEY") +GOOGLE_RECAPTCHA_SECRET_KEY = os.getenv( + "GOOGLE_RECAPTCHA_SECRET_KEY", "YOUR-PRIVATE-KEY" +) # Email settings (more settings in base.py) -EMAIL_API_KEY = os.getenv('EMAIL_API_KEY', '') +EMAIL_API_KEY = os.getenv("EMAIL_API_KEY", "") # EMAIL_API_SECRET = os.getenv('EMAIL_API_SECRET', '') -DEFAULT_EMAIL_FROM = 'SIK' -DEFAULT_EMAIL_FROM_ADDR = 'noreply@sahkoinsinoorikilta.fi' +DEFAULT_EMAIL_FROM = "SIK" +DEFAULT_EMAIL_FROM_ADDR = "noreply@sahkoinsinoorikilta.fi" ENABLE_AUTOMATIC_EMAILS = True # Token for Telegram bot -TELEGRAM_BOT_TOKEN = os.getenv('TG_BOT_TOKEN', '') +TELEGRAM_BOT_TOKEN = os.getenv("TG_BOT_TOKEN", "") # Database settings # Only uncomment if default settings in base.py are not ok -DB_OPTIONS = {'sslmode': 'require'} if os.getenv('DB_SSL', False) == 'True' else {} +DB_OPTIONS = {"sslmode": "require"} if os.getenv("DB_SSL", False) == "True" else {} DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': os.getenv('DB_NAME', 'postgres'), - 'USER': os.getenv('DB_USER', 'postgres'), - 'PASSWORD': os.getenv('DB_PASSWD', 'postgres'), - 'HOST': os.getenv('DB_HOST', 'localhost'), - 'PORT': os.getenv('DB_PORT', 5432), - 'OPTIONS': DB_OPTIONS, + "default": { + "ENGINE": "django.db.backends.postgresql_psycopg2", + "NAME": os.getenv("DB_NAME", "postgres"), + "USER": os.getenv("DB_USER", "postgres"), + "PASSWORD": os.getenv("DB_PASSWD", "postgres"), + "HOST": os.getenv("DB_HOST", "localhost"), + "PORT": os.getenv("DB_PORT", 5432), + "OPTIONS": DB_OPTIONS, } } diff --git a/sikweb/urls.py b/sikweb/urls.py index 8bec032..74ac35f 100644 --- a/sikweb/urls.py +++ b/sikweb/urls.py @@ -23,28 +23,22 @@ from django.conf import settings from django.contrib.staticfiles import views as static_views from django.views.generic.base import RedirectView -favicon_view = RedirectView.as_view( - url='static/img/favicon.png', permanent=True) +favicon_view = RedirectView.as_view(url="static/img/favicon.png", permanent=True) urlpatterns = [ - url(r'', include('webapp.urls')), - url(r'^members/', include('members.urls')), - url(r'^infoscreen/', include('infoscreen.urls')), - url(r'^kaehmy/', include('kaehmy.urls')), - url(r'^ohlhafv/', include('ohlhafv.urls')), - + url(r"", include("webapp.urls")), + url(r"^members/", include("members.urls")), + url(r"^infoscreen/", include("infoscreen.urls")), + url(r"^kaehmy/", include("kaehmy.urls")), + url(r"^ohlhafv/", include("ohlhafv.urls")), # favourite icon - url(r'^favicon\.ico$', favicon_view), - + url(r"^favicon\.ico$", favicon_view), # admin - url(r'^admin/', admin.site.urls), - + url(r"^admin/", admin.site.urls), # i18n default view for changing the active language - url(r'^i18n/', include('django.conf.urls.i18n')), - + url(r"^i18n/", include("django.conf.urls.i18n")), # staticfiles default view for static files in development - url(r'^static/(?P.*)$', static_views.serve), - url(r'^media/(?P.*)$', - static_serve, {'document_root': settings.MEDIA_ROOT}), + url(r"^static/(?P.*)$", static_views.serve), + url(r"^media/(?P.*)$", static_serve, {"document_root": settings.MEDIA_ROOT}), ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) diff --git a/webapp/admin.py b/webapp/admin.py index 32d910a..0913d34 100644 --- a/webapp/admin.py +++ b/webapp/admin.py @@ -4,6 +4,7 @@ from django.contrib import admin from webapp.models import Feed, Tag, Event, Signup, SignupForm, TemplateQuestion, JobAd from modeltranslation.admin import TranslationAdmin from django.contrib.auth.models import Permission + # this is needed so that the models get registered for translation import webapp.translation diff --git a/webapp/apps.py b/webapp/apps.py index b79a601..ac08240 100644 --- a/webapp/apps.py +++ b/webapp/apps.py @@ -6,7 +6,7 @@ from django.apps import AppConfig class WebappConfig(AppConfig): """Webapp configurations.""" - name = 'webapp' + name = "webapp" def ready(self): """Import translations.""" diff --git a/webapp/management/commands/createdefaultadmin.py b/webapp/management/commands/createdefaultadmin.py index 3df2fd8..e0d823f 100644 --- a/webapp/management/commands/createdefaultadmin.py +++ b/webapp/management/commands/createdefaultadmin.py @@ -17,4 +17,8 @@ class Command(BaseCommand): u.is_staff = True u.save() - self.stdout.write("Created default user {} with password {}.".format(self.user_name, self.password)) + self.stdout.write( + "Created default user {} with password {}.".format( + self.user_name, self.password + ) + ) diff --git a/webapp/management/commands/createdummydata.py b/webapp/management/commands/createdummydata.py index f10c1c6..95439b1 100644 --- a/webapp/management/commands/createdummydata.py +++ b/webapp/management/commands/createdummydata.py @@ -10,17 +10,18 @@ from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): - def handle(self, *args, **options): - print('THIS SCRIPT WILL GENERATE DUMMY VALUES TO DATABASE ' - 'AND SHOULD __NEVER__ BE RUN ON PRODUCTION. ' - 'IF YOU ARE ON PRODUCTION ABORT (ctrl-c) IMMEDIATELY!!!! ' - 'CONTINUING IN 10 SECONDS') + print( + "THIS SCRIPT WILL GENERATE DUMMY VALUES TO DATABASE " + "AND SHOULD __NEVER__ BE RUN ON PRODUCTION. " + "IF YOU ARE ON PRODUCTION ABORT (ctrl-c) IMMEDIATELY!!!! " + "CONTINUING IN 10 SECONDS" + ) time.sleep(10) - DOMAINS = ["example.coms", 'ggmail.om', "notmail.dom"] # intentionally wrong + DOMAINS = ["example.coms", "ggmail.om", "notmail.dom"] # intentionally wrong PLACES = ["Helsinki", "Espoo", "Korso", "Kerava", "Kouvostoliitto"] MEMBER_COUNT = 30 MEMBER_REQUEST_COUNT = 3 @@ -28,44 +29,37 @@ class Command(BaseCommand): names = generate_names(MEMBER_COUNT) for i in range(MEMBER_COUNT): first, last = names[i] - mail = "{}.{}@{}".format(first.lower(), last.lower(), random.choice(DOMAINS)) + mail = "{}.{}@{}".format( + first.lower(), last.lower(), random.choice(DOMAINS) + ) por = random.choice(PLACES) ayy = random.randint(0, 1) jas = random.randint(0, 1) - Member.objects.create(first_name=first, - last_name=last, - email=mail, - POR=por, - AYY=ayy, - jas=jas) + Member.objects.create( + first_name=first, last_name=last, email=mail, POR=por, AYY=ayy, jas=jas + ) i_item = ExternalImageInfoItem.objects.create( - name="Heavy", - url="https://i.imgur.com/XXSSqDG.gif" + name="Heavy", url="https://i.imgur.com/XXSSqDG.gif" ) rot = Rotation.objects.create(name="Demo") - inst = InfoInstance.objects.create( - rotation=rot, - item=i_item, - duration=20.0 - ) + inst = InfoInstance.objects.create(rotation=rot, item=i_item, duration=20.0) names = generate_names(MEMBER_COUNT) for i in range(MEMBER_COUNT): first, last = names[i] - mail = "{}.{}@{}".format(first.lower(), last.lower(), random.choice(DOMAINS)) + mail = "{}.{}@{}".format( + first.lower(), last.lower(), random.choice(DOMAINS) + ) por = random.choice(PLACES) ayy = random.randint(0, 1) jas = random.randint(0, 1) - Member.objects.create(first_name=first, - last_name=last, - email=mail, - POR=por, - AYY=ayy, - jas=jas) + Member.objects.create( + first_name=first, last_name=last, email=mail, POR=por, AYY=ayy, jas=jas + ) TAGS = ["Party", "International", "Freshmen", "Culture"] TAG_COUNT = 2 @@ -74,9 +68,9 @@ class Command(BaseCommand): slug = TAGS[i] + str(random.randint(0, 10)) name = slug + str(random.randint(0, 10)) print(slug, name) - Tag.objects.create(slug=slug, - name=name, - icon="http://testiurl.com/kuva.jpg") + Tag.objects.create( + slug=slug, name=name, icon="http://testiurl.com/kuva.jpg" + ) FEED_COUNT = 3 @@ -84,10 +78,9 @@ class Command(BaseCommand): title = "ds" + str(random.randint(0, 15)) description = "dsg" + str(random.randint(0, 20)) content = "fdfd" - Feed.objects.create(title=title, - visible=True, - description=description, - content=content) + Feed.objects.create( + title=title, visible=True, description=description, content=content + ) tag1 = Tag.objects.get(id=1) Feed.objects.get(title=title).tags.add(tag1) tag2 = Tag.objects.get(id=1) diff --git a/webapp/management/commands/initialize.py b/webapp/management/commands/initialize.py index 3e63f20..9135a3e 100644 --- a/webapp/management/commands/initialize.py +++ b/webapp/management/commands/initialize.py @@ -4,42 +4,56 @@ from django.contrib.contenttypes.models import ContentType class Command(BaseCommand): - ''' + """ Creates initial skeleton for the webapp. This command MUST do nothing if already run. - ''' + """ def create_infoscreen_moderator(self): self.stdout.write("Creating infoscreen moderator group") - infoscreen_group, created = Group.objects.get_or_create(name="infoscreen moderators") + infoscreen_group, created = Group.objects.get_or_create( + name="infoscreen moderators" + ) if not created: - self.stdout.write('The group "infoscreen moderators" already existed ' - 'and was not therefore created') + self.stdout.write( + 'The group "infoscreen moderators" already existed ' + "and was not therefore created" + ) - cts = ContentType.objects.filter(app_label='infoscreen') + cts = ContentType.objects.filter(app_label="infoscreen") permissions = Permission.objects.filter(content_type__in=cts) infoscreen_group.permissions.add(*permissions) def create_member_register_viewer(self): self.stdout.write("Creating member register viewer group") - viewers_group, created = Group.objects.get_or_create(name="member register viewers") + viewers_group, created = Group.objects.get_or_create( + name="member register viewers" + ) if not created: - self.stdout.write('The group "member register viewers" already existed ' - 'and was not therefore created') + self.stdout.write( + 'The group "member register viewers" already existed ' + "and was not therefore created" + ) - cts = ContentType.objects.filter(app_label='members') - members_permissions = Permission.objects.filter(content_type__in=cts, codename__contains='read') + cts = ContentType.objects.filter(app_label="members") + members_permissions = Permission.objects.filter( + content_type__in=cts, codename__contains="read" + ) viewers_group.permissions.add(*members_permissions) def create_member_register_administrator(self): self.stdout.write("Creating member register administrator group") - admins_group, created = Group.objects.get_or_create(name="member register administrators") + admins_group, created = Group.objects.get_or_create( + name="member register administrators" + ) if not created: - self.stdout.write('The group "member register administrators" already existed ' - 'and was not therefore created') + self.stdout.write( + 'The group "member register administrators" already existed ' + "and was not therefore created" + ) - cts = ContentType.objects.filter(app_label='members') + cts = ContentType.objects.filter(app_label="members") permissions = Permission.objects.filter(content_type__in=cts) admins_group.permissions.add(*permissions) @@ -47,13 +61,20 @@ class Command(BaseCommand): self.stdout.write("Creating official group") officials_group, created = Group.objects.get_or_create(name="officials") if not created: - self.stdout.write('The group "officials" already existed ' - 'and was not therefore created') + self.stdout.write( + 'The group "officials" already existed ' "and was not therefore created" + ) - cts = ContentType.objects.filter(app_label='webapp') - feed_permissions = Permission.objects.filter(content_type__in=cts, codename__contains='feed') - event_permissions = Permission.objects.filter(content_type__in=cts, codename__contains='event') - registration_permissions = Permission.objects.filter(content_type__in=cts, codename__contains='registration') + cts = ContentType.objects.filter(app_label="webapp") + feed_permissions = Permission.objects.filter( + content_type__in=cts, codename__contains="feed" + ) + event_permissions = Permission.objects.filter( + content_type__in=cts, codename__contains="event" + ) + registration_permissions = Permission.objects.filter( + content_type__in=cts, codename__contains="registration" + ) officials_group.permissions.add(*feed_permissions) officials_group.permissions.add(*event_permissions) @@ -61,12 +82,16 @@ class Command(BaseCommand): def create_webapp_administrator(self): self.stdout.write("Creating webapp administrator group") - admins_group, created = Group.objects.get_or_create(name="webapp administrators") + admins_group, created = Group.objects.get_or_create( + name="webapp administrators" + ) if not created: - self.stdout.write('The group "webapp administrators" already existed ' - 'and was not therefore created') + self.stdout.write( + 'The group "webapp administrators" already existed ' + "and was not therefore created" + ) - cts = ContentType.objects.filter(app_label='webapp') + cts = ContentType.objects.filter(app_label="webapp") permissions = Permission.objects.filter(content_type__in=cts) admins_group.permissions.add(*permissions) diff --git a/webapp/migrations/0001_initial.py b/webapp/migrations/0001_initial.py index 53345cd..0018457 100644 --- a/webapp/migrations/0001_initial.py +++ b/webapp/migrations/0001_initial.py @@ -11,46 +11,94 @@ class Migration(migrations.Migration): initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='Info', + name="Info", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('publish_time', models.DateTimeField(default=django.utils.timezone.now)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "publish_time", + models.DateTimeField(default=django.utils.timezone.now), + ), ], ), migrations.CreateModel( - name='InfoTr', + name="InfoTr", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('lang', models.CharField(default='fi', max_length=2)), - ('topic', models.CharField(max_length=255)), - ('content', models.TextField()), - ('translation_for', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='webapp.Info')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("lang", models.CharField(default="fi", max_length=2)), + ("topic", models.CharField(max_length=255)), + ("content", models.TextField()), + ( + "translation_for", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="translations", + to="webapp.Info", + ), + ), ], ), migrations.CreateModel( - name='Tag', + name="Tag", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dummyname', models.CharField(max_length=127)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("dummyname", models.CharField(max_length=127)), ], ), migrations.CreateModel( - name='TagTr', + name="TagTr", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('lang', models.CharField(default='fi', max_length=2)), - ('name', models.CharField(max_length=127)), - ('translation_for', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='webapp.Tag')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("lang", models.CharField(default="fi", max_length=2)), + ("name", models.CharField(max_length=127)), + ( + "translation_for", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="translations", + to="webapp.Tag", + ), + ), ], ), migrations.AddField( - model_name='info', - name='tags', - field=models.ManyToManyField(related_name='news', to='webapp.Tag'), + model_name="info", + name="tags", + field=models.ManyToManyField(related_name="news", to="webapp.Tag"), ), ] diff --git a/webapp/migrations/0002_auto_20170601_1919.py b/webapp/migrations/0002_auto_20170601_1919.py index b34cbf9..04d7047 100644 --- a/webapp/migrations/0002_auto_20170601_1919.py +++ b/webapp/migrations/0002_auto_20170601_1919.py @@ -10,62 +10,76 @@ import webapp.utils class Migration(migrations.Migration): dependencies = [ - ('webapp', '0001_initial'), + ("webapp", "0001_initial"), ] operations = [ migrations.CreateModel( - name='Feed', + name="Feed", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('publish_time', models.DateTimeField(default=django.utils.timezone.now)), - ('autohide', models.BooleanField(default=False)), - ('autohide_time', models.DateTimeField(default=webapp.utils.month_from_now)), - ('topic', models.CharField(max_length=255)), - ('description', models.CharField(max_length=255)), - ('content', models.TextField()), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "publish_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("autohide", models.BooleanField(default=False)), + ( + "autohide_time", + models.DateTimeField(default=webapp.utils.month_from_now), + ), + ("topic", models.CharField(max_length=255)), + ("description", models.CharField(max_length=255)), + ("content", models.TextField()), ], ), migrations.RemoveField( - model_name='info', - name='tags', + model_name="info", + name="tags", ), migrations.RemoveField( - model_name='infotr', - name='translation_for', + model_name="infotr", + name="translation_for", ), migrations.RemoveField( - model_name='tagtr', - name='translation_for', + model_name="tagtr", + name="translation_for", ), migrations.RemoveField( - model_name='tag', - name='dummyname', + model_name="tag", + name="dummyname", ), migrations.AddField( - model_name='tag', - name='name', - field=models.CharField(default='', max_length=127), + model_name="tag", + name="name", + field=models.CharField(default="", max_length=127), preserve_default=False, ), migrations.AddField( - model_name='tag', - name='slug', - field=models.SlugField(default=''), + model_name="tag", + name="slug", + field=models.SlugField(default=""), preserve_default=False, ), migrations.DeleteModel( - name='Info', + name="Info", ), migrations.DeleteModel( - name='InfoTr', + name="InfoTr", ), migrations.DeleteModel( - name='TagTr', + name="TagTr", ), migrations.AddField( - model_name='feed', - name='tags', - field=models.ManyToManyField(related_name='news', to='webapp.Tag'), + model_name="feed", + name="tags", + field=models.ManyToManyField(related_name="news", to="webapp.Tag"), ), ] diff --git a/webapp/migrations/0002_baserole_customrole_official_presetrole_role.py b/webapp/migrations/0002_baserole_customrole_official_presetrole_role.py index 241045d..73bec86 100644 --- a/webapp/migrations/0002_baserole_customrole_official_presetrole_role.py +++ b/webapp/migrations/0002_baserole_customrole_official_presetrole_role.py @@ -11,59 +11,114 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('auth', '0008_alter_user_username_max_length'), - ('webapp', '0001_initial'), + ("auth", "0008_alter_user_username_max_length"), + ("webapp", "0001_initial"), ] operations = [ migrations.CreateModel( - name='BaseRole', + name="BaseRole", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.TextField(verbose_name='Name')), - ('is_board', models.BooleanField(verbose_name='Board member')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.TextField(verbose_name="Name")), + ("is_board", models.BooleanField(verbose_name="Board member")), ], ), migrations.CreateModel( - name='Official', + name="Official", fields=[ - ('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)), - ('phone_number', models.TextField(verbose_name='Phone number')), + ( + "user_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to=settings.AUTH_USER_MODEL, + ), + ), + ("phone_number", models.TextField(verbose_name="Phone number")), ], options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - 'abstract': False, + "verbose_name": "user", + "verbose_name_plural": "users", + "abstract": False, }, - bases=('auth.user',), + bases=("auth.user",), managers=[ - ('objects', django.contrib.auth.models.UserManager()), + ("objects", django.contrib.auth.models.UserManager()), ], ), migrations.CreateModel( - name='CustomRole', + name="CustomRole", fields=[ - ('baserole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseRole')), + ( + "baserole_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.BaseRole", + ), + ), ], - bases=('webapp.baserole',), + bases=("webapp.baserole",), ), migrations.CreateModel( - name='PresetRole', + name="PresetRole", fields=[ - ('baserole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseRole')), - ('description', models.TextField(verbose_name='Description')), - ('summary', models.TextField(verbose_name='Summary')), + ( + "baserole_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.BaseRole", + ), + ), + ("description", models.TextField(verbose_name="Description")), + ("summary", models.TextField(verbose_name="Summary")), ], - bases=('webapp.baserole',), + bases=("webapp.baserole",), ), migrations.CreateModel( - name='Role', + name="Role", fields=[ - ('presetrole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.PresetRole')), - ('start_date', models.DateField(verbose_name='Start date')), - ('end_date', models.DateField(verbose_name='End date')), - ('official', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='roles', to='webapp.Official')), + ( + "presetrole_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.PresetRole", + ), + ), + ("start_date", models.DateField(verbose_name="Start date")), + ("end_date", models.DateField(verbose_name="End date")), + ( + "official", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="roles", + to="webapp.Official", + ), + ), ], - bases=('webapp.presetrole',), + bases=("webapp.presetrole",), ), ] diff --git a/webapp/migrations/0003_auto_20170607_1643.py b/webapp/migrations/0003_auto_20170607_1643.py index 004423e..0511f7f 100644 --- a/webapp/migrations/0003_auto_20170607_1643.py +++ b/webapp/migrations/0003_auto_20170607_1643.py @@ -8,38 +8,38 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0002_auto_20170601_1919'), + ("webapp", "0002_auto_20170601_1919"), ] operations = [ migrations.AddField( - model_name='feed', - name='content_en', + model_name="feed", + name="content_en", field=models.TextField(null=True), ), migrations.AddField( - model_name='feed', - name='content_fi', + model_name="feed", + name="content_fi", field=models.TextField(null=True), ), migrations.AddField( - model_name='feed', - name='description_en', + model_name="feed", + name="description_en", field=models.CharField(max_length=255, null=True), ), migrations.AddField( - model_name='feed', - name='description_fi', + model_name="feed", + name="description_fi", field=models.CharField(max_length=255, null=True), ), migrations.AddField( - model_name='feed', - name='topic_en', + model_name="feed", + name="topic_en", field=models.CharField(max_length=255, null=True), ), migrations.AddField( - model_name='feed', - name='topic_fi', + model_name="feed", + name="topic_fi", field=models.CharField(max_length=255, null=True), ), ] diff --git a/webapp/migrations/0003_auto_20170607_1825.py b/webapp/migrations/0003_auto_20170607_1825.py index 0cc68bc..170bc83 100644 --- a/webapp/migrations/0003_auto_20170607_1825.py +++ b/webapp/migrations/0003_auto_20170607_1825.py @@ -8,12 +8,12 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0002_baserole_customrole_official_presetrole_role'), + ("webapp", "0002_baserole_customrole_official_presetrole_role"), ] operations = [ migrations.AlterModelOptions( - name='role', - options={'verbose_name': 'Official'}, + name="role", + options={"verbose_name": "Official"}, ), ] diff --git a/webapp/migrations/0004_auto_20170607_1712.py b/webapp/migrations/0004_auto_20170607_1712.py index 12688ce..1a7131d 100644 --- a/webapp/migrations/0004_auto_20170607_1712.py +++ b/webapp/migrations/0004_auto_20170607_1712.py @@ -8,13 +8,15 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0003_auto_20170607_1643'), + ("webapp", "0003_auto_20170607_1643"), ] operations = [ migrations.AlterField( - model_name='feed', - name='tags', - field=models.ManyToManyField(blank=True, related_name='news', to='webapp.Tag'), + model_name="feed", + name="tags", + field=models.ManyToManyField( + blank=True, related_name="news", to="webapp.Tag" + ), ), ] diff --git a/webapp/migrations/0004_auto_20170607_1826.py b/webapp/migrations/0004_auto_20170607_1826.py index 0380a34..89f6884 100644 --- a/webapp/migrations/0004_auto_20170607_1826.py +++ b/webapp/migrations/0004_auto_20170607_1826.py @@ -8,16 +8,16 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0003_auto_20170607_1825'), + ("webapp", "0003_auto_20170607_1825"), ] operations = [ migrations.AlterModelOptions( - name='official', - options={'verbose_name': 'Official'}, + name="official", + options={"verbose_name": "Official"}, ), migrations.AlterModelOptions( - name='role', - options={'verbose_name': 'Role'}, + name="role", + options={"verbose_name": "Role"}, ), ] diff --git a/webapp/migrations/0005_auto_20170607_1717.py b/webapp/migrations/0005_auto_20170607_1717.py index 1d77c2a..41414f8 100644 --- a/webapp/migrations/0005_auto_20170607_1717.py +++ b/webapp/migrations/0005_auto_20170607_1717.py @@ -8,18 +8,18 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0004_auto_20170607_1712'), + ("webapp", "0004_auto_20170607_1712"), ] operations = [ migrations.AddField( - model_name='tag', - name='name_en', + model_name="tag", + name="name_en", field=models.CharField(max_length=127, null=True), ), migrations.AddField( - model_name='tag', - name='name_fi', + model_name="tag", + name="name_fi", field=models.CharField(max_length=127, null=True), ), ] diff --git a/webapp/migrations/0006_delete_deprecated_models.py b/webapp/migrations/0006_delete_deprecated_models.py index 81d1d82..643bc04 100644 --- a/webapp/migrations/0006_delete_deprecated_models.py +++ b/webapp/migrations/0006_delete_deprecated_models.py @@ -10,14 +10,14 @@ import webapp.utils class Migration(migrations.Migration): dependencies = [ - ('webapp', '0005_auto_20170607_1717'), + ("webapp", "0005_auto_20170607_1717"), ] operations = [ migrations.DeleteModel( - name='Tag', + name="Tag", ), migrations.DeleteModel( - name='Feed', + name="Feed", ), ] diff --git a/webapp/migrations/0007_auto_20170607_1815.py b/webapp/migrations/0007_auto_20170607_1815.py index 71660fd..6039a95 100644 --- a/webapp/migrations/0007_auto_20170607_1815.py +++ b/webapp/migrations/0007_auto_20170607_1815.py @@ -13,49 +13,82 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('webapp', '0006_delete_deprecated_models'), + ("webapp", "0006_delete_deprecated_models"), ] operations = [ migrations.CreateModel( - name='BaseFeed', + name="BaseFeed", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('visible', models.BooleanField(default=True)), - ('title', models.CharField(max_length=255)), - ('description', models.CharField(max_length=255)), - ('content', models.TextField()), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("visible", models.BooleanField(default=True)), + ("title", models.CharField(max_length=255)), + ("description", models.CharField(max_length=255)), + ("content", models.TextField()), ], ), migrations.CreateModel( - name='Tag', + name="Tag", fields=[ - ('slug', models.SlugField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=127)), - ('icon', models.ImageField(upload_to='')), + ("slug", models.SlugField(primary_key=True, serialize=False)), + ("name", models.CharField(max_length=127)), + ("icon", models.ImageField(upload_to="")), ], ), migrations.CreateModel( - name='Event', + name="Event", fields=[ - ('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')), - ('start_time', models.DateTimeField(default=django.utils.timezone.now)), - ('end_time', models.DateTimeField(default=django.utils.timezone.now)), + ( + "basefeed_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.BaseFeed", + ), + ), + ("start_time", models.DateTimeField(default=django.utils.timezone.now)), + ("end_time", models.DateTimeField(default=django.utils.timezone.now)), ], - bases=('webapp.basefeed',), + bases=("webapp.basefeed",), ), migrations.CreateModel( - name='Feed', + name="Feed", fields=[ - ('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')), - ('publish_time', models.DateTimeField(default=django.utils.timezone.now)), - ('autohide', models.DateTimeField(default=webapp.utils.month_from_now)), + ( + "basefeed_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.BaseFeed", + ), + ), + ( + "publish_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("autohide", models.DateTimeField(default=webapp.utils.month_from_now)), ], - bases=('webapp.basefeed',), + bases=("webapp.basefeed",), ), migrations.AddField( - model_name='basefeed', - name='tags', - field=models.ManyToManyField(blank=True, related_name='feeds', to='webapp.Tag'), + model_name="basefeed", + name="tags", + field=models.ManyToManyField( + blank=True, related_name="feeds", to="webapp.Tag" + ), ), ] diff --git a/webapp/migrations/0008_auto_20170607_1828.py b/webapp/migrations/0008_auto_20170607_1828.py index 6940792..3f944d6 100644 --- a/webapp/migrations/0008_auto_20170607_1828.py +++ b/webapp/migrations/0008_auto_20170607_1828.py @@ -8,48 +8,48 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0007_auto_20170607_1815'), + ("webapp", "0007_auto_20170607_1815"), ] operations = [ migrations.AddField( - model_name='basefeed', - name='content_en', + model_name="basefeed", + name="content_en", field=models.TextField(null=True), ), migrations.AddField( - model_name='basefeed', - name='content_fi', + model_name="basefeed", + name="content_fi", field=models.TextField(null=True), ), migrations.AddField( - model_name='basefeed', - name='description_en', + model_name="basefeed", + name="description_en", field=models.CharField(max_length=255, null=True), ), migrations.AddField( - model_name='basefeed', - name='description_fi', + model_name="basefeed", + name="description_fi", field=models.CharField(max_length=255, null=True), ), migrations.AddField( - model_name='basefeed', - name='title_en', + model_name="basefeed", + name="title_en", field=models.CharField(max_length=255, null=True), ), migrations.AddField( - model_name='basefeed', - name='title_fi', + model_name="basefeed", + name="title_fi", field=models.CharField(max_length=255, null=True), ), migrations.AddField( - model_name='tag', - name='name_en', + model_name="tag", + name="name_en", field=models.CharField(max_length=127, null=True), ), migrations.AddField( - model_name='tag', - name='name_fi', + model_name="tag", + name="name_fi", field=models.CharField(max_length=127, null=True), ), ] diff --git a/webapp/migrations/0009_merge_20170607_1854.py b/webapp/migrations/0009_merge_20170607_1854.py index ef12832..6ce053c 100644 --- a/webapp/migrations/0009_merge_20170607_1854.py +++ b/webapp/migrations/0009_merge_20170607_1854.py @@ -8,9 +8,8 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0008_auto_20170607_1828'), - ('webapp', '0004_auto_20170607_1826'), + ("webapp", "0008_auto_20170607_1828"), + ("webapp", "0004_auto_20170607_1826"), ] - operations = [ - ] + operations = [] diff --git a/webapp/migrations/0010_auto_20170608_0924.py b/webapp/migrations/0010_auto_20170608_0924.py index 14877f7..f91b784 100644 --- a/webapp/migrations/0010_auto_20170608_0924.py +++ b/webapp/migrations/0010_auto_20170608_0924.py @@ -9,62 +9,125 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('webapp', '0009_merge_20170607_1854'), + ("webapp", "0009_merge_20170607_1854"), ] operations = [ migrations.CreateModel( - name='CustomKaehmyRole', + name="CustomKaehmyRole", fields=[ - ('baserole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseRole')), + ( + "baserole_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.BaseRole", + ), + ), ], - bases=('webapp.baserole',), + bases=("webapp.baserole",), ), migrations.CreateModel( - name='MessageParent', + name="MessageParent", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), ], ), migrations.CreateModel( - name='PresetKaehmyRole', + name="PresetKaehmyRole", fields=[ - ('presetrole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.PresetRole')), + ( + "presetrole_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.PresetRole", + ), + ), ], - bases=('webapp.presetrole',), + bases=("webapp.presetrole",), ), migrations.CreateModel( - name='KaehmyForm', + name="KaehmyForm", fields=[ - ('messageparent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.MessageParent')), - ('name', models.TextField(verbose_name='Name')), - ('email', models.EmailField(max_length=254, verbose_name='Email')), - ('year', models.IntegerField(verbose_name='Year')), + ( + "messageparent_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.MessageParent", + ), + ), + ("name", models.TextField(verbose_name="Name")), + ("email", models.EmailField(max_length=254, verbose_name="Email")), + ("year", models.IntegerField(verbose_name="Year")), ], - bases=('webapp.messageparent',), + bases=("webapp.messageparent",), ), migrations.CreateModel( - name='KaehmyMessage', + name="KaehmyMessage", fields=[ - ('messageparent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.MessageParent')), - ('name', models.TextField(verbose_name='Name')), - ('email', models.EmailField(max_length=254, verbose_name='Email')), - ('message', models.TextField(verbose_name='Message')), - ('parent', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='webapp.MessageParent')), + ( + "messageparent_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.MessageParent", + ), + ), + ("name", models.TextField(verbose_name="Name")), + ("email", models.EmailField(max_length=254, verbose_name="Email")), + ("message", models.TextField(verbose_name="Message")), + ( + "parent", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="messages", + to="webapp.MessageParent", + ), + ), ], - bases=('webapp.messageparent',), + bases=("webapp.messageparent",), ), migrations.DeleteModel( - name='CustomRole', + name="CustomRole", ), migrations.AddField( - model_name='presetkaehmyrole', - name='form', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='preset_roles', to='webapp.KaehmyForm'), + model_name="presetkaehmyrole", + name="form", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="preset_roles", + to="webapp.KaehmyForm", + ), ), migrations.AddField( - model_name='customkaehmyrole', - name='form', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='custom_roles', to='webapp.KaehmyForm'), + model_name="customkaehmyrole", + name="form", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="custom_roles", + to="webapp.KaehmyForm", + ), ), ] diff --git a/webapp/migrations/0011_auto_20170913_1841.py b/webapp/migrations/0011_auto_20170913_1841.py index 74d06f5..5d23b0a 100644 --- a/webapp/migrations/0011_auto_20170913_1841.py +++ b/webapp/migrations/0011_auto_20170913_1841.py @@ -9,28 +9,30 @@ import phonenumber_field.modelfields class Migration(migrations.Migration): dependencies = [ - ('webapp', '0010_auto_20170608_0924'), + ("webapp", "0010_auto_20170608_0924"), ] operations = [ migrations.AlterField( - model_name='baserole', - name='name', - field=models.CharField(max_length=256, verbose_name='Name'), + model_name="baserole", + name="name", + field=models.CharField(max_length=256, verbose_name="Name"), ), migrations.AlterField( - model_name='kaehmyform', - name='name', - field=models.CharField(max_length=256, verbose_name='Name'), + model_name="kaehmyform", + name="name", + field=models.CharField(max_length=256, verbose_name="Name"), ), migrations.AlterField( - model_name='kaehmymessage', - name='name', - field=models.CharField(max_length=256, verbose_name='Name'), + model_name="kaehmymessage", + name="name", + field=models.CharField(max_length=256, verbose_name="Name"), ), migrations.AlterField( - model_name='official', - name='phone_number', - field=phonenumber_field.modelfields.PhoneNumberField(max_length=128, verbose_name='Phone number'), + model_name="official", + name="phone_number", + field=phonenumber_field.modelfields.PhoneNumberField( + max_length=128, verbose_name="Phone number" + ), ), ] diff --git a/webapp/migrations/0012_auto_20170913_1934.py b/webapp/migrations/0012_auto_20170913_1934.py index 4604c90..287d9ad 100644 --- a/webapp/migrations/0012_auto_20170913_1934.py +++ b/webapp/migrations/0012_auto_20170913_1934.py @@ -10,49 +10,79 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('webapp', '0011_auto_20170913_1841'), + ("webapp", "0011_auto_20170913_1841"), ] operations = [ migrations.CreateModel( - name='OhlhafvChallenge', + name="OhlhafvChallenge", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('challenger', models.CharField(max_length=255)), - ('victim', models.CharField(max_length=255)), - ('challenger_email', models.EmailField(max_length=254)), - ('victim_email', models.EmailField(max_length=254)), - ('series', models.CharField(choices=[('0.33 L', '0.33 L'), ('0.5 L', '0.5 L'), ('1.0 L', '1.0 L')], max_length=10)), - ('message', models.TextField()), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("challenger", models.CharField(max_length=255)), + ("victim", models.CharField(max_length=255)), + ("challenger_email", models.EmailField(max_length=254)), + ("victim_email", models.EmailField(max_length=254)), + ( + "series", + models.CharField( + choices=[ + ("0.33 L", "0.33 L"), + ("0.5 L", "0.5 L"), + ("1.0 L", "1.0 L"), + ], + max_length=10, + ), + ), + ("message", models.TextField()), ], ), migrations.CreateModel( - name='Registration', + name="Registration", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('email', models.EmailField(max_length=254)), - ('options', django.contrib.postgres.fields.jsonb.JSONField()), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=255)), + ("email", models.EmailField(max_length=254)), + ("options", django.contrib.postgres.fields.jsonb.JSONField()), ], ), migrations.AlterField( - model_name='baserole', - name='name', - field=models.CharField(max_length=255, verbose_name='Name'), + model_name="baserole", + name="name", + field=models.CharField(max_length=255, verbose_name="Name"), ), migrations.AlterField( - model_name='kaehmyform', - name='name', - field=models.CharField(max_length=255, verbose_name='Name'), + model_name="kaehmyform", + name="name", + field=models.CharField(max_length=255, verbose_name="Name"), ), migrations.AlterField( - model_name='kaehmymessage', - name='name', - field=models.CharField(max_length=255, verbose_name='Name'), + model_name="kaehmymessage", + name="name", + field=models.CharField(max_length=255, verbose_name="Name"), ), migrations.AddField( - model_name='event', - name='registration', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='webapp.Registration'), + model_name="event", + name="registration", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="webapp.Registration", + ), ), ] diff --git a/webapp/migrations/0013_auto_20170920_1800.py b/webapp/migrations/0013_auto_20170920_1800.py index d367aab..49fe605 100644 --- a/webapp/migrations/0013_auto_20170920_1800.py +++ b/webapp/migrations/0013_auto_20170920_1800.py @@ -8,38 +8,38 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0012_auto_20170913_1934'), + ("webapp", "0012_auto_20170913_1934"), ] operations = [ migrations.AlterField( - model_name='baserole', - name='name', - field=models.CharField(max_length=256, verbose_name='Name'), + model_name="baserole", + name="name", + field=models.CharField(max_length=256, verbose_name="Name"), ), migrations.AlterField( - model_name='kaehmyform', - name='name', - field=models.CharField(max_length=256, verbose_name='Name'), + model_name="kaehmyform", + name="name", + field=models.CharField(max_length=256, verbose_name="Name"), ), migrations.AlterField( - model_name='kaehmymessage', - name='name', - field=models.CharField(max_length=256, verbose_name='Name'), + model_name="kaehmymessage", + name="name", + field=models.CharField(max_length=256, verbose_name="Name"), ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='challenger', + model_name="ohlhafvchallenge", + name="challenger", field=models.CharField(max_length=256), ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='victim', + model_name="ohlhafvchallenge", + name="victim", field=models.CharField(max_length=256), ), migrations.AlterField( - model_name='registration', - name='name', + model_name="registration", + name="name", field=models.CharField(max_length=256), ), ] diff --git a/webapp/migrations/0014_auto_20170920_1807.py b/webapp/migrations/0014_auto_20170920_1807.py index 633abb4..c10a2dc 100644 --- a/webapp/migrations/0014_auto_20170920_1807.py +++ b/webapp/migrations/0014_auto_20170920_1807.py @@ -8,38 +8,38 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0013_auto_20170920_1800'), + ("webapp", "0013_auto_20170920_1800"), ] operations = [ migrations.AlterField( - model_name='baserole', - name='name', - field=models.CharField(max_length=255, verbose_name='Name'), + model_name="baserole", + name="name", + field=models.CharField(max_length=255, verbose_name="Name"), ), migrations.AlterField( - model_name='kaehmyform', - name='name', - field=models.CharField(max_length=255, verbose_name='Name'), + model_name="kaehmyform", + name="name", + field=models.CharField(max_length=255, verbose_name="Name"), ), migrations.AlterField( - model_name='kaehmymessage', - name='name', - field=models.CharField(max_length=255, verbose_name='Name'), + model_name="kaehmymessage", + name="name", + field=models.CharField(max_length=255, verbose_name="Name"), ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='challenger', + model_name="ohlhafvchallenge", + name="challenger", field=models.CharField(max_length=255), ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='victim', + model_name="ohlhafvchallenge", + name="victim", field=models.CharField(max_length=255), ), migrations.AlterField( - model_name='registration', - name='name', + model_name="registration", + name="name", field=models.CharField(max_length=255), ), ] diff --git a/webapp/migrations/0015_auto_20170928_2331.py b/webapp/migrations/0015_auto_20170928_2331.py index baaa4bb..1fe2daf 100644 --- a/webapp/migrations/0015_auto_20170928_2331.py +++ b/webapp/migrations/0015_auto_20170928_2331.py @@ -8,34 +8,37 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0014_auto_20170920_1807'), + ("webapp", "0014_auto_20170920_1807"), ] operations = [ migrations.AlterModelOptions( - name='event', - options={'verbose_name': 'Event', 'verbose_name_plural': 'Events'}, + name="event", + options={"verbose_name": "Event", "verbose_name_plural": "Events"}, ), migrations.AlterModelOptions( - name='feed', - options={'verbose_name': 'Feed', 'verbose_name_plural': 'Feeds'}, + name="feed", + options={"verbose_name": "Feed", "verbose_name_plural": "Feeds"}, ), migrations.AlterModelOptions( - name='registration', - options={'verbose_name': 'Registration', 'verbose_name_plural': 'Registrations'}, + name="registration", + options={ + "verbose_name": "Registration", + "verbose_name_plural": "Registrations", + }, ), migrations.AlterModelOptions( - name='tag', - options={'verbose_name': 'Tag', 'verbose_name_plural': 'Tags'}, + name="tag", + options={"verbose_name": "Tag", "verbose_name_plural": "Tags"}, ), migrations.AddField( - model_name='registration', - name='name_en', + model_name="registration", + name="name_en", field=models.CharField(max_length=255, null=True), ), migrations.AddField( - model_name='registration', - name='name_fi', + model_name="registration", + name="name_fi", field=models.CharField(max_length=255, null=True), ), ] diff --git a/webapp/migrations/0016_auto_20171011_1828.py b/webapp/migrations/0016_auto_20171011_1828.py index 00c14c7..8566b35 100644 --- a/webapp/migrations/0016_auto_20171011_1828.py +++ b/webapp/migrations/0016_auto_20171011_1828.py @@ -8,32 +8,44 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0015_auto_20170928_2331'), + ("webapp", "0015_auto_20170928_2331"), ] operations = [ migrations.CreateModel( - name='KaehmyFormSelectedRole', + name="KaehmyFormSelectedRole", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), ], ), migrations.RemoveField( - model_name='customkaehmyrole', - name='form', + model_name="customkaehmyrole", + name="form", ), migrations.RemoveField( - model_name='presetkaehmyrole', - name='form', + model_name="presetkaehmyrole", + name="form", ), migrations.AddField( - model_name='kaehmyform', - name='custom_roles', - field=models.ManyToManyField(blank=True, related_name='forms', to='webapp.CustomKaehmyRole'), + model_name="kaehmyform", + name="custom_roles", + field=models.ManyToManyField( + blank=True, related_name="forms", to="webapp.CustomKaehmyRole" + ), ), migrations.AddField( - model_name='kaehmyform', - name='preset_roles', - field=models.ManyToManyField(blank=True, related_name='forms', to='webapp.PresetKaehmyRole'), + model_name="kaehmyform", + name="preset_roles", + field=models.ManyToManyField( + blank=True, related_name="forms", to="webapp.PresetKaehmyRole" + ), ), ] diff --git a/webapp/migrations/0017_kaehmyform_text.py b/webapp/migrations/0017_kaehmyform_text.py index bcc7834..7e3ad2c 100644 --- a/webapp/migrations/0017_kaehmyform_text.py +++ b/webapp/migrations/0017_kaehmyform_text.py @@ -8,13 +8,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0016_auto_20171011_1828'), + ("webapp", "0016_auto_20171011_1828"), ] operations = [ migrations.AddField( - model_name='kaehmyform', - name='text', - field=models.TextField(default='', max_length=300, verbose_name='Text'), + model_name="kaehmyform", + name="text", + field=models.TextField(default="", max_length=300, verbose_name="Text"), ), ] diff --git a/webapp/migrations/0018_auto_20171011_1856.py b/webapp/migrations/0018_auto_20171011_1856.py index 4bcbfad..b165c98 100644 --- a/webapp/migrations/0018_auto_20171011_1856.py +++ b/webapp/migrations/0018_auto_20171011_1856.py @@ -8,13 +8,16 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0017_kaehmyform_text'), + ("webapp", "0017_kaehmyform_text"), ] operations = [ migrations.AlterField( - model_name='kaehmyform', - name='year', - field=models.IntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, 'N')], verbose_name='Year'), + model_name="kaehmyform", + name="year", + field=models.IntegerField( + choices=[(1, "1"), (2, "2"), (3, "3"), (4, "4"), (5, "N")], + verbose_name="Year", + ), ), ] diff --git a/webapp/migrations/0019_kaehmymessage_timestamp.py b/webapp/migrations/0019_kaehmymessage_timestamp.py index 9764f72..a28b057 100644 --- a/webapp/migrations/0019_kaehmymessage_timestamp.py +++ b/webapp/migrations/0019_kaehmymessage_timestamp.py @@ -9,13 +9,15 @@ import django.utils.timezone class Migration(migrations.Migration): dependencies = [ - ('webapp', '0018_auto_20171011_1856'), + ("webapp", "0018_auto_20171011_1856"), ] operations = [ migrations.AddField( - model_name='kaehmymessage', - name='timestamp', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Timestamp'), + model_name="kaehmymessage", + name="timestamp", + field=models.DateTimeField( + default=django.utils.timezone.now, verbose_name="Timestamp" + ), ), ] diff --git a/webapp/migrations/0020_auto_20171011_2020.py b/webapp/migrations/0020_auto_20171011_2020.py index 2aabb06..d2682db 100644 --- a/webapp/migrations/0020_auto_20171011_2020.py +++ b/webapp/migrations/0020_auto_20171011_2020.py @@ -8,18 +8,20 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0019_kaehmymessage_timestamp'), + ("webapp", "0019_kaehmymessage_timestamp"), ] operations = [ migrations.AddField( - model_name='kaehmyform', - name='custom_role_is_board', - field=models.BooleanField(default=False, verbose_name='Board member'), + model_name="kaehmyform", + name="custom_role_is_board", + field=models.BooleanField(default=False, verbose_name="Board member"), ), migrations.AddField( - model_name='kaehmyform', - name='custom_role_name', - field=models.CharField(default='', max_length=255, verbose_name='Custom role name'), + model_name="kaehmyform", + name="custom_role_name", + field=models.CharField( + default="", max_length=255, verbose_name="Custom role name" + ), ), ] diff --git a/webapp/migrations/0020_kaehmyform_phone_number.py b/webapp/migrations/0020_kaehmyform_phone_number.py index 00d930d..9f7a43d 100644 --- a/webapp/migrations/0020_kaehmyform_phone_number.py +++ b/webapp/migrations/0020_kaehmyform_phone_number.py @@ -9,14 +9,16 @@ import phonenumber_field.modelfields class Migration(migrations.Migration): dependencies = [ - ('webapp', '0019_kaehmymessage_timestamp'), + ("webapp", "0019_kaehmymessage_timestamp"), ] operations = [ migrations.AddField( - model_name='kaehmyform', - name='phone_number', - field=phonenumber_field.modelfields.PhoneNumberField(default='', max_length=128, verbose_name='Phone number'), + model_name="kaehmyform", + name="phone_number", + field=phonenumber_field.modelfields.PhoneNumberField( + default="", max_length=128, verbose_name="Phone number" + ), preserve_default=False, ), ] diff --git a/webapp/migrations/0021_merge_20171011_2033.py b/webapp/migrations/0021_merge_20171011_2033.py index ed9429f..f73421c 100644 --- a/webapp/migrations/0021_merge_20171011_2033.py +++ b/webapp/migrations/0021_merge_20171011_2033.py @@ -8,9 +8,8 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0020_kaehmyform_phone_number'), - ('webapp', '0020_auto_20171011_2020'), + ("webapp", "0020_kaehmyform_phone_number"), + ("webapp", "0020_auto_20171011_2020"), ] - operations = [ - ] + operations = [] diff --git a/webapp/migrations/0022_auto_20171011_2050.py b/webapp/migrations/0022_auto_20171011_2050.py index 6daeeb6..4f21325 100644 --- a/webapp/migrations/0022_auto_20171011_2050.py +++ b/webapp/migrations/0022_auto_20171011_2050.py @@ -8,18 +8,20 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0021_merge_20171011_2033'), + ("webapp", "0021_merge_20171011_2033"), ] operations = [ migrations.AlterField( - model_name='kaehmyform', - name='custom_role_is_board', - field=models.BooleanField(verbose_name='Board member'), + model_name="kaehmyform", + name="custom_role_is_board", + field=models.BooleanField(verbose_name="Board member"), ), migrations.AlterField( - model_name='kaehmyform', - name='custom_role_name', - field=models.CharField(blank=True, max_length=255, verbose_name='Custom role name'), + model_name="kaehmyform", + name="custom_role_name", + field=models.CharField( + blank=True, max_length=255, verbose_name="Custom role name" + ), ), ] diff --git a/webapp/migrations/0023_remove_kaehmyform_phone_number.py b/webapp/migrations/0023_remove_kaehmyform_phone_number.py index fc7a28d..4c18e50 100644 --- a/webapp/migrations/0023_remove_kaehmyform_phone_number.py +++ b/webapp/migrations/0023_remove_kaehmyform_phone_number.py @@ -8,12 +8,12 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0022_auto_20171011_2050'), + ("webapp", "0022_auto_20171011_2050"), ] operations = [ migrations.RemoveField( - model_name='kaehmyform', - name='phone_number', + model_name="kaehmyform", + name="phone_number", ), ] diff --git a/webapp/migrations/0024_kaehmyform_phone_number.py b/webapp/migrations/0024_kaehmyform_phone_number.py index 7539bc8..8acff2b 100644 --- a/webapp/migrations/0024_kaehmyform_phone_number.py +++ b/webapp/migrations/0024_kaehmyform_phone_number.py @@ -8,13 +8,15 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0023_remove_kaehmyform_phone_number'), + ("webapp", "0023_remove_kaehmyform_phone_number"), ] operations = [ migrations.AddField( - model_name='kaehmyform', - name='phone_number', - field=models.CharField(default='', max_length=10, verbose_name='Phone number'), + model_name="kaehmyform", + name="phone_number", + field=models.CharField( + default="", max_length=10, verbose_name="Phone number" + ), ), ] diff --git a/webapp/migrations/0025_auto_20171011_2235.py b/webapp/migrations/0025_auto_20171011_2235.py index 17ccd0f..c180890 100644 --- a/webapp/migrations/0025_auto_20171011_2235.py +++ b/webapp/migrations/0025_auto_20171011_2235.py @@ -8,34 +8,38 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0024_kaehmyform_phone_number'), + ("webapp", "0024_kaehmyform_phone_number"), ] operations = [ migrations.RemoveField( - model_name='kaehmyform', - name='email', + model_name="kaehmyform", + name="email", ), migrations.RemoveField( - model_name='kaehmyform', - name='name', + model_name="kaehmyform", + name="name", ), migrations.RemoveField( - model_name='kaehmymessage', - name='email', + model_name="kaehmymessage", + name="email", ), migrations.RemoveField( - model_name='kaehmymessage', - name='name', + model_name="kaehmymessage", + name="name", ), migrations.AddField( - model_name='messageparent', - name='email', - field=models.EmailField(default='not@valid.email', max_length=254, verbose_name='Email'), + model_name="messageparent", + name="email", + field=models.EmailField( + default="not@valid.email", max_length=254, verbose_name="Email" + ), ), migrations.AddField( - model_name='messageparent', - name='name', - field=models.CharField(default='Anonymous', max_length=255, verbose_name='Name'), + model_name="messageparent", + name="name", + field=models.CharField( + default="Anonymous", max_length=255, verbose_name="Name" + ), ), ] diff --git a/webapp/migrations/0026_auto_20171011_2236.py b/webapp/migrations/0026_auto_20171011_2236.py index 98ee56b..562f75c 100644 --- a/webapp/migrations/0026_auto_20171011_2236.py +++ b/webapp/migrations/0026_auto_20171011_2236.py @@ -8,18 +8,18 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0025_auto_20171011_2235'), + ("webapp", "0025_auto_20171011_2235"), ] operations = [ migrations.AlterField( - model_name='messageparent', - name='email', - field=models.EmailField(default='', max_length=254, verbose_name='Email'), + model_name="messageparent", + name="email", + field=models.EmailField(default="", max_length=254, verbose_name="Email"), ), migrations.AlterField( - model_name='messageparent', - name='name', - field=models.CharField(default='', max_length=255, verbose_name='Name'), + model_name="messageparent", + name="name", + field=models.CharField(default="", max_length=255, verbose_name="Name"), ), ] diff --git a/webapp/migrations/0027_auto_20171012_0037.py b/webapp/migrations/0027_auto_20171012_0037.py index 00de956..a9d9681 100644 --- a/webapp/migrations/0027_auto_20171012_0037.py +++ b/webapp/migrations/0027_auto_20171012_0037.py @@ -8,19 +8,25 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0026_auto_20171011_2236'), + ("webapp", "0026_auto_20171011_2236"), ] operations = [ migrations.DeleteModel( - name='KaehmyFormSelectedRole', + name="KaehmyFormSelectedRole", ), migrations.AlterModelOptions( - name='customkaehmyrole', - options={'verbose_name': 'Custom kaehmy role', 'verbose_name_plural': 'Custom kaehmy roles'}, + name="customkaehmyrole", + options={ + "verbose_name": "Custom kaehmy role", + "verbose_name_plural": "Custom kaehmy roles", + }, ), migrations.AlterModelOptions( - name='presetkaehmyrole', - options={'verbose_name': 'Preset kaehmy role', 'verbose_name_plural': 'Preset kaehmy roles'}, + name="presetkaehmyrole", + options={ + "verbose_name": "Preset kaehmy role", + "verbose_name_plural": "Preset kaehmy roles", + }, ), ] diff --git a/webapp/migrations/0028_telegramchannel.py b/webapp/migrations/0028_telegramchannel.py index 7dabb1d..32bedf6 100644 --- a/webapp/migrations/0028_telegramchannel.py +++ b/webapp/migrations/0028_telegramchannel.py @@ -8,15 +8,23 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0027_auto_20171012_0037'), + ("webapp", "0027_auto_20171012_0037"), ] operations = [ migrations.CreateModel( - name='TelegramChannel', + name="TelegramChannel", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('channel_id', models.CharField(max_length=255)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("channel_id", models.CharField(max_length=255)), ], ), ] diff --git a/webapp/migrations/0029_baserole_category.py b/webapp/migrations/0029_baserole_category.py index 39ad05f..950299a 100644 --- a/webapp/migrations/0029_baserole_category.py +++ b/webapp/migrations/0029_baserole_category.py @@ -8,13 +8,33 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0028_telegramchannel'), + ("webapp", "0028_telegramchannel"), ] operations = [ migrations.AddField( - model_name='baserole', - name='category', - field=models.CharField(choices=[('corporate', 'Corporate affairs'), ('freshman', 'Freshmen'), ('international', 'International'), ('external', 'External affairs'), ('media', 'Media'), ('tech', 'Technology'), ('wellbeing', 'Wellbeing'), ('elepaja', 'Elepaja'), ('ceremonies', 'Ceremonies'), ('culture', 'Culture'), ('studies', 'Studies'), ('sosso', 'Sössö magazine'), ('alumni', 'Alumni relations'), ('others', 'Others')], default='others', max_length=255, verbose_name='Category'), + model_name="baserole", + name="category", + field=models.CharField( + choices=[ + ("corporate", "Corporate affairs"), + ("freshman", "Freshmen"), + ("international", "International"), + ("external", "External affairs"), + ("media", "Media"), + ("tech", "Technology"), + ("wellbeing", "Wellbeing"), + ("elepaja", "Elepaja"), + ("ceremonies", "Ceremonies"), + ("culture", "Culture"), + ("studies", "Studies"), + ("sosso", "Sössö magazine"), + ("alumni", "Alumni relations"), + ("others", "Others"), + ], + default="others", + max_length=255, + verbose_name="Category", + ), ), ] diff --git a/webapp/migrations/0030_telegrammessage.py b/webapp/migrations/0030_telegrammessage.py index 03615b0..fb8bcfb 100644 --- a/webapp/migrations/0030_telegrammessage.py +++ b/webapp/migrations/0030_telegrammessage.py @@ -8,17 +8,25 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0029_baserole_category'), + ("webapp", "0029_baserole_category"), ] operations = [ migrations.CreateModel( - name='TelegramMessage', + name="TelegramMessage", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('message_id', models.CharField(max_length=255, unique=True)), - ('channel_id', models.CharField(max_length=255)), - ('text', models.CharField(max_length=255)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("message_id", models.CharField(max_length=255, unique=True)), + ("channel_id", models.CharField(max_length=255)), + ("text", models.CharField(max_length=255)), ], ), ] diff --git a/webapp/migrations/0031_auto_20171016_1455.py b/webapp/migrations/0031_auto_20171016_1455.py index a35466e..ab517b3 100644 --- a/webapp/migrations/0031_auto_20171016_1455.py +++ b/webapp/migrations/0031_auto_20171016_1455.py @@ -8,13 +8,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0030_telegrammessage'), + ("webapp", "0030_telegrammessage"), ] operations = [ migrations.AlterField( - model_name='telegramchannel', - name='channel_id', + model_name="telegramchannel", + name="channel_id", field=models.CharField(max_length=255, unique=True), ), ] diff --git a/webapp/migrations/0032_delete_telegrammessage.py b/webapp/migrations/0032_delete_telegrammessage.py index 434af97..1e55956 100644 --- a/webapp/migrations/0032_delete_telegrammessage.py +++ b/webapp/migrations/0032_delete_telegrammessage.py @@ -8,11 +8,11 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0031_auto_20171016_1455'), + ("webapp", "0031_auto_20171016_1455"), ] operations = [ migrations.DeleteModel( - name='TelegramMessage', + name="TelegramMessage", ), ] diff --git a/webapp/migrations/0033_telegramchannel_name.py b/webapp/migrations/0033_telegramchannel_name.py index 5a86550..17bfed9 100644 --- a/webapp/migrations/0033_telegramchannel_name.py +++ b/webapp/migrations/0033_telegramchannel_name.py @@ -8,14 +8,14 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0032_delete_telegrammessage'), + ("webapp", "0032_delete_telegrammessage"), ] operations = [ migrations.AddField( - model_name='telegramchannel', - name='name', - field=models.CharField(default='Jan Tuomi private', max_length=255), + model_name="telegramchannel", + name="name", + field=models.CharField(default="Jan Tuomi private", max_length=255), preserve_default=False, ), ] diff --git a/webapp/migrations/0034_auto_20171018_1017.py b/webapp/migrations/0034_auto_20171018_1017.py index c765c87..f8a0485 100644 --- a/webapp/migrations/0034_auto_20171018_1017.py +++ b/webapp/migrations/0034_auto_20171018_1017.py @@ -9,29 +9,40 @@ import django.utils.timezone class Migration(migrations.Migration): dependencies = [ - ('webapp', '0033_telegramchannel_name'), + ("webapp", "0033_telegramchannel_name"), ] operations = [ migrations.AlterModelOptions( - name='kaehmyform', - options={'verbose_name': 'Kaehmylomake', 'verbose_name_plural': 'Kaehmylomakkeet'}, + name="kaehmyform", + options={ + "verbose_name": "Kaehmylomake", + "verbose_name_plural": "Kaehmylomakkeet", + }, ), migrations.AlterModelOptions( - name='kaehmymessage', - options={'verbose_name': 'Kaehmykommentti', 'verbose_name_plural': 'Kaehmykommentit'}, + name="kaehmymessage", + options={ + "verbose_name": "Kaehmykommentti", + "verbose_name_plural": "Kaehmykommentit", + }, ), migrations.AlterModelOptions( - name='telegramchannel', - options={'verbose_name': 'Telegram channel', 'verbose_name_plural': 'Telegram channels'}, + name="telegramchannel", + options={ + "verbose_name": "Telegram channel", + "verbose_name_plural": "Telegram channels", + }, ), migrations.RemoveField( - model_name='kaehmymessage', - name='timestamp', + model_name="kaehmymessage", + name="timestamp", ), migrations.AddField( - model_name='messageparent', - name='timestamp', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Timestamp'), + model_name="messageparent", + name="timestamp", + field=models.DateTimeField( + default=django.utils.timezone.now, verbose_name="Timestamp" + ), ), ] diff --git a/webapp/migrations/0035_auto_20171019_1413.py b/webapp/migrations/0035_auto_20171019_1413.py index 831e3d7..3ed8fb2 100644 --- a/webapp/migrations/0035_auto_20171019_1413.py +++ b/webapp/migrations/0035_auto_20171019_1413.py @@ -8,40 +8,40 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0034_auto_20171018_1017'), + ("webapp", "0034_auto_20171018_1017"), ] operations = [ migrations.AlterModelOptions( - name='official', - options={'verbose_name': 'Official', 'verbose_name_plural': 'Officials'}, + name="official", + options={"verbose_name": "Official", "verbose_name_plural": "Officials"}, ), migrations.AlterModelOptions( - name='role', - options={'verbose_name': 'Role', 'verbose_name_plural': 'Roles'}, + name="role", + options={"verbose_name": "Role", "verbose_name_plural": "Roles"}, ), migrations.RemoveField( - model_name='presetrole', - name='summary', + model_name="presetrole", + name="summary", ), migrations.AddField( - model_name='baserole', - name='name_en', - field=models.CharField(max_length=255, null=True, verbose_name='Name'), + model_name="baserole", + name="name_en", + field=models.CharField(max_length=255, null=True, verbose_name="Name"), ), migrations.AddField( - model_name='baserole', - name='name_fi', - field=models.CharField(max_length=255, null=True, verbose_name='Name'), + model_name="baserole", + name="name_fi", + field=models.CharField(max_length=255, null=True, verbose_name="Name"), ), migrations.AddField( - model_name='presetrole', - name='description_en', - field=models.TextField(null=True, verbose_name='Description'), + model_name="presetrole", + name="description_en", + field=models.TextField(null=True, verbose_name="Description"), ), migrations.AddField( - model_name='presetrole', - name='description_fi', - field=models.TextField(null=True, verbose_name='Description'), + model_name="presetrole", + name="description_fi", + field=models.TextField(null=True, verbose_name="Description"), ), ] diff --git a/webapp/migrations/0036_auto_20180124_1712.py b/webapp/migrations/0036_auto_20180124_1712.py index 0647108..bffa2d2 100644 --- a/webapp/migrations/0036_auto_20180124_1712.py +++ b/webapp/migrations/0036_auto_20180124_1712.py @@ -8,42 +8,54 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0035_auto_20171019_1413'), + ("webapp", "0035_auto_20171019_1413"), ] operations = [ migrations.AlterModelOptions( - name='ohlhafvchallenge', - options={'verbose_name': 'Ohlhafv challenge', 'verbose_name_plural': 'Ohlhafv challenges'}, + name="ohlhafvchallenge", + options={ + "verbose_name": "Ohlhafv challenge", + "verbose_name_plural": "Ohlhafv challenges", + }, ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='challenger', - field=models.CharField(max_length=255, verbose_name='Challenger'), + model_name="ohlhafvchallenge", + name="challenger", + field=models.CharField(max_length=255, verbose_name="Challenger"), ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='challenger_email', - field=models.EmailField(max_length=254, verbose_name='Challenger email'), + model_name="ohlhafvchallenge", + name="challenger_email", + field=models.EmailField(max_length=254, verbose_name="Challenger email"), ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='message', - field=models.TextField(verbose_name='Message'), + model_name="ohlhafvchallenge", + name="message", + field=models.TextField(verbose_name="Message"), ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='series', - field=models.CharField(choices=[('0.33 L', '0.33 L'), ('0.5 L', '0.5 L'), ('1.0 L', '1.0 L'), ('Team', 'Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0L)')], max_length=10, verbose_name='Series'), + model_name="ohlhafvchallenge", + name="series", + field=models.CharField( + choices=[ + ("0.33 L", "0.33 L"), + ("0.5 L", "0.5 L"), + ("1.0 L", "1.0 L"), + ("Team", "Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0L)"), + ], + max_length=10, + verbose_name="Series", + ), ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='victim', - field=models.CharField(max_length=255, verbose_name='Victim'), + model_name="ohlhafvchallenge", + name="victim", + field=models.CharField(max_length=255, verbose_name="Victim"), ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='victim_email', - field=models.EmailField(max_length=254, verbose_name='Victim Email'), + model_name="ohlhafvchallenge", + name="victim_email", + field=models.EmailField(max_length=254, verbose_name="Victim Email"), ), ] diff --git a/webapp/migrations/0036_auto_20180301_2011.py b/webapp/migrations/0036_auto_20180301_2011.py index 073a964..2410f25 100644 --- a/webapp/migrations/0036_auto_20180301_2011.py +++ b/webapp/migrations/0036_auto_20180301_2011.py @@ -9,20 +9,33 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('webapp', '0035_auto_20171019_1413'), + ("webapp", "0035_auto_20171019_1413"), ] operations = [ migrations.CreateModel( - name='Committee', + name="Committee", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=255)), ], ), migrations.AddField( - model_name='role', - name='committee', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Committee'), + model_name="role", + name="committee", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="roles", + to="webapp.Committee", + ), ), ] diff --git a/webapp/migrations/0037_auto_20180125_2131.py b/webapp/migrations/0037_auto_20180125_2131.py index 6ffc925..2264904 100644 --- a/webapp/migrations/0037_auto_20180125_2131.py +++ b/webapp/migrations/0037_auto_20180125_2131.py @@ -8,23 +8,32 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0036_auto_20180124_1712'), + ("webapp", "0036_auto_20180124_1712"), ] operations = [ migrations.AlterField( - model_name='ohlhafvchallenge', - name='message', - field=models.TextField(blank=True, verbose_name='Message'), + model_name="ohlhafvchallenge", + name="message", + field=models.TextField(blank=True, verbose_name="Message"), ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='series', - field=models.CharField(choices=[('0.33 L', '0.33 L'), ('0.5 L', '0.5 L'), ('1.0 L', '1.0 L'), ('Team', 'Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0 L)')], max_length=10, verbose_name='Series'), + model_name="ohlhafvchallenge", + name="series", + field=models.CharField( + choices=[ + ("0.33 L", "0.33 L"), + ("0.5 L", "0.5 L"), + ("1.0 L", "1.0 L"), + ("Team", "Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0 L)"), + ], + max_length=10, + verbose_name="Series", + ), ), migrations.AlterField( - model_name='ohlhafvchallenge', - name='victim_email', - field=models.EmailField(max_length=254, verbose_name='Victim email'), + model_name="ohlhafvchallenge", + name="victim_email", + field=models.EmailField(max_length=254, verbose_name="Victim email"), ), ] diff --git a/webapp/migrations/0037_auto_20180301_2111.py b/webapp/migrations/0037_auto_20180301_2111.py index b5cab47..1cbd2c0 100644 --- a/webapp/migrations/0037_auto_20180301_2111.py +++ b/webapp/migrations/0037_auto_20180301_2111.py @@ -8,12 +8,12 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0036_auto_20180301_2011'), + ("webapp", "0036_auto_20180301_2011"), ] operations = [ migrations.AlterModelOptions( - name='committee', - options={'verbose_name': 'Committee', 'verbose_name_plural': 'Committees'}, + name="committee", + options={"verbose_name": "Committee", "verbose_name_plural": "Committees"}, ), ] diff --git a/webapp/migrations/0038_auto_20180516_2108.py b/webapp/migrations/0038_auto_20180516_2108.py index b58445c..7113f9c 100644 --- a/webapp/migrations/0038_auto_20180516_2108.py +++ b/webapp/migrations/0038_auto_20180516_2108.py @@ -9,26 +9,36 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('webapp', '0037_auto_20180301_2111'), + ("webapp", "0037_auto_20180301_2111"), ] operations = [ migrations.RemoveField( - model_name='baserole', - name='category', + model_name="baserole", + name="category", ), migrations.RemoveField( - model_name='role', - name='committee', + model_name="role", + name="committee", ), migrations.AddField( - model_name='official', - name='committee', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Committee'), + model_name="official", + name="committee", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="roles", + to="webapp.Committee", + ), ), migrations.AlterField( - model_name='role', - name='official', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='roles', to='webapp.Official'), + model_name="role", + name="official", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="roles", + to="webapp.Official", + ), ), ] diff --git a/webapp/migrations/0038_migrate_kaehmy.py b/webapp/migrations/0038_migrate_kaehmy.py index 17cb0f6..17e4da9 100644 --- a/webapp/migrations/0038_migrate_kaehmy.py +++ b/webapp/migrations/0038_migrate_kaehmy.py @@ -6,17 +6,15 @@ from django.db import migrations def migrate_kaehmys(apps, schema_editor): - WebappTelegramChannel = apps.get_model('webapp', 'TelegramChannel') - KaehmyTelegramChannel = apps.get_model('kaehmy', 'TelegramChannel') + WebappTelegramChannel = apps.get_model("webapp", "TelegramChannel") + KaehmyTelegramChannel = apps.get_model("kaehmy", "TelegramChannel") for channel in WebappTelegramChannel.objects.all(): KaehmyTelegramChannel.objects.create( - id=channel.id, - name=channel.name, - channel_id=channel.channel_id + id=channel.id, name=channel.name, channel_id=channel.channel_id ) - WebappCustomKaehmyRole = apps.get_model('webapp', 'CustomKaehmyRole') - KaehmyCustomRole = apps.get_model('kaehmy', 'CustomRole') + WebappCustomKaehmyRole = apps.get_model("webapp", "CustomKaehmyRole") + KaehmyCustomRole = apps.get_model("kaehmy", "CustomRole") for role in WebappCustomKaehmyRole.objects.all(): KaehmyCustomRole.objects.create( id=role.id, @@ -27,8 +25,8 @@ def migrate_kaehmys(apps, schema_editor): name_en=role.name_en, ) - WebappPresetKaehmyRole = apps.get_model('webapp', 'PresetKaehmyRole') - KaehmyPresetRole = apps.get_model('kaehmy', 'PresetRole') + WebappPresetKaehmyRole = apps.get_model("webapp", "PresetKaehmyRole") + KaehmyPresetRole = apps.get_model("kaehmy", "PresetRole") for role in WebappPresetKaehmyRole.objects.all(): KaehmyPresetRole.objects.create( id=role.id, @@ -42,8 +40,8 @@ def migrate_kaehmys(apps, schema_editor): description_en=role.description_en, ) - WebappKaehmyForm = apps.get_model('webapp', 'KaehmyForm') - KaehmyApplication = apps.get_model('kaehmy', 'Application') + WebappKaehmyForm = apps.get_model("webapp", "KaehmyForm") + KaehmyApplication = apps.get_model("kaehmy", "Application") for form in WebappKaehmyForm.objects.all(): application = KaehmyApplication.objects.create( id=form.id, @@ -67,10 +65,10 @@ def migrate_kaehmys(apps, schema_editor): application.save() - WebappKaehmyMessage = apps.get_model('webapp', 'KaehmyMessage') - KaehmyComment = apps.get_model('kaehmy', 'Comment') - KaehmyCommentParent = apps.get_model('kaehmy', 'CommentParent') - for message in WebappKaehmyMessage.objects.order_by('id'): + WebappKaehmyMessage = apps.get_model("webapp", "KaehmyMessage") + KaehmyComment = apps.get_model("kaehmy", "Comment") + KaehmyCommentParent = apps.get_model("kaehmy", "CommentParent") + for message in WebappKaehmyMessage.objects.order_by("id"): parent = KaehmyCommentParent.objects.get(id=message.parent.id) comment = KaehmyComment.objects.create( @@ -86,8 +84,8 @@ def migrate_kaehmys(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('webapp', '0037_auto_20180125_2131'), - ('kaehmy', '0001_initial'), + ("webapp", "0037_auto_20180125_2131"), + ("kaehmy", "0001_initial"), ] operations = [ diff --git a/webapp/migrations/0039_auto_20180516_2113.py b/webapp/migrations/0039_auto_20180516_2113.py index 3fd2671..78f022e 100644 --- a/webapp/migrations/0039_auto_20180516_2113.py +++ b/webapp/migrations/0039_auto_20180516_2113.py @@ -9,31 +9,41 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('webapp', '0038_auto_20180516_2108'), + ("webapp", "0038_auto_20180516_2108"), ] operations = [ migrations.RemoveField( - model_name='official', - name='committee', + model_name="official", + name="committee", ), migrations.RemoveField( - model_name='role', - name='official', + model_name="role", + name="official", ), migrations.AddField( - model_name='official', - name='role', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Role'), + model_name="official", + name="role", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="roles", + to="webapp.Role", + ), ), migrations.AddField( - model_name='role', - name='committee', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles', to='webapp.Committee'), + model_name="role", + name="committee", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="roles", + to="webapp.Committee", + ), ), migrations.AlterField( - model_name='committee', - name='name', - field=models.CharField(max_length=255, verbose_name='Name'), + model_name="committee", + name="name", + field=models.CharField(max_length=255, verbose_name="Name"), ), ] diff --git a/webapp/migrations/0039_delete_kaehmy_models.py b/webapp/migrations/0039_delete_kaehmy_models.py index 32f80ec..aa317a2 100644 --- a/webapp/migrations/0039_delete_kaehmy_models.py +++ b/webapp/migrations/0039_delete_kaehmy_models.py @@ -8,26 +8,26 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0038_migrate_kaehmy'), + ("webapp", "0038_migrate_kaehmy"), ] operations = [ migrations.DeleteModel( - name='TelegramChannel', + name="TelegramChannel", ), migrations.DeleteModel( - name='CustomKaehmyRole', + name="CustomKaehmyRole", ), migrations.DeleteModel( - name='KaehmyForm', + name="KaehmyForm", ), migrations.DeleteModel( - name='KaehmyMessage', + name="KaehmyMessage", ), migrations.DeleteModel( - name='MessageParent', + name="MessageParent", ), migrations.DeleteModel( - name='PresetKaehmyRole', + name="PresetKaehmyRole", ), ] diff --git a/webapp/migrations/0040_auto_20180516_2124.py b/webapp/migrations/0040_auto_20180516_2124.py index 7370f7b..1e16c1d 100644 --- a/webapp/migrations/0040_auto_20180516_2124.py +++ b/webapp/migrations/0040_auto_20180516_2124.py @@ -8,17 +8,19 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0039_auto_20180516_2113'), + ("webapp", "0039_auto_20180516_2113"), ] operations = [ migrations.RemoveField( - model_name='official', - name='role', + model_name="official", + name="role", ), migrations.AddField( - model_name='official', - name='role', - field=models.ManyToManyField(null=True, related_name='roles', to='webapp.Role'), + model_name="official", + name="role", + field=models.ManyToManyField( + null=True, related_name="roles", to="webapp.Role" + ), ), ] diff --git a/webapp/migrations/0040_migrate_ohlhafvchallenge.py b/webapp/migrations/0040_migrate_ohlhafvchallenge.py index 49f4478..781b0b4 100644 --- a/webapp/migrations/0040_migrate_ohlhafvchallenge.py +++ b/webapp/migrations/0040_migrate_ohlhafvchallenge.py @@ -6,8 +6,8 @@ from django.db import migrations def migrate_ohlhafv(apps, schema_editor): - NewOhlhafvChallenge = apps.get_model('ohlhafv', 'OhlhafvChallenge') - OldOhlhafvChallenge = apps.get_model('webapp', 'OhlhafvChallenge') + NewOhlhafvChallenge = apps.get_model("ohlhafv", "OhlhafvChallenge") + OldOhlhafvChallenge = apps.get_model("webapp", "OhlhafvChallenge") for challenge in OldOhlhafvChallenge.objects.all(): NewOhlhafvChallenge.objects.create( id=challenge.id, @@ -23,8 +23,8 @@ def migrate_ohlhafv(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('webapp', '0039_delete_kaehmy_models'), - ('ohlhafv', '0001_initial'), + ("webapp", "0039_delete_kaehmy_models"), + ("ohlhafv", "0001_initial"), ] operations = [ diff --git a/webapp/migrations/0041_auto_20180516_2204.py b/webapp/migrations/0041_auto_20180516_2204.py index 8c5ac91..1a02049 100644 --- a/webapp/migrations/0041_auto_20180516_2204.py +++ b/webapp/migrations/0041_auto_20180516_2204.py @@ -8,13 +8,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0040_auto_20180516_2124'), + ("webapp", "0040_auto_20180516_2124"), ] operations = [ migrations.AlterField( - model_name='official', - name='role', - field=models.ManyToManyField(related_name='official', to='webapp.Role'), + model_name="official", + name="role", + field=models.ManyToManyField(related_name="official", to="webapp.Role"), ), ] diff --git a/webapp/migrations/0041_delete_ohlhafvchallenge.py b/webapp/migrations/0041_delete_ohlhafvchallenge.py index cca69ba..4e593f3 100644 --- a/webapp/migrations/0041_delete_ohlhafvchallenge.py +++ b/webapp/migrations/0041_delete_ohlhafvchallenge.py @@ -8,11 +8,11 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0040_migrate_ohlhafvchallenge'), + ("webapp", "0040_migrate_ohlhafvchallenge"), ] operations = [ migrations.DeleteModel( - name='OhlhafvChallenge', + name="OhlhafvChallenge", ), ] diff --git a/webapp/migrations/0042_merge_20180516_2249.py b/webapp/migrations/0042_merge_20180516_2249.py index 289c272..f0e1a60 100644 --- a/webapp/migrations/0042_merge_20180516_2249.py +++ b/webapp/migrations/0042_merge_20180516_2249.py @@ -8,9 +8,8 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0041_auto_20180516_2204'), - ('webapp', '0041_delete_ohlhafvchallenge'), + ("webapp", "0041_auto_20180516_2204"), + ("webapp", "0041_delete_ohlhafvchallenge"), ] - operations = [ - ] + operations = [] diff --git a/webapp/migrations/0043_auto_20180605_1953.py b/webapp/migrations/0043_auto_20180605_1953.py index d449b36..9f07f0e 100644 --- a/webapp/migrations/0043_auto_20180605_1953.py +++ b/webapp/migrations/0043_auto_20180605_1953.py @@ -8,22 +8,22 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0042_merge_20180516_2249'), + ("webapp", "0042_merge_20180516_2249"), ] operations = [ migrations.RemoveField( - model_name='event', - name='basefeed_ptr', + model_name="event", + name="basefeed_ptr", ), migrations.RemoveField( - model_name='event', - name='registration', + model_name="event", + name="registration", ), migrations.DeleteModel( - name='Event', + name="Event", ), migrations.DeleteModel( - name='Registration', + name="Registration", ), ] diff --git a/webapp/migrations/0044_auto_20180705_1851.py b/webapp/migrations/0044_auto_20180705_1851.py index 7b43419..1c13f6c 100644 --- a/webapp/migrations/0044_auto_20180705_1851.py +++ b/webapp/migrations/0044_auto_20180705_1851.py @@ -10,68 +10,104 @@ import django.utils.timezone class Migration(migrations.Migration): dependencies = [ - ('webapp', '0043_auto_20180605_1953'), + ("webapp", "0043_auto_20180605_1953"), ] operations = [ migrations.CreateModel( - name='Event', + name="Event", fields=[ - ('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')), - ('start_time', models.DateTimeField(default=django.utils.timezone.now)), - ('end_time', models.DateTimeField(default=django.utils.timezone.now)), + ( + "basefeed_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.BaseFeed", + ), + ), + ("start_time", models.DateTimeField(default=django.utils.timezone.now)), + ("end_time", models.DateTimeField(default=django.utils.timezone.now)), ], options={ - 'verbose_name': 'Event', - 'verbose_name_plural': 'Events', + "verbose_name": "Event", + "verbose_name_plural": "Events", }, - bases=('webapp.basefeed',), + bases=("webapp.basefeed",), ), migrations.CreateModel( - name='Signup', + name="Signup", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('time', models.DateTimeField(default=django.utils.timezone.now)), - ('answer', models.CharField(max_length=255)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("time", models.DateTimeField(default=django.utils.timezone.now)), + ("answer", models.CharField(max_length=255)), ], options={ - 'verbose_name': 'Sign-up', - 'verbose_name_plural': 'Sign-ups', + "verbose_name": "Sign-up", + "verbose_name_plural": "Sign-ups", }, ), migrations.CreateModel( - name='SignupForm', + name="SignupForm", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('start', models.DateTimeField(default=django.utils.timezone.now)), - ('end', models.DateTimeField(default=django.utils.timezone.now)), - ('question', models.CharField(max_length=255)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("start", models.DateTimeField(default=django.utils.timezone.now)), + ("end", models.DateTimeField(default=django.utils.timezone.now)), + ("question", models.CharField(max_length=255)), ], options={ - 'verbose_name': 'Signup form', - 'verbose_name_plural': 'Signup forms', + "verbose_name": "Signup form", + "verbose_name_plural": "Signup forms", }, ), migrations.CreateModel( - name='TemplateQuestion', + name="TemplateQuestion", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('question', models.CharField(max_length=255)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=255)), + ("question", models.CharField(max_length=255)), ], options={ - 'verbose_name': 'Template question', - 'verbose_name_plural': 'Template questions', + "verbose_name": "Template question", + "verbose_name_plural": "Template questions", }, ), migrations.AddField( - model_name='signup', - name='signupForm', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='webapp.SignupForm'), + model_name="signup", + name="signupForm", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="webapp.SignupForm" + ), ), migrations.AddField( - model_name='event', - name='signupForm', - field=models.ManyToManyField(blank=True, to='webapp.SignupForm'), + model_name="event", + name="signupForm", + field=models.ManyToManyField(blank=True, to="webapp.SignupForm"), ), ] diff --git a/webapp/migrations/0045_auto_20180710_1901.py b/webapp/migrations/0045_auto_20180710_1901.py index eeced4e..8c27f9a 100644 --- a/webapp/migrations/0045_auto_20180710_1901.py +++ b/webapp/migrations/0045_auto_20180710_1901.py @@ -8,13 +8,13 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0044_auto_20180705_1851'), + ("webapp", "0044_auto_20180705_1851"), ] operations = [ migrations.RenameField( - model_name='signupform', - old_name='question', - new_name='questions', + model_name="signupform", + old_name="question", + new_name="questions", ), ] diff --git a/webapp/migrations/0046_auto_20180710_2041.py b/webapp/migrations/0046_auto_20180710_2041.py index 161e88d..1e133a6 100644 --- a/webapp/migrations/0046_auto_20180710_2041.py +++ b/webapp/migrations/0046_auto_20180710_2041.py @@ -9,18 +9,23 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('webapp', '0045_auto_20180710_1901'), + ("webapp", "0045_auto_20180710_1901"), ] operations = [ migrations.RemoveField( - model_name='event', - name='signupForm', + model_name="event", + name="signupForm", ), migrations.AddField( - model_name='event', - name='signupForm', - field=models.ForeignKey(blank=True, default=0, on_delete=django.db.models.deletion.CASCADE, to='webapp.SignupForm'), + model_name="event", + name="signupForm", + field=models.ForeignKey( + blank=True, + default=0, + on_delete=django.db.models.deletion.CASCADE, + to="webapp.SignupForm", + ), preserve_default=False, ), ] diff --git a/webapp/migrations/0047_auto_20180710_2110.py b/webapp/migrations/0047_auto_20180710_2110.py index 3f0732e..0e6ef17 100644 --- a/webapp/migrations/0047_auto_20180710_2110.py +++ b/webapp/migrations/0047_auto_20180710_2110.py @@ -8,17 +8,17 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0046_auto_20180710_2041'), + ("webapp", "0046_auto_20180710_2041"), ] operations = [ migrations.RemoveField( - model_name='event', - name='signupForm', + model_name="event", + name="signupForm", ), migrations.AddField( - model_name='event', - name='signupForm', - field=models.ManyToManyField(blank=True, to='webapp.SignupForm'), + model_name="event", + name="signupForm", + field=models.ManyToManyField(blank=True, to="webapp.SignupForm"), ), ] diff --git a/webapp/migrations/0048_auto_20181118_1336.py b/webapp/migrations/0048_auto_20181118_1336.py index 7cf8c1b..1504f2c 100644 --- a/webapp/migrations/0048_auto_20181118_1336.py +++ b/webapp/migrations/0048_auto_20181118_1336.py @@ -6,12 +6,12 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0047_auto_20180710_2110'), + ("webapp", "0047_auto_20180710_2110"), ] operations = [ - migrations.DeleteModel('tag'), - migrations.DeleteModel('feed'), - migrations.DeleteModel('event'), - migrations.DeleteModel('basefeed'), + migrations.DeleteModel("tag"), + migrations.DeleteModel("feed"), + migrations.DeleteModel("event"), + migrations.DeleteModel("basefeed"), ] diff --git a/webapp/migrations/0049_auto_20181118_1344.py b/webapp/migrations/0049_auto_20181118_1344.py index b9e2add..2ed01b8 100644 --- a/webapp/migrations/0049_auto_20181118_1344.py +++ b/webapp/migrations/0049_auto_20181118_1344.py @@ -9,71 +9,115 @@ import webapp.utils class Migration(migrations.Migration): dependencies = [ - ('webapp', '0048_auto_20181118_1336'), + ("webapp", "0048_auto_20181118_1336"), ] operations = [ migrations.CreateModel( - name='BaseFeed', + name="BaseFeed", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('visible', models.BooleanField(default=True)), - ('title', models.CharField(max_length=255)), - ('title_fi', models.CharField(max_length=255, null=True)), - ('title_en', models.CharField(max_length=255, null=True)), - ('description', models.CharField(max_length=255)), - ('description_fi', models.CharField(max_length=255, null=True)), - ('description_en', models.CharField(max_length=255, null=True)), - ('content', models.TextField()), - ('content_fi', models.TextField(null=True)), - ('content_en', models.TextField(null=True)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("visible", models.BooleanField(default=True)), + ("title", models.CharField(max_length=255)), + ("title_fi", models.CharField(max_length=255, null=True)), + ("title_en", models.CharField(max_length=255, null=True)), + ("description", models.CharField(max_length=255)), + ("description_fi", models.CharField(max_length=255, null=True)), + ("description_en", models.CharField(max_length=255, null=True)), + ("content", models.TextField()), + ("content_fi", models.TextField(null=True)), + ("content_en", models.TextField(null=True)), ], ), migrations.CreateModel( - name='Tag', + name="Tag", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('slug', models.SlugField(unique=True)), - ('name', models.CharField(max_length=127)), - ('name_fi', models.CharField(max_length=127, null=True)), - ('name_en', models.CharField(max_length=127, null=True)), - ('icon', models.ImageField(upload_to='')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("slug", models.SlugField(unique=True)), + ("name", models.CharField(max_length=127)), + ("name_fi", models.CharField(max_length=127, null=True)), + ("name_en", models.CharField(max_length=127, null=True)), + ("icon", models.ImageField(upload_to="")), ], options={ - 'verbose_name': 'Tag', - 'verbose_name_plural': 'Tags', + "verbose_name": "Tag", + "verbose_name_plural": "Tags", }, ), migrations.CreateModel( - name='Event', + name="Event", fields=[ - ('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')), - ('start_time', models.DateTimeField(default=django.utils.timezone.now)), - ('end_time', models.DateTimeField(default=django.utils.timezone.now)), - ('signupForm', models.ManyToManyField(blank=True, to='webapp.SignupForm')), + ( + "basefeed_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.BaseFeed", + ), + ), + ("start_time", models.DateTimeField(default=django.utils.timezone.now)), + ("end_time", models.DateTimeField(default=django.utils.timezone.now)), + ( + "signupForm", + models.ManyToManyField(blank=True, to="webapp.SignupForm"), + ), ], options={ - 'verbose_name': 'Event', - 'verbose_name_plural': 'Events', + "verbose_name": "Event", + "verbose_name_plural": "Events", }, - bases=('webapp.basefeed',), + bases=("webapp.basefeed",), ), migrations.CreateModel( - name='Feed', + name="Feed", fields=[ - ('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')), - ('publish_time', models.DateTimeField(default=django.utils.timezone.now)), - ('autohide', models.DateTimeField(default=webapp.utils.month_from_now)), + ( + "basefeed_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="webapp.BaseFeed", + ), + ), + ( + "publish_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("autohide", models.DateTimeField(default=webapp.utils.month_from_now)), ], options={ - 'verbose_name': 'Feed', - 'verbose_name_plural': 'Feeds', + "verbose_name": "Feed", + "verbose_name_plural": "Feeds", }, - bases=('webapp.basefeed',), + bases=("webapp.basefeed",), ), migrations.AddField( - model_name='basefeed', - name='tags', - field=models.ManyToManyField(blank=True, related_name='feeds', to='webapp.Tag'), + model_name="basefeed", + name="tags", + field=models.ManyToManyField( + blank=True, related_name="feeds", to="webapp.Tag" + ), ), ] diff --git a/webapp/migrations/0050_signupform_visible.py b/webapp/migrations/0050_signupform_visible.py index 5e666ab..5484643 100644 --- a/webapp/migrations/0050_signupform_visible.py +++ b/webapp/migrations/0050_signupform_visible.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0049_auto_20181118_1344'), + ("webapp", "0049_auto_20181118_1344"), ] operations = [ migrations.AddField( - model_name='signupform', - name='visible', + model_name="signupform", + name="visible", field=models.BooleanField(default=True), ), ] diff --git a/webapp/migrations/0051_event_location.py b/webapp/migrations/0051_event_location.py index 9b2d423..f4fbc71 100644 --- a/webapp/migrations/0051_event_location.py +++ b/webapp/migrations/0051_event_location.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0050_signupform_visible'), + ("webapp", "0050_signupform_visible"), ] operations = [ migrations.AddField( - model_name='event', - name='location', + model_name="event", + name="location", field=models.CharField(blank=True, max_length=255), ), ] diff --git a/webapp/migrations/0052_feed_autohide_enabled.py b/webapp/migrations/0052_feed_autohide_enabled.py index 0342b40..1c941c4 100644 --- a/webapp/migrations/0052_feed_autohide_enabled.py +++ b/webapp/migrations/0052_feed_autohide_enabled.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0051_event_location'), + ("webapp", "0051_event_location"), ] operations = [ migrations.AddField( - model_name='feed', - name='autohide_enabled', + model_name="feed", + name="autohide_enabled", field=models.BooleanField(default=False), ), ] diff --git a/webapp/migrations/0053_auto_20190313_1505.py b/webapp/migrations/0053_auto_20190313_1505.py index ae54874..7524f09 100644 --- a/webapp/migrations/0053_auto_20190313_1505.py +++ b/webapp/migrations/0053_auto_20190313_1505.py @@ -6,24 +6,24 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0052_feed_autohide_enabled'), + ("webapp", "0052_feed_autohide_enabled"), ] operations = [ migrations.RenameField( - model_name='signupform', - old_name='end', - new_name='end_time', + model_name="signupform", + old_name="end", + new_name="end_time", ), migrations.RenameField( - model_name='signupform', - old_name='start', - new_name='start_time', + model_name="signupform", + old_name="start", + new_name="start_time", ), migrations.AddField( - model_name='signupform', - name='title', - field=models.CharField(default='Default signup title', max_length=255), + model_name="signupform", + name="title", + field=models.CharField(default="Default signup title", max_length=255), preserve_default=False, ), ] diff --git a/webapp/migrations/0054_auto_20190313_1642.py b/webapp/migrations/0054_auto_20190313_1642.py index 8111907..ee9c033 100644 --- a/webapp/migrations/0054_auto_20190313_1642.py +++ b/webapp/migrations/0054_auto_20190313_1642.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0053_auto_20190313_1505'), + ("webapp", "0053_auto_20190313_1505"), ] operations = [ migrations.AlterField( - model_name='signupform', - name='questions', - field=models.TextField(default='[]'), + model_name="signupform", + name="questions", + field=models.TextField(default="[]"), ), ] diff --git a/webapp/migrations/0055_auto_20190926_2048.py b/webapp/migrations/0055_auto_20190926_2048.py index 36f40e0..f8de2fd 100644 --- a/webapp/migrations/0055_auto_20190926_2048.py +++ b/webapp/migrations/0055_auto_20190926_2048.py @@ -9,11 +9,7 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('webapp', '0054_auto_20190313_1642'), + ("webapp", "0054_auto_20190313_1642"), ] - operations = [ - migrations.DeleteModel( - name='official' - ) - ] + operations = [migrations.DeleteModel(name="official")] diff --git a/webapp/migrations/0056_auto_20190926_2051.py b/webapp/migrations/0056_auto_20190926_2051.py index 3c9dbff..2424643 100644 --- a/webapp/migrations/0056_auto_20190926_2051.py +++ b/webapp/migrations/0056_auto_20190926_2051.py @@ -10,49 +10,92 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('webapp', '0055_auto_20190926_2048'), + ("webapp", "0055_auto_20190926_2048"), ] operations = [ migrations.CreateModel( - name='Occupation', + name="Occupation", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('start_date', models.DateField(verbose_name='Start date')), - ('end_date', models.DateField(verbose_name='End date')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("start_date", models.DateField(verbose_name="Start date")), + ("end_date", models.DateField(verbose_name="End date")), ], options={ - 'verbose_name': 'Occupation', - 'verbose_name_plural': 'Occupations', + "verbose_name": "Occupation", + "verbose_name_plural": "Occupations", }, ), migrations.CreateModel( - name='Official', + name="Official", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_name', models.CharField(max_length=30, verbose_name='First name')), - ('last_name', models.CharField(max_length=150, verbose_name='Last name')), - ('email', models.EmailField(max_length=254, verbose_name='Email address')), - ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, verbose_name='Phone number')), - ('role_history', models.ManyToManyField(blank=True, to='webapp.Occupation')), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "first_name", + models.CharField(max_length=30, verbose_name="First name"), + ), + ( + "last_name", + models.CharField(max_length=150, verbose_name="Last name"), + ), + ( + "email", + models.EmailField(max_length=254, verbose_name="Email address"), + ), + ( + "phone_number", + phonenumber_field.modelfields.PhoneNumberField( + max_length=128, verbose_name="Phone number" + ), + ), + ( + "role_history", + models.ManyToManyField(blank=True, to="webapp.Occupation"), + ), + ( + "user", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), ], options={ - 'verbose_name': 'Official', - 'verbose_name_plural': 'Officials', + "verbose_name": "Official", + "verbose_name_plural": "Officials", }, ), migrations.RemoveField( - model_name='role', - name='end_date', + model_name="role", + name="end_date", ), migrations.RemoveField( - model_name='role', - name='start_date', + model_name="role", + name="start_date", ), migrations.AddField( - model_name='occupation', - name='role', - field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='webapp.Role'), + model_name="occupation", + name="role", + field=models.OneToOneField( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="webapp.Role", + ), ), ] diff --git a/webapp/migrations/0057_auto_20190926_2102.py b/webapp/migrations/0057_auto_20190926_2102.py index 1317349..2b6e4f1 100644 --- a/webapp/migrations/0057_auto_20190926_2102.py +++ b/webapp/migrations/0057_auto_20190926_2102.py @@ -7,13 +7,17 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('webapp', '0056_auto_20190926_2051'), + ("webapp", "0056_auto_20190926_2051"), ] operations = [ migrations.AlterField( - model_name='occupation', - name='role', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='webapp.Role'), + model_name="occupation", + name="role", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="webapp.Role", + ), ), ] diff --git a/webapp/migrations/0058_auto_20191010_1837.py b/webapp/migrations/0058_auto_20191010_1837.py index 7df01b1..ac45c36 100644 --- a/webapp/migrations/0058_auto_20191010_1837.py +++ b/webapp/migrations/0058_auto_20191010_1837.py @@ -6,13 +6,15 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0057_auto_20190926_2102'), + ("webapp", "0057_auto_20190926_2102"), ] operations = [ migrations.AlterField( - model_name='official', - name='role_history', - field=models.ManyToManyField(blank=True, related_name='officials', to='webapp.Occupation'), + model_name="official", + name="role_history", + field=models.ManyToManyField( + blank=True, related_name="officials", to="webapp.Occupation" + ), ), ] diff --git a/webapp/migrations/0059_auto_20191010_1900.py b/webapp/migrations/0059_auto_20191010_1900.py index 8fc9972..6ab7e7f 100644 --- a/webapp/migrations/0059_auto_20191010_1900.py +++ b/webapp/migrations/0059_auto_20191010_1900.py @@ -6,18 +6,18 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0058_auto_20191010_1837'), + ("webapp", "0058_auto_20191010_1837"), ] operations = [ migrations.AddField( - model_name='committee', - name='name_en', - field=models.CharField(max_length=255, null=True, verbose_name='Name'), + model_name="committee", + name="name_en", + field=models.CharField(max_length=255, null=True, verbose_name="Name"), ), migrations.AddField( - model_name='committee', - name='name_fi', - field=models.CharField(max_length=255, null=True, verbose_name='Name'), + model_name="committee", + name="name_fi", + field=models.CharField(max_length=255, null=True, verbose_name="Name"), ), ] diff --git a/webapp/migrations/0060_official_image.py b/webapp/migrations/0060_official_image.py index 0df934f..2db0195 100644 --- a/webapp/migrations/0060_official_image.py +++ b/webapp/migrations/0060_official_image.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0059_auto_20191010_1900'), + ("webapp", "0059_auto_20191010_1900"), ] operations = [ migrations.AddField( - model_name='official', - name='image', - field=models.ImageField(null=True, upload_to=''), + model_name="official", + name="image", + field=models.ImageField(null=True, upload_to=""), ), ] diff --git a/webapp/migrations/0061_auto_20191110_2024.py b/webapp/migrations/0061_auto_20191110_2024.py index aebdfe1..8b60491 100644 --- a/webapp/migrations/0061_auto_20191110_2024.py +++ b/webapp/migrations/0061_auto_20191110_2024.py @@ -7,23 +7,23 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0060_official_image'), + ("webapp", "0060_official_image"), ] operations = [ migrations.AlterField( - model_name='official', - name='image', - field=models.ImageField(blank=True, null=True, upload_to=''), + model_name="official", + name="image", + field=models.ImageField(blank=True, null=True, upload_to=""), ), migrations.AlterField( - model_name='signup', - name='answer', + model_name="signup", + name="answer", field=django.contrib.postgres.fields.jsonb.JSONField(), ), migrations.AlterField( - model_name='signupform', - name='questions', + model_name="signupform", + name="questions", field=django.contrib.postgres.fields.jsonb.JSONField(), ), ] diff --git a/webapp/migrations/0062_auto_20191110_2117.py b/webapp/migrations/0062_auto_20191110_2117.py index 671ed04..e1c1f63 100644 --- a/webapp/migrations/0062_auto_20191110_2117.py +++ b/webapp/migrations/0062_auto_20191110_2117.py @@ -7,13 +7,13 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0061_auto_20191110_2024'), + ("webapp", "0061_auto_20191110_2024"), ] operations = [ migrations.AlterField( - model_name='templatequestion', - name='question', + model_name="templatequestion", + name="question", field=django.contrib.postgres.fields.jsonb.JSONField(), ), ] diff --git a/webapp/migrations/0063_signup_list_name.py b/webapp/migrations/0063_signup_list_name.py index 5460300..3fe8e70 100644 --- a/webapp/migrations/0063_signup_list_name.py +++ b/webapp/migrations/0063_signup_list_name.py @@ -6,14 +6,14 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0062_auto_20191110_2117'), + ("webapp", "0062_auto_20191110_2117"), ] operations = [ migrations.AddField( - model_name='signup', - name='list_name', - field=models.CharField(default='', max_length=255, verbose_name='Name'), + model_name="signup", + name="list_name", + field=models.CharField(default="", max_length=255, verbose_name="Name"), preserve_default=False, ), ] diff --git a/webapp/migrations/0064_signup_uuid.py b/webapp/migrations/0064_signup_uuid.py index 0050252..23b5f14 100644 --- a/webapp/migrations/0064_signup_uuid.py +++ b/webapp/migrations/0064_signup_uuid.py @@ -7,13 +7,13 @@ import uuid class Migration(migrations.Migration): dependencies = [ - ('webapp', '0063_signup_list_name'), + ("webapp", "0063_signup_list_name"), ] operations = [ migrations.AddField( - model_name='signup', - name='uuid', + model_name="signup", + name="uuid", field=models.UUIDField(default=uuid.uuid4, editable=False), ), ] diff --git a/webapp/migrations/0065_signup_email.py b/webapp/migrations/0065_signup_email.py index 7a04475..4174439 100644 --- a/webapp/migrations/0065_signup_email.py +++ b/webapp/migrations/0065_signup_email.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0064_signup_uuid'), + ("webapp", "0064_signup_uuid"), ] operations = [ migrations.AddField( - model_name='signup', - name='email', + model_name="signup", + name="email", field=models.EmailField(blank=True, max_length=254, null=True), ), ] diff --git a/webapp/migrations/0066_auto_20200622_2302.py b/webapp/migrations/0066_auto_20200622_2302.py index ad4873f..f9cffc3 100644 --- a/webapp/migrations/0066_auto_20200622_2302.py +++ b/webapp/migrations/0066_auto_20200622_2302.py @@ -6,13 +6,15 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0065_signup_email'), + ("webapp", "0065_signup_email"), ] operations = [ migrations.AlterField( - model_name='event', - name='signupForm', - field=models.ManyToManyField(blank=True, related_name='event', to='webapp.SignupForm'), + model_name="event", + name="signupForm", + field=models.ManyToManyField( + blank=True, related_name="event", to="webapp.SignupForm" + ), ), ] diff --git a/webapp/migrations/0067_basefeed_image.py b/webapp/migrations/0067_basefeed_image.py index 3eb6eb3..e885c65 100644 --- a/webapp/migrations/0067_basefeed_image.py +++ b/webapp/migrations/0067_basefeed_image.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0066_auto_20200622_2302'), + ("webapp", "0066_auto_20200622_2302"), ] operations = [ migrations.AddField( - model_name='basefeed', - name='image', - field=models.ImageField(blank=True, null=True, upload_to=''), + model_name="basefeed", + name="image", + field=models.ImageField(blank=True, null=True, upload_to=""), ), ] diff --git a/webapp/migrations/0068_signupform_quota.py b/webapp/migrations/0068_signupform_quota.py index b40ed1b..ee26ef6 100644 --- a/webapp/migrations/0068_signupform_quota.py +++ b/webapp/migrations/0068_signupform_quota.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0067_basefeed_image'), + ("webapp", "0067_basefeed_image"), ] operations = [ migrations.AddField( - model_name='signupform', - name='quota', + model_name="signupform", + name="quota", field=models.PositiveIntegerField(blank=True, null=True), ), ] diff --git a/webapp/migrations/0069_signupform_schema.py b/webapp/migrations/0069_signupform_schema.py index 0ad5d46..b59f31a 100644 --- a/webapp/migrations/0069_signupform_schema.py +++ b/webapp/migrations/0069_signupform_schema.py @@ -7,13 +7,13 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0068_signupform_quota'), + ("webapp", "0068_signupform_quota"), ] operations = [ migrations.AddField( - model_name='signupform', - name='schema', + model_name="signupform", + name="schema", field=django.contrib.postgres.fields.jsonb.JSONField(default=[]), preserve_default=False, ), diff --git a/webapp/migrations/0070_auto_20201004_1820.py b/webapp/migrations/0070_auto_20201004_1820.py index 520fc52..0dc1010 100644 --- a/webapp/migrations/0070_auto_20201004_1820.py +++ b/webapp/migrations/0070_auto_20201004_1820.py @@ -6,34 +6,34 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0069_signupform_schema'), + ("webapp", "0069_signupform_schema"), ] operations = [ migrations.AddField( - model_name='event', - name='location_en', + model_name="event", + name="location_en", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='event', - name='location_fi', + model_name="event", + name="location_fi", field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AddField( - model_name='signupform', - name='email_content', - field=models.TextField(default=''), + model_name="signupform", + name="email_content", + field=models.TextField(default=""), preserve_default=False, ), migrations.AddField( - model_name='signupform', - name='title_en', + model_name="signupform", + name="title_en", field=models.CharField(max_length=255, null=True), ), migrations.AddField( - model_name='signupform', - name='title_fi', + model_name="signupform", + name="title_fi", field=models.CharField(max_length=255, null=True), ), ] diff --git a/webapp/migrations/0071_auto_20201006_1749.py b/webapp/migrations/0071_auto_20201006_1749.py index 2a3b8fb..9bd371b 100644 --- a/webapp/migrations/0071_auto_20201006_1749.py +++ b/webapp/migrations/0071_auto_20201006_1749.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0070_auto_20201004_1820'), + ("webapp", "0070_auto_20201004_1820"), ] operations = [ migrations.AlterField( - model_name='signupform', - name='email_content', + model_name="signupform", + name="email_content", field=models.TextField(blank=True), ), ] diff --git a/webapp/migrations/0072_jobad.py b/webapp/migrations/0072_jobad.py index 6502798..958dd3b 100644 --- a/webapp/migrations/0072_jobad.py +++ b/webapp/migrations/0072_jobad.py @@ -8,31 +8,42 @@ import webapp.utils class Migration(migrations.Migration): dependencies = [ - ('webapp', '0071_auto_20201006_1749'), + ("webapp", "0071_auto_20201006_1749"), ] operations = [ migrations.CreateModel( - name='JobAd', + name="JobAd", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255)), - ('title_fi', models.CharField(max_length=255, null=True)), - ('title_en', models.CharField(max_length=255, null=True)), - ('description', models.CharField(max_length=255)), - ('description_fi', models.CharField(max_length=255, null=True)), - ('description_en', models.CharField(max_length=255, null=True)), - ('content', models.TextField()), - ('content_fi', models.TextField(null=True)), - ('content_en', models.TextField(null=True)), - ('visible', models.BooleanField(default=True)), - ('created_at', models.DateTimeField(default=django.utils.timezone.now)), - ('autohide_at', models.DateTimeField(default=webapp.utils.month_from_now)), - ('autohide_enabled', models.BooleanField(default=False)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255)), + ("title_fi", models.CharField(max_length=255, null=True)), + ("title_en", models.CharField(max_length=255, null=True)), + ("description", models.CharField(max_length=255)), + ("description_fi", models.CharField(max_length=255, null=True)), + ("description_en", models.CharField(max_length=255, null=True)), + ("content", models.TextField()), + ("content_fi", models.TextField(null=True)), + ("content_en", models.TextField(null=True)), + ("visible", models.BooleanField(default=True)), + ("created_at", models.DateTimeField(default=django.utils.timezone.now)), + ( + "autohide_at", + models.DateTimeField(default=webapp.utils.month_from_now), + ), + ("autohide_enabled", models.BooleanField(default=False)), ], options={ - 'verbose_name': 'JobAd', - 'verbose_name_plural': 'JobAds', + "verbose_name": "JobAd", + "verbose_name_plural": "JobAds", }, ), ] diff --git a/webapp/migrations/0073_auto_20201107_1916.py b/webapp/migrations/0073_auto_20201107_1916.py index b290885..091e4df 100644 --- a/webapp/migrations/0073_auto_20201107_1916.py +++ b/webapp/migrations/0073_auto_20201107_1916.py @@ -6,55 +6,55 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0072_jobad'), + ("webapp", "0072_jobad"), ] operations = [ migrations.RemoveField( - model_name='occupation', - name='role', + model_name="occupation", + name="role", ), migrations.RemoveField( - model_name='official', - name='role_history', + model_name="official", + name="role_history", ), migrations.RemoveField( - model_name='official', - name='user', + model_name="official", + name="user", ), migrations.RemoveField( - model_name='presetrole', - name='baserole_ptr', + model_name="presetrole", + name="baserole_ptr", ), migrations.RemoveField( - model_name='role', - name='committee', + model_name="role", + name="committee", ), migrations.RemoveField( - model_name='role', - name='presetrole_ptr', + model_name="role", + name="presetrole_ptr", ), migrations.RemoveField( - model_name='baserole', - name='name_en', + model_name="baserole", + name="name_en", ), migrations.RemoveField( - model_name='baserole', - name='name_fi', + model_name="baserole", + name="name_fi", ), migrations.DeleteModel( - name='Committee', + name="Committee", ), migrations.DeleteModel( - name='Occupation', + name="Occupation", ), migrations.DeleteModel( - name='Official', + name="Official", ), migrations.DeleteModel( - name='PresetRole', + name="PresetRole", ), migrations.DeleteModel( - name='Role', + name="Role", ), ] diff --git a/webapp/migrations/0074_signup_deleted.py b/webapp/migrations/0074_signup_deleted.py index 2526461..ed8c923 100644 --- a/webapp/migrations/0074_signup_deleted.py +++ b/webapp/migrations/0074_signup_deleted.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0073_auto_20201107_1916'), + ("webapp", "0073_auto_20201107_1916"), ] operations = [ migrations.AddField( - model_name='signup', - name='deleted', + model_name="signup", + name="deleted", field=models.BooleanField(default=False), ), ] diff --git a/webapp/migrations/0075_auto_20210114_2155.py b/webapp/migrations/0075_auto_20210114_2155.py index ce68abd..b41461d 100644 --- a/webapp/migrations/0075_auto_20210114_2155.py +++ b/webapp/migrations/0075_auto_20210114_2155.py @@ -6,28 +6,28 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0074_signup_deleted'), + ("webapp", "0074_signup_deleted"), ] operations = [ migrations.AddField( - model_name='event', - name='deleted', + model_name="event", + name="deleted", field=models.BooleanField(default=False), ), migrations.AddField( - model_name='feed', - name='deleted', + model_name="feed", + name="deleted", field=models.BooleanField(default=False), ), migrations.AddField( - model_name='jobad', - name='deleted', + model_name="jobad", + name="deleted", field=models.BooleanField(default=False), ), migrations.AddField( - model_name='signupform', - name='deleted', + model_name="signupform", + name="deleted", field=models.BooleanField(default=False), ), ] diff --git a/webapp/migrations/0076_auto_20210823_1943.py b/webapp/migrations/0076_auto_20210823_1943.py index bb9ac9f..8d7e5a5 100644 --- a/webapp/migrations/0076_auto_20210823_1943.py +++ b/webapp/migrations/0076_auto_20210823_1943.py @@ -6,13 +6,13 @@ from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ('webapp', '0075_auto_20210114_2155'), + ("webapp", "0075_auto_20210114_2155"), ] operations = [ migrations.RenameField( - model_name='templatequestion', - old_name='question', - new_name='questions', + model_name="templatequestion", + old_name="question", + new_name="questions", ), ] diff --git a/webapp/migrations/0077_templatequestion_deleted.py b/webapp/migrations/0077_templatequestion_deleted.py index 92b9abb..47eec0a 100644 --- a/webapp/migrations/0077_templatequestion_deleted.py +++ b/webapp/migrations/0077_templatequestion_deleted.py @@ -6,13 +6,13 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('webapp', '0076_auto_20210823_1943'), + ("webapp", "0076_auto_20210823_1943"), ] operations = [ migrations.AddField( - model_name='templatequestion', - name='deleted', + model_name="templatequestion", + name="deleted", field=models.BooleanField(default=False), ), ] diff --git a/webapp/models.py b/webapp/models.py index a1276e8..e874553 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -3,6 +3,7 @@ from django.conf import settings from django.db import models from django.utils import timezone + # from datetime import timedelta from django.contrib.auth.models import User from django.db.models.signals import post_save @@ -15,7 +16,7 @@ from django.contrib.postgres.fields import JSONField from uuid import uuid4 import logging -VERBOSE_NAME = _('Webapp') +VERBOSE_NAME = _("Webapp") EMAIL_REGEX = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)" @@ -23,15 +24,15 @@ class Tag(models.Model): """Model for tag.""" class Meta: - verbose_name = _('Tag') - verbose_name_plural = _('Tags') + verbose_name = _("Tag") + verbose_name_plural = _("Tags") slug = models.SlugField(unique=True) name = models.CharField(max_length=127) icon = models.ImageField() def __str__(self): - return _('Tag: {}').format(self.slug) + return _("Tag: {}").format(self.slug) class BaseFeed(models.Model): @@ -49,8 +50,8 @@ class Feed(BaseFeed): """Model representing feed.""" class Meta: - verbose_name = _('Feed') - verbose_name_plural = _('Feeds') + verbose_name = _("Feed") + verbose_name_plural = _("Feeds") publish_time = models.DateTimeField(default=timezone.now) autohide = models.DateTimeField(default=month_from_now) @@ -59,26 +60,25 @@ class Feed(BaseFeed): def __str__(self): delete_str = _("Deleted: ") if self.deleted else "" - return _('{}Feed: {}').format(delete_str, self.title) + return _("{}Feed: {}").format(delete_str, self.title) class Event(BaseFeed): """Model for event in guild calendar""" class Meta: - verbose_name = _('Event') - verbose_name_plural = _('Events') + verbose_name = _("Event") + verbose_name_plural = _("Events") start_time = models.DateTimeField(default=timezone.now) end_time = models.DateTimeField(default=timezone.now) - signupForm = models.ManyToManyField( - 'SignupForm', blank=True, related_name="event") + signupForm = models.ManyToManyField("SignupForm", blank=True, related_name="event") location = models.CharField(max_length=255, blank=True) deleted = models.BooleanField(default=False) def __str__(self): delete_str = _("Deleted: ") if self.deleted else "" - return _('{}Event: {}').format(delete_str, self.title) + return _("{}Event: {}").format(delete_str, self.title) class TemplateQuestion(models.Model): @@ -87,23 +87,23 @@ class TemplateQuestion(models.Model): """ class Meta: - verbose_name = _('Template question') - verbose_name_plural = _('Template questions') + verbose_name = _("Template question") + verbose_name_plural = _("Template questions") name = models.CharField(max_length=255) questions = JSONField() deleted = models.BooleanField(default=False) def __str__(self): - return _('Template questions: {}').format(self.name) + return _("Template questions: {}").format(self.name) class SignupForm(models.Model): """Model for event signup form. Stores questions in JSON format.""" class Meta: - verbose_name = _('Signup form') - verbose_name_plural = _('Signup forms') + verbose_name = _("Signup form") + verbose_name_plural = _("Signup forms") title = models.CharField(max_length=255) start_time = models.DateTimeField(default=timezone.now) @@ -117,11 +117,11 @@ class SignupForm(models.Model): def __str__(self): delete_str = _("Deleted: ") if self.deleted else "" - return _('#{} {}{}').format(self.id, delete_str, self.title) + return _("#{} {}{}").format(self.id, delete_str, self.title) @property def signups(self): - return Signup.objects.filter(signupForm=self, deleted=False).order_by('pk') + return Signup.objects.filter(signupForm=self, deleted=False).order_by("pk") @property def isOpen(self): @@ -135,13 +135,14 @@ class Signup(models.Model): """ class Meta: - verbose_name = _('Sign-up') - verbose_name_plural = _('Sign-ups') - signupForm = models.ForeignKey('SignupForm', on_delete=models.CASCADE) + verbose_name = _("Sign-up") + verbose_name_plural = _("Sign-ups") + + signupForm = models.ForeignKey("SignupForm", on_delete=models.CASCADE) time = models.DateTimeField(default=timezone.now) answer = JSONField() # Answer we use in signupForm signups field. Frontend uses first questions answer as this value. - list_name = models.CharField(_('Name'), max_length=255) + list_name = models.CharField(_("Name"), max_length=255) # If there is email in questions, we save it as own field email = models.EmailField(blank=True, null=True) # Random unique identifier. Used for signup editing by the user. @@ -164,26 +165,32 @@ def email_on_signup(sender, instance, created, **kwargs): except AttributeError: # subject = _(f"Olet ilmoittautunut ilmoon {instance.signupForm.title}") subject = f"Olet ilmoittautunut ilmoon {instance.signupForm.title}" - send_signup_email(instance.email, subject, instance.id, instance.uuid, instance.signupForm.email_content) + send_signup_email( + instance.email, + subject, + instance.id, + instance.uuid, + instance.signupForm.email_content, + ) class BaseRole(models.Model): """Base model for occupations/roles.""" - name = models.CharField(_('Name'), max_length=255) - is_board = models.BooleanField(_('Board member')) + name = models.CharField(_("Name"), max_length=255) + is_board = models.BooleanField(_("Board member")) def __str__(self): n = self.name.capitalize() - return '{} ({})'.format(n, _('board member')) if self.is_board else n + return "{} ({})".format(n, _("board member")) if self.is_board else n class JobAd(models.Model): """Job advertisements shown on Corporate relations page""" class Meta: - verbose_name = _('JobAd') - verbose_name_plural = _('JobAds') + verbose_name = _("JobAd") + verbose_name_plural = _("JobAds") title = models.CharField(max_length=255) description = models.CharField(max_length=255) @@ -196,7 +203,7 @@ class JobAd(models.Model): def __str__(self): delete_str = _("Deleted: ") if self.deleted else "" - return f'{delete_str}{self.title}' + return f"{delete_str}{self.title}" auditlog.register(Tag) diff --git a/webapp/serializers.py b/webapp/serializers.py index a48df69..b6d8321 100644 --- a/webapp/serializers.py +++ b/webapp/serializers.py @@ -4,8 +4,7 @@ from webapp.models import * class SignupSerializer(serializers.ModelSerializer): signupForm_id = serializers.PrimaryKeyRelatedField( - source="signupForm", - queryset=SignupForm.objects.all() + source="signupForm", queryset=SignupForm.objects.all() ) list_name = serializers.CharField(read_only=True) @@ -15,12 +14,12 @@ class SignupSerializer(serializers.ModelSerializer): email_ids = list(filter(lambda x: x["type"] == "email", questions)) # Send email to first email field in the form - if (len(email_ids) > 0): + if len(email_ids) > 0: id = email_ids[0]["id"] email_value = validated_data["answer"].get(id) validated_data["email"] = email_value # Combine all name fields to list_name - if (len(name_ids) > 0): + if len(name_ids) > 0: # name_value = validated_data["answer"].get(name_fields[0]["id"], None) all_names = map(lambda x: validated_data["answer"].get(x["id"]), name_ids) validated_data["list_name"] = " ".join(all_names) @@ -35,10 +34,10 @@ class SignupSerializer(serializers.ModelSerializer): class Meta: model = Signup - fields = ('id', 'signupForm_id', 'answer', 'list_name') + fields = ("id", "signupForm_id", "answer", "list_name") extra_kwargs = { - 'url': { - 'view_name': 'signup-detail', + "url": { + "view_name": "signup-detail", } } @@ -53,12 +52,25 @@ class SignupFormSerializer(serializers.ModelSerializer): class Meta: model = SignupForm - fields = ('id', 'title_fi', 'title_en', 'visible', 'isOpen', 'start_time', 'end_time', 'email_content', 'questions', 'schema', 'signups', 'quota') + fields = ( + "id", + "title_fi", + "title_en", + "visible", + "isOpen", + "start_time", + "end_time", + "email_content", + "questions", + "schema", + "signups", + "quota", + ) class EventSerializer(serializers.ModelSerializer): signupForm = SignupFormSerializer( - source='filtered_signup_forms', + source="filtered_signup_forms", many=True, read_only=True, ) @@ -76,14 +88,31 @@ class EventSerializer(serializers.ModelSerializer): class Meta: model = Event - fields = ('id', 'tag_id', 'tags', 'visible', 'image', 'title_fi', 'title_en', 'description_fi', 'description_en', - 'content_fi', 'content_en', 'start_time', 'end_time', 'location_fi', 'location_en', 'signup_id', 'signupForm') - read_only_fields = ['tags', 'signupForm'] + fields = ( + "id", + "tag_id", + "tags", + "visible", + "image", + "title_fi", + "title_en", + "description_fi", + "description_en", + "content_fi", + "content_en", + "start_time", + "end_time", + "location_fi", + "location_en", + "signup_id", + "signupForm", + ) + read_only_fields = ["tags", "signupForm"] depth = 1 def create(self, validated_data): - signupForms = validated_data.pop('signup_id', []) - tags = validated_data.pop('tag_id') + signupForms = validated_data.pop("signup_id", []) + tags = validated_data.pop("tag_id") event = Event.objects.create(**validated_data) for form in signupForms: event.signupForm.add(form) @@ -93,8 +122,8 @@ class EventSerializer(serializers.ModelSerializer): return event def update(self, instance, validated_data): - signupForms = validated_data.pop('signup_id', []) - tags = validated_data.pop('tag_id') + signupForms = validated_data.pop("signup_id", []) + tags = validated_data.pop("tag_id") instance.signupForm.clear() instance.tags.clear() for form in signupForms: @@ -110,30 +139,42 @@ class SavedQuestionsSerializer(serializers.ModelSerializer): class Meta: model = TemplateQuestion - fields = ('id', 'name', 'questions') + fields = ("id", "name", "questions") class TagSerializer(serializers.ModelSerializer): class Meta: model = Tag - fields = ('id', 'slug', 'name_fi', 'name_en', 'icon') + fields = ("id", "slug", "name_fi", "name_en", "icon") class FeedSerializer(serializers.ModelSerializer): tag_id = serializers.PrimaryKeyRelatedField( - many=True, - source="tags", - queryset=Tag.objects.all() + many=True, source="tags", queryset=Tag.objects.all() ) class Meta: model = Feed - fields = ('id', 'tags', 'tag_id', 'visible', 'image', 'title_fi', 'title_en', 'description_fi', 'description_en', - 'content_fi', 'content_en', 'publish_time', 'autohide', 'autohide_enabled') + fields = ( + "id", + "tags", + "tag_id", + "visible", + "image", + "title_fi", + "title_en", + "description_fi", + "description_en", + "content_fi", + "content_en", + "publish_time", + "autohide", + "autohide_enabled", + ) depth = 1 def create(self, validated_data): - tags_data = validated_data.pop('tags') + tags_data = validated_data.pop("tags") feed = Feed.objects.create(**validated_data) for tag in tags_data: feed.tags.add(tag) @@ -144,4 +185,15 @@ class FeedSerializer(serializers.ModelSerializer): class JobAdSerializer(serializers.ModelSerializer): class Meta: model = JobAd - fields = ('id', 'title_fi', 'title_en', 'description_fi', 'description_en', 'content_fi', 'content_en', 'visible', 'autohide_at', 'autohide_enabled') + fields = ( + "id", + "title_fi", + "title_en", + "description_fi", + "description_en", + "content_fi", + "content_en", + "visible", + "autohide_at", + "autohide_enabled", + ) diff --git a/webapp/tests/event_fixture.py b/webapp/tests/event_fixture.py index 287b509..6140daa 100644 --- a/webapp/tests/event_fixture.py +++ b/webapp/tests/event_fixture.py @@ -3,7 +3,14 @@ from webapp.models import Event from webapp.utils import month_from_now -def createEventObject(name="Testitapahtuma1", visible=True, start_time=timezone.now(), end_time=month_from_now(), tag_id=[], signup_id=[]): +def createEventObject( + name="Testitapahtuma1", + visible=True, + start_time=timezone.now(), + end_time=month_from_now(), + tag_id=[], + signup_id=[], +): return Event.objects.create( title_fi=name, title_en=f"title_en {name}", @@ -14,11 +21,18 @@ def createEventObject(name="Testitapahtuma1", visible=True, start_time=timezone. content_en=f"content_en {name}", start_time=start_time, end_time=end_time, - location=f"loc {name}" + location=f"loc {name}", ) -def createEventJSON(name="POST1", visible=True, start_time=timezone.now(), end_time=month_from_now(), tag_id=[], signup_id=[]): +def createEventJSON( + name="POST1", + visible=True, + start_time=timezone.now(), + end_time=month_from_now(), + tag_id=[], + signup_id=[], +): return { "tag_id": tag_id, "visible": visible, @@ -31,5 +45,5 @@ def createEventJSON(name="POST1", visible=True, start_time=timezone.now(), end_t "start_time": start_time, "end_time": end_time, "location": f"loc {name}", - "signup_id": signup_id + "signup_id": signup_id, } diff --git a/webapp/tests/signup_fixture.py b/webapp/tests/signup_fixture.py index a15b5fd..7626215 100644 --- a/webapp/tests/signup_fixture.py +++ b/webapp/tests/signup_fixture.py @@ -2,45 +2,91 @@ from webapp.models import Signup, SignupForm from django.utils import timezone from webapp.utils import month_from_now -ALL_QUESTION_TYPES = [{"id": "-naY2R1-h", "name": "Nimi", "type": "text", "options": []}, {"id": "5t1oN2Qev", "name": "Testi", "type": "info", "options": "teskstii"}, {"id": "MYaaAiOiU", "name": "Email", "type": "email", "options": []}, {"id": "Wb5tmyvki", "name": "Radio", "type": "radiobutton", "options": ["Yes", "no", "maybe"]}, {"id": "U41Zp9x0L", "name": "Checkbox", "type": "checkbox", "options": ["A", "B", "C"]}, {"id": "TnDqrvXKf", "name": "Numero", "type": "integer", "options": ["1", "100"]}] +ALL_QUESTION_TYPES = [ + {"id": "-naY2R1-h", "name": "Nimi", "type": "text", "options": []}, + {"id": "5t1oN2Qev", "name": "Testi", "type": "info", "options": "teskstii"}, + {"id": "MYaaAiOiU", "name": "Email", "type": "email", "options": []}, + { + "id": "Wb5tmyvki", + "name": "Radio", + "type": "radiobutton", + "options": ["Yes", "no", "maybe"], + }, + { + "id": "U41Zp9x0L", + "name": "Checkbox", + "type": "checkbox", + "options": ["A", "B", "C"], + }, + {"id": "TnDqrvXKf", "name": "Numero", "type": "integer", "options": ["1", "100"]}, +] -ALL_QUESTION_TYPES_ANSWER = {"-naY2R1-h": "Testi", "MYaaAiOiU": "test-spam@sahkoinsinoorikilta.fi", "Wb5tmyvki": "maybe", "U41Zp9x0L": ["B", "C"], "TnDqrvXKf": 5} +ALL_QUESTION_TYPES_ANSWER = { + "-naY2R1-h": "Testi", + "MYaaAiOiU": "test-spam@sahkoinsinoorikilta.fi", + "Wb5tmyvki": "maybe", + "U41Zp9x0L": ["B", "C"], + "TnDqrvXKf": 5, +} ALL_QUESTIONS_SCHEMA = { "type": "object", "required": ["-naY2R1-h", "MYaaAiOiU", "Wb5tmyvki", "U41Zp9x0L", "TnDqrvXKf"], - "properties": {"-naY2R1-h": {"type": "string"}, "MYaaAiOiU": {"type": "string", "format": "email", "pattern": "^[a-zA-Z0-9.!#$%&\u2019*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$"}, "TnDqrvXKf": {"type": "number", "title": "Numero (1 -- 100)", "maximum": 100, "minimum": 1, "multipleOf": 1}, "U41Zp9x0L": {"type": "array", "items": {"type": "string", "pattern": "^A$|^B$|^C$"}, "maxItems": 3, "uniqueItems": True}, "Wb5tmyvki": {"type": "string", "pattern": "^Yes$|^no$|^maybe$"}}, - "minProperties": 5 + "properties": { + "-naY2R1-h": {"type": "string"}, + "MYaaAiOiU": { + "type": "string", + "format": "email", + "pattern": "^[a-zA-Z0-9.!#$%&\u2019*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$", + }, + "TnDqrvXKf": { + "type": "number", + "title": "Numero (1 -- 100)", + "maximum": 100, + "minimum": 1, + "multipleOf": 1, + }, + "U41Zp9x0L": { + "type": "array", + "items": {"type": "string", "pattern": "^A$|^B$|^C$"}, + "maxItems": 3, + "uniqueItems": True, + }, + "Wb5tmyvki": {"type": "string", "pattern": "^Yes$|^no$|^maybe$"}, + }, + "minProperties": 5, } TEXT_SCHEMA = { "type": "object", "required": ["-naY2R1-h"], - "properties": { - "-naY2R1-h": ALL_QUESTIONS_SCHEMA["properties"]["-naY2R1-h"] - }, - "minProperties": 1 + "properties": {"-naY2R1-h": ALL_QUESTIONS_SCHEMA["properties"]["-naY2R1-h"]}, + "minProperties": 1, } RADIO_SCHEMA = { "type": "object", "required": ["Wb5tmyvki"], - "properties": { - "Wb5tmyvki": ALL_QUESTIONS_SCHEMA["properties"]["Wb5tmyvki"] - }, - "minProperties": 1 + "properties": {"Wb5tmyvki": ALL_QUESTIONS_SCHEMA["properties"]["Wb5tmyvki"]}, + "minProperties": 1, } CBOX_SCHEMA = { "type": "object", "required": ["U41Zp9x0L"], - "properties": { - "U41Zp9x0L": ALL_QUESTIONS_SCHEMA["properties"]["U41Zp9x0L"] - }, - "minProperties": 1 + "properties": {"U41Zp9x0L": ALL_QUESTIONS_SCHEMA["properties"]["U41Zp9x0L"]}, + "minProperties": 1, } -def createSignupForm(name="Form1", start_time=timezone.now(), end_time=month_from_now(), questions=ALL_QUESTION_TYPES, schema=ALL_QUESTIONS_SCHEMA, visible=True, quota=1): +def createSignupForm( + name="Form1", + start_time=timezone.now(), + end_time=month_from_now(), + questions=ALL_QUESTION_TYPES, + schema=ALL_QUESTIONS_SCHEMA, + visible=True, + quota=1, +): return SignupForm.objects.create( title=name, start_time=start_time, @@ -48,21 +94,13 @@ def createSignupForm(name="Form1", start_time=timezone.now(), end_time=month_fro questions=questions, visible=visible, schema=schema, - quota=quota + quota=quota, ) def createSignupObject(list_name, form, answer): - return Signup.objects.create( - list_name=list_name, - signupForm=form, - answer=answer - ) + return Signup.objects.create(list_name=list_name, signupForm=form, answer=answer) def createSignupRequest(list_name, form_id, answer): - return { - "list_name": list_name, - "signupForm_id": form_id, - "answer": answer - } + return {"list_name": list_name, "signupForm_id": form_id, "answer": answer} diff --git a/webapp/tests/tag_fixture.py b/webapp/tests/tag_fixture.py index 3b0cff5..282e259 100644 --- a/webapp/tests/tag_fixture.py +++ b/webapp/tests/tag_fixture.py @@ -8,8 +8,5 @@ def createTagIcon(): def tagBuilder(slug="Tag1", icon=createTagIcon()): return Tag.objects.create( - slug=slug, - name_fi=slug + " name_fi", - name_en=slug + " name_en", - icon=icon + slug=slug, name_fi=slug + " name_fi", name_en=slug + " name_en", icon=icon ) diff --git a/webapp/tests/test_event.py b/webapp/tests/test_event.py index f3b4f9d..b3c33d1 100644 --- a/webapp/tests/test_event.py +++ b/webapp/tests/test_event.py @@ -13,28 +13,30 @@ URL = "/api/events/" class EventTestCase(APITestCase): - def setUp(self): # Visible and relevant test1 = createEventObject( - "Testitapahtuma1", - start_time=timezone.datetime(2019, 11, 9, 12, 0, 0)) + "Testitapahtuma1", start_time=timezone.datetime(2019, 11, 9, 12, 0, 0) + ) # Invisible but relevant createEventObject( "Testitapahtuma2", visible=False, - start_time=timezone.datetime(2018, 11, 9, 12, 0, 0)) + start_time=timezone.datetime(2018, 11, 9, 12, 0, 0), + ) # Visible but unrelevant test2 = createEventObject( "Testitapahtuma3", visible=True, start_time=timezone.datetime(2018, 12, 9, 12, 0, 0), - end_time=timezone.datetime(2018, 12, 9, 13, 0, 0)) + end_time=timezone.datetime(2018, 12, 9, 13, 0, 0), + ) # Visible and relevant createEventObject( "Testitapahtuma4", visible=True, - start_time=timezone.datetime(2018, 12, 9, 12, 0, 0)) + start_time=timezone.datetime(2018, 12, 9, 12, 0, 0), + ) # Add some tags tag1 = tagBuilder() tag2 = tagBuilder("testtag2") @@ -47,7 +49,9 @@ class EventTestCase(APITestCase): self.signupFormId = createSignupForm().id username, password = "test_admin", "password123" - self.authClient = User.objects.create_superuser(username, "myemail@test.com", password) + self.authClient = User.objects.create_superuser( + username, "myemail@test.com", password + ) def test_get_current_events(self): # Get from API @@ -60,11 +64,11 @@ class EventTestCase(APITestCase): req = APIRequestFactory().get(r"http://testserver/api/events/") req.user = AnonymousUser() serializer = EventSerializer( - Event.objects.filter(title_fi__in=("Testitapahtuma1", "Testitapahtuma4")).order_by("start_time"), + Event.objects.filter( + title_fi__in=("Testitapahtuma1", "Testitapahtuma4") + ).order_by("start_time"), many=True, - context={ - "request": req - } + context={"request": req}, ) expected = serializer.data # TODO: Couldn't figure out how to fill filtered_signup_forms used by prefetch for the test... @@ -80,11 +84,11 @@ class EventTestCase(APITestCase): req = APIRequestFactory().get(r"http://testserver/api/events/") req.user = AnonymousUser() serializer = EventSerializer( - Event.objects.filter(title_fi__in=("Testitapahtuma1", "Testitapahtuma3", "Testitapahtuma4")).order_by("start_time"), + Event.objects.filter( + title_fi__in=("Testitapahtuma1", "Testitapahtuma3", "Testitapahtuma4") + ).order_by("start_time"), many=True, - context={ - "request": req - } + context={"request": req}, ) expected = serializer.data # TODO: Couldn't figure out how to fill filtered_signup_forms used by prefetch for the test... @@ -119,7 +123,7 @@ class EventTestCase(APITestCase): response = self.client.post( URL, createEventJSON(tag_id=[self.testTagId], signup_id=[self.signupFormId]), - format="json" + format="json", ) self.assertEqual(response.status_code, status.HTTP_201_CREATED) @@ -129,7 +133,7 @@ class EventTestCase(APITestCase): response = self.client.post( URL, createEventJSON(tag_id=[self.testTagId], signup_id=[self.signupFormId]), - format="json" + format="json", ) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) @@ -140,11 +144,7 @@ class EventTestCase(APITestCase): self.client.force_authenticate(user=self.authClient) event = Event.objects.get(id=self.testEventId) new = createEventJSON(name="Update1", signup_id=[self.signupFormId]) - response = self.client.put( - f"{URL}{self.testEventId}/", - new, - format="json" - ) + response = self.client.put(f"{URL}{self.testEventId}/", new, format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) event = Event.objects.get(id=self.testEventId) @@ -153,9 +153,7 @@ class EventTestCase(APITestCase): def test_update_event_unauth(self): response = self.client.put( - f"{URL}{self.testEventId}/", - createEventJSON(name="Update1"), - format="json" + f"{URL}{self.testEventId}/", createEventJSON(name="Update1"), format="json" ) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) @@ -164,7 +162,9 @@ class EventTestCase(APITestCase): self.assertEqual(Event.objects.count(), 4) def test_delete_event(self): - response = self.client.delete(f"{URL}{self.testEventId}/",) + response = self.client.delete( + f"{URL}{self.testEventId}/", + ) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) self.assertEqual(Event.objects.count(), 4) diff --git a/webapp/tests/test_feed.py b/webapp/tests/test_feed.py index 82490ca..1ef3e76 100644 --- a/webapp/tests/test_feed.py +++ b/webapp/tests/test_feed.py @@ -10,12 +10,16 @@ URL = "/api/feed/" class FeedTestCase(APITestCase): - def setUp(self): tag1 = tagBuilder() tag2 = tagBuilder("testtag2") - feed = Feed.objects.create(title="TestFeed", visible=True, description="diidadaapa", content="lorem ipsum") + feed = Feed.objects.create( + title="TestFeed", + visible=True, + description="diidadaapa", + content="lorem ipsum", + ) feed.tags.add(tag1) feed.tags.add(tag2) self.assertEqual(Feed.objects.count(), 1) @@ -24,16 +28,22 @@ class FeedTestCase(APITestCase): self.feedId = feed.id username, password = "test_admin", "password123" - self.authClient = User.objects.create_superuser(username, "myemail@test.com", password) + self.authClient = User.objects.create_superuser( + username, "myemail@test.com", password + ) def test_get_feed(self): response = self.client.get(URL, format="json") self.assertTrue(status.is_success(response.status_code)) feeds = Feed.objects.all() - serializer = FeedSerializer(feeds, many=True, context={ - "request": APIRequestFactory().get(r"http://testserver/api/feed/") - }) + serializer = FeedSerializer( + feeds, + many=True, + context={ + "request": APIRequestFactory().get(r"http://testserver/api/feed/") + }, + ) self.assertEqual(response.data["results"], serializer.data) def test_post_feed(self): @@ -48,7 +58,7 @@ class FeedTestCase(APITestCase): "description_fi": "liirumlaarum", "description_en": "liirumlaarum", "content_fi": "lorem ipsum", - "content_en": "lorem ipsum" + "content_en": "lorem ipsum", } # Try post without authentication response = self.client.post(URL, data, format="json") @@ -65,7 +75,9 @@ class FeedTestCase(APITestCase): self.assertEqual(created.tags.count(), 2) def test_post_delete(self): - response = self.client.delete(f"{URL}{self.feedId}/",) + response = self.client.delete( + f"{URL}{self.feedId}/", + ) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) self.assertEqual(Feed.objects.count(), 1) diff --git a/webapp/tests/test_jobads.py b/webapp/tests/test_jobads.py index 457c700..d73bc43 100644 --- a/webapp/tests/test_jobads.py +++ b/webapp/tests/test_jobads.py @@ -9,7 +9,6 @@ API = "/api/jobads/" class JobAdTestCase(APITestCase): - def setUp(self): self.prefilled_jobad = JobAd.objects.create( title_fi="ABB Test", @@ -18,11 +17,13 @@ class JobAdTestCase(APITestCase): description_fi="desc", description_en="desc", content_fi="lorem", - content_en="lorem" + content_en="lorem", ) username, password = "test_admin", "password123" - self.authClient = User.objects.create_superuser(username, "myemail@test.com", password) + self.authClient = User.objects.create_superuser( + username, "myemail@test.com", password + ) def test_get_jobads(self): response = self.client.get(API, format="json") @@ -39,7 +40,7 @@ class JobAdTestCase(APITestCase): "description_en": "liirumlaarum", "content_fi": "lorem ipsum", "content_en": "lorem ipsum", - "autohide_enabled": "True" + "autohide_enabled": "True", } # Try post without authentication diff --git a/webapp/tests/test_signup.py b/webapp/tests/test_signup.py index 6a2f7bc..9780dc2 100644 --- a/webapp/tests/test_signup.py +++ b/webapp/tests/test_signup.py @@ -4,13 +4,18 @@ from rest_framework import status from rest_framework.test import APITestCase from webapp.serializers import SignupSerializer from webapp.models import Signup -from webapp.tests.signup_fixture import createSignupForm, createSignupObject, createSignupRequest, ALL_QUESTION_TYPES, ALL_QUESTION_TYPES_ANSWER +from webapp.tests.signup_fixture import ( + createSignupForm, + createSignupObject, + createSignupRequest, + ALL_QUESTION_TYPES, + ALL_QUESTION_TYPES_ANSWER, +) URL = "/api/signup/" class SignupTestCase(APITestCase): - def setUp(self): self.signupForm = createSignupForm() self.hiddenForm = createSignupForm(visible=False) @@ -19,13 +24,12 @@ class SignupTestCase(APITestCase): self.signup2 = createSignupObject("2", self.signupForm, ALL_QUESTION_TYPES) username, password = "test_admin", "password123" - self.authClient = User.objects.create_superuser(username, "myemail@test.com", password) + self.authClient = User.objects.create_superuser( + username, "myemail@test.com", password + ) def test_get_signups(self): - expected = SignupSerializer( - self.signupForm.signup_set.all(), - many=True - ) + expected = SignupSerializer(self.signupForm.signup_set.all(), many=True) # Authenticate self.client.force_authenticate(user=self.authClient) response = self.client.get(URL, format="json") @@ -34,9 +38,7 @@ class SignupTestCase(APITestCase): def test_get_single_signup(self): id = self.signup1.id - expected = SignupSerializer( - Signup.objects.get(id=id) - ) + expected = SignupSerializer(Signup.objects.get(id=id)) # Authenticate self.client.force_authenticate(user=self.authClient) response = self.client.get(f"{URL}{id}/", format="json") @@ -87,11 +89,7 @@ class SignupTestCase(APITestCase): def test_signupee_sendemail(self): form = self.signupForm emailURL = f"/api/signupForm/{form.id}/sendemail/" - payload = { - "subject": "Email subject", - "content": "Markdown", - "mode": "actual" - } + payload = {"subject": "Email subject", "content": "Markdown", "mode": "actual"} no_auth_response = self.client.post(emailURL, payload, format="json") self.assertEqual(no_auth_response.status_code, status.HTTP_401_UNAUTHORIZED) self.client.force_authenticate(user=self.authClient) diff --git a/webapp/tests/test_signup_errors.py b/webapp/tests/test_signup_errors.py index e7a9c93..dd2d04a 100644 --- a/webapp/tests/test_signup_errors.py +++ b/webapp/tests/test_signup_errors.py @@ -4,7 +4,16 @@ from unittest import skip from rest_framework import status from rest_framework.test import APITestCase from webapp.models import Signup -from webapp.tests.signup_fixture import createSignupForm, createSignupObject, createSignupRequest, ALL_QUESTION_TYPES, ALL_QUESTION_TYPES_ANSWER, TEXT_SCHEMA, RADIO_SCHEMA, CBOX_SCHEMA +from webapp.tests.signup_fixture import ( + createSignupForm, + createSignupObject, + createSignupRequest, + ALL_QUESTION_TYPES, + ALL_QUESTION_TYPES_ANSWER, + TEXT_SCHEMA, + RADIO_SCHEMA, + CBOX_SCHEMA, +) URL = "/api/signup/" @@ -12,20 +21,32 @@ URL = "/api/signup/" class SignupErrorTestCase(APITestCase): def setUp(self): self.signupForm = createSignupForm() - self.signupFormText = createSignupForm(name="Form2", questions=[ALL_QUESTION_TYPES[0]], schema=TEXT_SCHEMA) - self.signupFormRadio = createSignupForm(name="Form3", questions=[ALL_QUESTION_TYPES[1]], schema=RADIO_SCHEMA) - self.signupFormCheck = createSignupForm(name="Form4", questions=[ALL_QUESTION_TYPES[2]], schema=CBOX_SCHEMA) + self.signupFormText = createSignupForm( + name="Form2", questions=[ALL_QUESTION_TYPES[0]], schema=TEXT_SCHEMA + ) + self.signupFormRadio = createSignupForm( + name="Form3", questions=[ALL_QUESTION_TYPES[1]], schema=RADIO_SCHEMA + ) + self.signupFormCheck = createSignupForm( + name="Form4", questions=[ALL_QUESTION_TYPES[2]], schema=CBOX_SCHEMA + ) self.hiddenForm = createSignupForm(visible=False) day_from_now = timezone.now() + timezone.timedelta(days=1) day_before_now = timezone.now() + timezone.timedelta(days=-1) - self.signupFormNotStarted = createSignupForm(start_time=day_from_now, end_time=day_from_now) - self.signupFormEnded = createSignupForm(start_time=day_before_now, end_time=timezone.now()) + self.signupFormNotStarted = createSignupForm( + start_time=day_from_now, end_time=day_from_now + ) + self.signupFormEnded = createSignupForm( + start_time=day_before_now, end_time=timezone.now() + ) self.signup1 = createSignupObject("1", self.signupForm, ALL_QUESTION_TYPES) self.signup2 = createSignupObject("2", self.signupForm, ALL_QUESTION_TYPES) username, password = "test_admin", "password123" - self.authClient = User.objects.create_superuser(username, "myemail@test.com", password) + self.authClient = User.objects.create_superuser( + username, "myemail@test.com", password + ) def test_get_all_unauthorized(self): response = self.client.get(URL, format="json") @@ -43,62 +64,94 @@ class SignupErrorTestCase(APITestCase): self.assertEqual(Signup.objects.count(), 2) def test_create_signup_not_started(self): - new = createSignupRequest("asd", self.signupFormNotStarted.id, ALL_QUESTION_TYPES_ANSWER) + new = createSignupRequest( + "asd", self.signupFormNotStarted.id, ALL_QUESTION_TYPES_ANSWER + ) response = self.client.post(URL, new, format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) self.assertEqual(Signup.objects.count(), 2) def test_create_signup_ended(self): - new = createSignupRequest("asd", self.signupFormEnded.id, ALL_QUESTION_TYPES_ANSWER) + new = createSignupRequest( + "asd", self.signupFormEnded.id, ALL_QUESTION_TYPES_ANSWER + ) response = self.client.post(URL, new, format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) self.assertEqual(Signup.objects.count(), 2) def test_create_empty_body(self): - response = self.client.post(URL, createSignupRequest("", self.signupForm.id, {}), format="json") + response = self.client.post( + URL, createSignupRequest("", self.signupForm.id, {}), format="json" + ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) def test_create_array_body(self): - response = self.client.post(URL, createSignupRequest("", self.signupForm.id, []), format="json") + response = self.client.post( + URL, createSignupRequest("", self.signupForm.id, []), format="json" + ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) @skip("We allow extra signup body because of info fields") def test_create_extra_body(self): testInput = ALL_QUESTION_TYPES_ANSWER.copy() testInput["newId"] = "Oon extraa" - response = self.client.post(URL, createSignupRequest("", self.signupForm.id, testInput), format="json") + response = self.client.post( + URL, createSignupRequest("", self.signupForm.id, testInput), format="json" + ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) def test_create_bad_id(self): - response = self.client.post(URL, createSignupRequest("", self.signupFormText.id, {"malformed": "Tekstiä"}), format="json") + response = self.client.post( + URL, + createSignupRequest("", self.signupFormText.id, {"malformed": "Tekstiä"}), + format="json", + ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) def test_create_bad_type_text(self): - response = self.client.post(URL, createSignupRequest("", self.signupFormText.id, {"j5CeRZDvl": 123}), format="json") + response = self.client.post( + URL, + createSignupRequest("", self.signupFormText.id, {"j5CeRZDvl": 123}), + format="json", + ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) def test_create_bad_data_checkbox(self): - response = self.client.post(URL, createSignupRequest("", self.signupFormCheck.id, { - "i10d426d5": ["D"] - }), format="json") + response = self.client.post( + URL, + createSignupRequest("", self.signupFormCheck.id, {"i10d426d5": ["D"]}), + format="json", + ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) def test_create_bad_type_checkbox(self): - response = self.client.post(URL, createSignupRequest("", self.signupFormCheck.id, { - "i10d426d5": {"j5CeRZDvl": {"asd": "123"}} - }), format="json") + response = self.client.post( + URL, + createSignupRequest( + "", + self.signupFormCheck.id, + {"i10d426d5": {"j5CeRZDvl": {"asd": "123"}}}, + ), + format="json", + ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) def test_create_bad_radio(self): - response = self.client.post(URL, createSignupRequest("", self.signupFormRadio.id, { - "RHJhSoaLD": [] - }), format="json") + response = self.client.post( + URL, + createSignupRequest("", self.signupFormRadio.id, {"RHJhSoaLD": []}), + format="json", + ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) def test_create_bad_type_radio(self): - response = self.client.post(URL, createSignupRequest("", self.signupFormRadio.id, { - "RHJhSoaLD": {"asd": "123"} - }), format="json") + response = self.client.post( + URL, + createSignupRequest( + "", self.signupFormRadio.id, {"RHJhSoaLD": {"asd": "123"}} + ), + format="json", + ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(Signup.objects.count(), 2) diff --git a/webapp/tests/test_tag.py b/webapp/tests/test_tag.py index 406ea2a..0d5f664 100644 --- a/webapp/tests/test_tag.py +++ b/webapp/tests/test_tag.py @@ -11,7 +11,6 @@ from webapp.tests.tag_fixture import tagBuilder, createTagIcon class TagsTestCase(APITestCase): - def setUp(self): self.icon = createTagIcon() tag = tagBuilder("Party", icon=self.icon) @@ -20,41 +19,43 @@ class TagsTestCase(APITestCase): tagBuilder("Off") self.assertEqual(Tag.objects.count(), 2) - username, password = 'test_admin', 'password123' - self.authClient = User.objects.create_superuser(username, 'myemail@test.com', password) + username, password = "test_admin", "password123" + self.authClient = User.objects.create_superuser( + username, "myemail@test.com", password + ) def test_get_multiple_tags(self): tagBuilder("Fuksi") tagBuilder("Inter") expected = TagSerializer( - Tag.objects.all(), many=True, + Tag.objects.all(), + many=True, context={ "request": APIRequestFactory().get(r"http://testserver/api/events/") - }).data + }, + ).data - response = self.client.get('/api/tags/', format='json') + response = self.client.get("/api/tags/", format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(len(response.data['results']), 4) + self.assertEqual(len(response.data["results"]), 4) - self.assertEqual( - response.data['results'], - expected - ) + self.assertEqual(response.data["results"], expected) def test_get_single_tag(self): - response = self.client.get(f"/api/tags/{self.tag_id}/", format='json') + response = self.client.get(f"/api/tags/{self.tag_id}/", format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) serializer = TagSerializer( Tag.objects.get(id=self.tag_id), context={ "request": APIRequestFactory().get(r"http://testserver/api/events/") - }) + }, + ) self.assertEqual(response.data, serializer.data) def test_get_invalid_tag(self): - response = self.client.get('/api/tags/15/', format='json') + response = self.client.get("/api/tags/15/", format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) # READ ONLY API! Modify result code and count @@ -68,9 +69,9 @@ class TagsTestCase(APITestCase): "name": "Testinimi", "name_fi": "Testinimi", "name_en": "Test name", - "icon": self.icon + "icon": self.icon, }, - format='json' + format="json", ) # Method Not allowed! diff --git a/webapp/tests/test_templateQuestions.py b/webapp/tests/test_templateQuestions.py index 4ec69b2..77d9925 100644 --- a/webapp/tests/test_templateQuestions.py +++ b/webapp/tests/test_templateQuestions.py @@ -13,31 +13,35 @@ class TemplateQuestionCase(APITestCase): def setUp(self): self.questions = [ TemplateQuestion.objects.create( - name="Testi1", - questions=ALL_QUESTION_TYPES + name="Testi1", questions=ALL_QUESTION_TYPES ), TemplateQuestion.objects.create( - name="Testi2", - questions=ALL_QUESTION_TYPES - ) + name="Testi2", questions=ALL_QUESTION_TYPES + ), ] username, password = "test_admin", "password123" - self.authClient = User.objects.create_superuser(username, "myemail@test.com", password) + self.authClient = User.objects.create_superuser( + username, "myemail@test.com", password + ) def test_get(self): response = self.client.get("/api/questions/", format="json") self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data["results"], SavedQuestionsSerializer(self.questions, many=True).data) - response = self.client.get(f"/api/questions/{self.questions[0].id}/", format="json") + self.assertEqual( + response.data["results"], + SavedQuestionsSerializer(self.questions, many=True).data, + ) + response = self.client.get( + f"/api/questions/{self.questions[0].id}/", format="json" + ) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data, SavedQuestionsSerializer(self.questions[0]).data) + self.assertEqual( + response.data, SavedQuestionsSerializer(self.questions[0]).data + ) def test_post(self): - new = { - "name": "testi3", - "questions": json.dumps(ALL_QUESTION_TYPES) - } + new = {"name": "testi3", "questions": json.dumps(ALL_QUESTION_TYPES)} response = self.client.post("/api/questions/", new, format="json") self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) self.assertEqual(TemplateQuestion.objects.count(), 2) @@ -49,23 +53,23 @@ class TemplateQuestionCase(APITestCase): self.assertEqual(TemplateQuestion.objects.count(), 3) def test_update(self): - new = { - "name": "uusi testi2", - "questions": json.dumps({}) - } - response = self.client.put(f"/api/questions/{self.questions[0].id}/", new, format="json") + new = {"name": "uusi testi2", "questions": json.dumps({})} + response = self.client.put( + f"/api/questions/{self.questions[0].id}/", new, format="json" + ) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) self.assertEqual(TemplateQuestion.objects.count(), 2) # Authenticate self.client.force_authenticate(user=self.authClient) - response = self.client.put(f"/api/questions/{self.questions[0].id}/", new, format="json") + response = self.client.put( + f"/api/questions/{self.questions[0].id}/", new, format="json" + ) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(TemplateQuestion.objects.count(), 2) self.assertEqual( - TemplateQuestion.objects.get(id=self.questions[0].id).name, - "uusi testi2" + TemplateQuestion.objects.get(id=self.questions[0].id).name, "uusi testi2" ) def test_delete(self): @@ -76,6 +80,8 @@ class TemplateQuestionCase(APITestCase): # Authenticate self.client.force_authenticate(user=self.authClient) - response = self.client.delete(f"/api/questions/{self.questions[0].id}/", format="json") + response = self.client.delete( + f"/api/questions/{self.questions[0].id}/", format="json" + ) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(TemplateQuestion.objects.get(id=id).deleted, True) diff --git a/webapp/translation.py b/webapp/translation.py index c7e293b..4da8cd6 100644 --- a/webapp/translation.py +++ b/webapp/translation.py @@ -6,7 +6,7 @@ from webapp.models import * @register(BaseFeed) class BaseFeedTranslationOptions(TranslationOptions): - fields = ('title', 'description', 'content') + fields = ("title", "description", "content") @register(Feed) @@ -16,12 +16,12 @@ class FeedTranslationOptions(TranslationOptions): @register(Tag) class TagTranslationOptions(TranslationOptions): - fields = ('name',) + fields = ("name",) @register(Event) class EventTranslationOptions(TranslationOptions): - fields = ('location',) + fields = ("location",) @register(Signup) @@ -31,7 +31,7 @@ class SignupTranslationOptions(TranslationOptions): @register(SignupForm) class SignupFormTranslationOptions(TranslationOptions): - fields = ('title',) + fields = ("title",) @register(TemplateQuestion) @@ -41,4 +41,8 @@ class TemplateQuestionTranslationOptions(TranslationOptions): @register(JobAd) class JobAdTranslationOptions(TranslationOptions): - fields = ('title', 'description', 'content',) + fields = ( + "title", + "description", + "content", + ) diff --git a/webapp/urls.py b/webapp/urls.py index 58ba3cd..1056b9f 100644 --- a/webapp/urls.py +++ b/webapp/urls.py @@ -14,19 +14,19 @@ class APIRouter(routers.DefaultRouter): router = APIRouter() -router.register(r'events', EventViewSet) -router.register(r'signupForm', SignupFormViewSet) -router.register(r'signup', SignupViewSet) -router.register(r'feed', FeedViewSet) -router.register(r'questions', SavedQuestionsViewSet) -router.register(r'tags', TagsViewSet) -router.register(r'jobads', JobAdViewSet) +router.register(r"events", EventViewSet) +router.register(r"signupForm", SignupFormViewSet) +router.register(r"signup", SignupViewSet) +router.register(r"feed", FeedViewSet) +router.register(r"questions", SavedQuestionsViewSet) +router.register(r"tags", TagsViewSet) +router.register(r"jobads", JobAdViewSet) urlpatterns = [ - url(r'^api/', include(router.urls)), - url(r'^api/api-token-auth/', obtain_jwt_token), - url(r'^api/api-token-verify/', verify_jwt_token), + url(r"^api/", include(router.urls)), + url(r"^api/api-token-auth/", obtain_jwt_token), + url(r"^api/api-token-verify/", verify_jwt_token), # git revision - url(r'^about', about_view), - url(r'^jwt_nginx', nginx_jwt_resp), + url(r"^about", about_view), + url(r"^jwt_nginx", nginx_jwt_resp), ] diff --git a/webapp/views.py b/webapp/views.py index 5153206..a157d7a 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -16,7 +16,12 @@ from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet from rest_framework.filters import OrderingFilter, SearchFilter from rest_framework.decorators import action -from rest_framework.permissions import IsAuthenticatedOrReadOnly, BasePermission, AllowAny, IsAuthenticated +from rest_framework.permissions import ( + IsAuthenticatedOrReadOnly, + BasePermission, + AllowAny, + IsAuthenticated, +) from jsonschema import validate from jsonschema.exceptions import ValidationError @@ -26,9 +31,8 @@ from webapp.utils import admin_send_email_signupees, decode_base64_file class SignupPermission(BasePermission): - def has_permission(self, request, view): - if request.method == 'POST': + if request.method == "POST": return True return request.user and request.user.is_authenticated @@ -44,44 +48,64 @@ class EventViewSet(ModelViewSet): serializer_class = EventSerializer permission_classes = [IsAuthenticatedOrReadOnly] filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter) - filter_fields = ('id', 'tags', 'visible', 'signupForm') - search_fields = ('id', 'tags', 'visible', 'signupForm') + filter_fields = ("id", "tags", "visible", "signupForm") + search_fields = ("id", "tags", "visible", "signupForm") def get_queryset(self): # TODO: For create and update, this return old data in signupForm field (prefetched)... - if self.request.user.is_authenticated or \ - self.request.method == 'POST' or \ - self.request.method == 'PUT': + if ( + self.request.user.is_authenticated + or self.request.method == "POST" + or self.request.method == "PUT" + ): return Event.objects.filter(deleted=False).prefetch_related( - Prefetch('signupForm', queryset=SignupForm.objects.filter(deleted=False), to_attr='filtered_signup_forms') + Prefetch( + "signupForm", + queryset=SignupForm.objects.filter(deleted=False), + to_attr="filtered_signup_forms", + ) ) - since = self.request.query_params.get('since', None) + since = self.request.query_params.get("since", None) if since: - return Event.objects.filter(deleted=False, visible=True, end_time__gt=since).order_by('start_time').prefetch_related( - Prefetch('signupForm', queryset=SignupForm.objects.filter(deleted=False, visible=True), to_attr='filtered_signup_forms') + return ( + Event.objects.filter(deleted=False, visible=True, end_time__gt=since) + .order_by("start_time") + .prefetch_related( + Prefetch( + "signupForm", + queryset=SignupForm.objects.filter(deleted=False, visible=True), + to_attr="filtered_signup_forms", + ) + ) + ) + return ( + Event.objects.filter( + deleted=False, visible=True, end_time__gt=timezone.now() + ) + .order_by("start_time") + .prefetch_related( + Prefetch( + "signupForm", + queryset=SignupForm.objects.filter(deleted=False, visible=True), + to_attr="filtered_signup_forms", + ) ) - return Event.objects.filter(deleted=False, visible=True, end_time__gt=timezone.now()).order_by('start_time').prefetch_related( - Prefetch('signupForm', queryset=SignupForm.objects.filter(deleted=False, visible=True), to_attr='filtered_signup_forms') ) def create(self, request, *args, **kwargs): raw_image = request.data.get("image", None) if raw_image is not None: image = decode_base64_file(raw_image) - request.data.update({ - "image": image - }) + request.data.update({"image": image}) return super().create(request, *args, **kwargs) def update(self, request, *args, **kwargs): raw_image = request.data.get("image", None) if raw_image is not None: image = decode_base64_file(raw_image) - request.data.update({ - "image": image - }) + request.data.update({"image": image}) return super().update(request, *args, **kwargs) def destroy(self, request, pk=None, *args, **kwargs): @@ -112,8 +136,10 @@ class SignupFormViewSet(ModelViewSet): def get_queryset(self): if self.request.user.is_authenticated: - return SignupForm.objects.filter(deleted=False).order_by('start_time') - return SignupForm.objects.filter(deleted=False, visible=True).order_by('start_time') + return SignupForm.objects.filter(deleted=False).order_by("start_time") + return SignupForm.objects.filter(deleted=False, visible=True).order_by( + "start_time" + ) def destroy(self, request, pk=None, *args, **kwargs): try: @@ -122,33 +148,39 @@ class SignupFormViewSet(ModelViewSet): form.save() return JsonResponse(status=200, data={"message": "OK"}) except ObjectDoesNotExist: - return JsonResponse(status=404, data={"error": f"SignupForm {pk} not found"}) + return JsonResponse( + status=404, data={"error": f"SignupForm {pk} not found"} + ) - @action(detail=True, methods=['post'], permission_classes=[IsAuthenticated]) + @action(detail=True, methods=["post"], permission_classes=[IsAuthenticated]) def sendemail(self, request, pk=None, *args, **kwargs): subject = request.data["subject"] content = request.data["content"] mode = request.data["mode"] queryset = self.filter_queryset(self.get_queryset()) - filter = {'pk': pk} + filter = {"pk": pk} signupForm = get_object_or_404(queryset, **filter) - if (mode == "all"): + if mode == "all": admin_send_email_signupees(signupForm.signups, subject, content) return JsonResponse(status=201, data={"message": "Email sent"}) - elif (mode == "actual"): - admin_send_email_signupees(signupForm.signups[:signupForm.quota], subject, content) + elif mode == "actual": + admin_send_email_signupees( + signupForm.signups[: signupForm.quota], subject, content + ) return JsonResponse(status=201, data={"message": "Email sent"}) - elif (mode == "reserved"): - admin_send_email_signupees(signupForm.signups[signupForm.quota:], subject, content) + elif mode == "reserved": + admin_send_email_signupees( + signupForm.signups[signupForm.quota :], subject, content + ) return JsonResponse(status=201, data={"message": "Email sent"}) else: return JsonResponse(status=400, data={"error": f"Bad mode '{mode}'"}) - @action(detail=True, methods=['get'], permission_classes=[IsAuthenticated]) + @action(detail=True, methods=["get"], permission_classes=[IsAuthenticated]) def signups(self, request, pk=None, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) - filter = {'pk': pk} + filter = {"pk": pk} signupForm = get_object_or_404(queryset, **filter) return Response(SignupSerializer(signupForm.signups, many=True).data) @@ -158,15 +190,15 @@ class SignupViewSet(ModelViewSet): serializer_class = SignupSerializer permission_classes = [SignupPermission] - @action(detail=True, methods=['get', 'put'], permission_classes=[AllowAny]) + @action(detail=True, methods=["get", "put"], permission_classes=[AllowAny]) def edit(self, request, pk=None, *args, **kwargs): uuid = request.query_params.get("uuid", None) queryset = self.filter_queryset(self.get_queryset()) - filter = {'pk': pk, 'uuid': uuid} + filter = {"pk": pk, "uuid": uuid} get_object_or_404(queryset, **filter) - if request.method == 'GET': + if request.method == "GET": return self.retrieve(request, *args, **kwargs) - elif request.method == 'PUT': + elif request.method == "PUT": return self.partial_update(request, *args, **kwargs) def create(self, request, *args, **kwargs): @@ -174,16 +206,20 @@ class SignupViewSet(ModelViewSet): try: answer = request.data["answer"] form = SignupForm.objects.get(id=id) - if (form.isOpen): + if form.isOpen: # Throws ValidationError if not valid validate(instance=answer, schema=form.schema) return super().create(request, *args, **kwargs) except ValidationError as inst: return JsonResponse(status=400, data={"error": inst.message}) except ObjectDoesNotExist: - return JsonResponse(status=404, data={"error": f"SignupForm {id} not found"}) + return JsonResponse( + status=404, data={"error": f"SignupForm {id} not found"} + ) else: - return JsonResponse(status=404, data={"error": f"SignupForm {id} not found"}) + return JsonResponse( + status=404, data={"error": f"SignupForm {id} not found"} + ) def partial_update(self, request, pk=None, *args, **kwargs): try: @@ -193,16 +229,20 @@ class SignupViewSet(ModelViewSet): answer = request.data["answer"] form = SignupForm.objects.get(id=signup.signupForm_id) - if (form.visible): + if form.visible: # Throws ValidationError if not valid validate(instance=answer, schema=form.schema) return super().partial_update(request, *args, **kwargs) except ValidationError as inst: return JsonResponse(status=400, data={"error": inst.message}) except ObjectDoesNotExist: - return JsonResponse(status=404, data={"error": f"SignupForm {id} not found"}) + return JsonResponse( + status=404, data={"error": f"SignupForm {id} not found"} + ) else: - return JsonResponse(status=404, data={"error": f"SignupForm {id} not found"}) + return JsonResponse( + status=404, data={"error": f"SignupForm {id} not found"} + ) def destroy(self, request, pk=None, *args, **kwargs): try: @@ -226,7 +266,9 @@ class SavedQuestionsViewSet(ModelViewSet): question.save() return JsonResponse(status=200, data={"message": "OK"}) except ObjectDoesNotExist: - return JsonResponse(status=404, data={"error": f"Template question {pk} not found"}) + return JsonResponse( + status=404, data={"error": f"Template question {pk} not found"} + ) class FeedViewSet(ModelViewSet): @@ -234,14 +276,16 @@ class FeedViewSet(ModelViewSet): serializer_class = FeedSerializer permission_classes = [IsAuthenticatedOrReadOnly] filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter) - filter_fields = ('id', 'tags', 'visible') - search_fields = ('id', 'tags', 'visible') + filter_fields = ("id", "tags", "visible") + search_fields = ("id", "tags", "visible") def get_queryset(self): if self.request.user.is_authenticated: - return Feed.objects.filter(deleted=False).order_by('-publish_time') + return Feed.objects.filter(deleted=False).order_by("-publish_time") else: - objs = Feed.objects.filter(deleted=False, visible=True).order_by('-publish_time') + objs = Feed.objects.filter(deleted=False, visible=True).order_by( + "-publish_time" + ) # TODO: Bad filtering. Rewrite! result_ids = [] @@ -252,7 +296,7 @@ class FeedViewSet(ModelViewSet): else: result_ids.append(obj.id) - return Feed.objects.filter(id__in=result_ids).order_by('-publish_time') + return Feed.objects.filter(id__in=result_ids).order_by("-publish_time") def destroy(self, request, pk=None, *args, **kwargs): try: @@ -278,7 +322,9 @@ class JobAdViewSet(ModelViewSet): def get_queryset(self): if self.request.user.is_authenticated: return JobAd.objects.filter(deleted=False) - return JobAd.objects.filter(deleted=False, visible=True, autohide_at__gt=timezone.now()) + return JobAd.objects.filter( + deleted=False, visible=True, autohide_at__gt=timezone.now() + ) def destroy(self, request, pk=None, *args, **kwargs): try: @@ -298,17 +344,16 @@ def about_view(request, *args, **kwargs): latest_tag = "Not found" try: repo = git.init_repo() - latest_commit = repo.git("rev-parse HEAD").decode('utf-8') - latest_date = repo.git("show -s --format=%ci " + latest_commit).decode('utf-8') - latest_tag = repo.git("describe --tags " + repo.git("rev-list --tags --max-count=1").decode('utf-8')).decode('utf-8') + latest_commit = repo.git("rev-parse HEAD").decode("utf-8") + latest_date = repo.git("show -s --format=%ci " + latest_commit).decode("utf-8") + latest_tag = repo.git( + "describe --tags " + + repo.git("rev-list --tags --max-count=1").decode("utf-8") + ).decode("utf-8") except Exception as e: print(f"Git failed:\n{e}") - context = { - 'commit': latest_commit, - 'date': latest_date, - 'tag': latest_tag - } + context = {"commit": latest_commit, "date": latest_date, "tag": latest_tag} return render(request, "about.html", context) @@ -321,7 +366,7 @@ def nginx_jwt_resp(request, *args, **kwargs): token = decode(cookie, settings.SECRET_KEY) except InvalidSignatureError: return HttpResponse("", status=403) - user = 'admin' if token.get('username', '') == 'admin' else 'moderator' + user = "admin" if token.get("username", "") == "admin" else "moderator" resp = HttpResponse("", status=200) - resp['X-FBrowser-User'] = user + resp["X-FBrowser-User"] = user return resp