format files with black
This commit is contained in:
+9
-2
@@ -2,8 +2,15 @@
|
|||||||
|
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from infoscreen.models import (
|
from infoscreen.models import (
|
||||||
Rotation, InfoItem, InfoInstance, ImageInfoItem,
|
Rotation,
|
||||||
ExternalImageInfoItem, ABBInfoItem, ExternalWebsiteInfoItem, VideoInfoItem)
|
InfoItem,
|
||||||
|
InfoInstance,
|
||||||
|
ImageInfoItem,
|
||||||
|
ExternalImageInfoItem,
|
||||||
|
ABBInfoItem,
|
||||||
|
ExternalWebsiteInfoItem,
|
||||||
|
VideoInfoItem,
|
||||||
|
)
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
admin.site.register(Rotation)
|
admin.site.register(Rotation)
|
||||||
|
|||||||
+1
-1
@@ -6,4 +6,4 @@ from django.apps import AppConfig
|
|||||||
class InfoscreenConfig(AppConfig):
|
class InfoscreenConfig(AppConfig):
|
||||||
"""Infoscreen app configuration."""
|
"""Infoscreen app configuration."""
|
||||||
|
|
||||||
name = 'infoscreen'
|
name = "infoscreen"
|
||||||
|
|||||||
@@ -11,81 +11,173 @@ class Migration(migrations.Migration):
|
|||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('contenttypes', '0002_remove_content_type_name'),
|
("contenttypes", "0002_remove_content_type_name"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='HSLDataModel',
|
name="HSLDataModel",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='InfoInstance',
|
name="InfoInstance",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('duration', models.FloatField(default=15.0)),
|
"id",
|
||||||
('item_id', models.PositiveIntegerField()),
|
models.AutoField(
|
||||||
('item_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')),
|
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(
|
migrations.CreateModel(
|
||||||
name='InfoItem',
|
name="InfoItem",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('name', models.CharField(max_length=255)),
|
"id",
|
||||||
('expire_date', models.DateTimeField(blank=True, null=True)),
|
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(
|
migrations.CreateModel(
|
||||||
name='Rotation',
|
name="Rotation",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='ABBInfoItem',
|
name="ABBInfoItem",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='ExternalImageInfoItem',
|
name="ExternalImageInfoItem",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='HslInfoItem',
|
name="HslInfoItem",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='ImageInfoItem',
|
name="ImageInfoItem",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='SossoInfoItem',
|
name="SossoInfoItem",
|
||||||
fields=[
|
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(
|
migrations.AddField(
|
||||||
model_name='infoinstance',
|
model_name="infoinstance",
|
||||||
name='rotation',
|
name="rotation",
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='instances', to='infoscreen.Rotation'),
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
related_name="instances",
|
||||||
|
to="infoscreen.Rotation",
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,15 +9,25 @@ import django.db.models.deletion
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('infoscreen', '0001_initial'),
|
("infoscreen", "0001_initial"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='CoffeeInfoItem',
|
name="CoffeeInfoItem",
|
||||||
fields=[
|
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",),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,33 +9,63 @@ import django.db.models.deletion
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('infoscreen', '0002_coffeeinfoitem'),
|
("infoscreen", "0002_coffeeinfoitem"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='ApyInfoItem',
|
name="ApyInfoItem",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='EventInfoItem',
|
name="EventInfoItem",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='ExternalWebsiteInfoItem',
|
name="ExternalWebsiteInfoItem",
|
||||||
fields=[
|
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(
|
migrations.DeleteModel(
|
||||||
name='CoffeeInfoItem',
|
name="CoffeeInfoItem",
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,16 +9,26 @@ import django.db.models.deletion
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('infoscreen', '0003_auto_20170329_1857'),
|
("infoscreen", "0003_auto_20170329_1857"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='VideoInfoItem',
|
name="VideoInfoItem",
|
||||||
fields=[
|
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",),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,18 +8,18 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('infoscreen', '0004_videoinfoitem'),
|
("infoscreen", "0004_videoinfoitem"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='externalimageinfoitem',
|
model_name="externalimageinfoitem",
|
||||||
name='url',
|
name="url",
|
||||||
field=models.URLField(),
|
field=models.URLField(),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='externalwebsiteinfoitem',
|
model_name="externalwebsiteinfoitem",
|
||||||
name='url',
|
name="url",
|
||||||
field=models.URLField(),
|
field=models.URLField(),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,14 +8,14 @@ from django.db import migrations
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('infoscreen', '0005_auto_20170913_1841'),
|
("infoscreen", "0005_auto_20170913_1841"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='HSLDataModel',
|
name="HSLDataModel",
|
||||||
),
|
),
|
||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='HslInfoItem',
|
name="HslInfoItem",
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -7,15 +7,25 @@ import django.db.models.deletion
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('infoscreen', '0006_delete_hsldatamodel'),
|
("infoscreen", "0006_delete_hsldatamodel"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='LunchItem',
|
name="LunchItem",
|
||||||
fields=[
|
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",),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
+46
-53
@@ -23,14 +23,14 @@ class InfoItem(models.Model):
|
|||||||
|
|
||||||
def get_template_url(self):
|
def get_template_url(self):
|
||||||
"""Get infoscreen template url."""
|
"""Get infoscreen template url."""
|
||||||
raise NotImplementedError(
|
raise NotImplementedError("inheriting classes must implement get_template_url")
|
||||||
"inheriting classes must implement get_template_url")
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_create_template_url():
|
def get_create_template_url():
|
||||||
"""Get create infoscreen template url command."""
|
"""Get create infoscreen template url command."""
|
||||||
raise NotImplementedError(
|
raise NotImplementedError(
|
||||||
"inheriting classes must implement get_create_template_url")
|
"inheriting classes must implement get_create_template_url"
|
||||||
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_from_dict(cls, d):
|
def create_from_dict(cls, d):
|
||||||
@@ -42,14 +42,13 @@ class InfoItem(models.Model):
|
|||||||
def update_from_dict(self, d):
|
def update_from_dict(self, d):
|
||||||
"""Update model based on given dict."""
|
"""Update model based on given dict."""
|
||||||
try:
|
try:
|
||||||
expire_date = d.pop('expire_date', None)
|
expire_date = d.pop("expire_date", None)
|
||||||
self.expire_date = datetime.strptime(
|
self.expire_date = datetime.strptime(expire_date, "%Y-%m-%d %H:%M:%S")
|
||||||
expire_date, "%Y-%m-%d %H:%M:%S")
|
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
dmap = {
|
dmap = {
|
||||||
'name': 'name',
|
"name": "name",
|
||||||
}
|
}
|
||||||
for k, v in d.items():
|
for k, v in d.items():
|
||||||
try:
|
try:
|
||||||
@@ -61,13 +60,13 @@ class InfoItem(models.Model):
|
|||||||
def get_dict(self):
|
def get_dict(self):
|
||||||
"""Convert django model to dict and return it."""
|
"""Convert django model to dict and return it."""
|
||||||
return {
|
return {
|
||||||
'id': self.id,
|
"id": self.id,
|
||||||
'name': self.name,
|
"name": self.name,
|
||||||
'item_type': ContentType.objects.get_for_model(self).id,
|
"item_type": ContentType.objects.get_for_model(self).id,
|
||||||
'template_url': self.get_template_url(),
|
"template_url": self.get_template_url(),
|
||||||
'display_name': self.display_name,
|
"display_name": self.display_name,
|
||||||
'create_template_url': self.get_create_template_url(),
|
"create_template_url": self.get_create_template_url(),
|
||||||
'options': {}
|
"options": {},
|
||||||
}
|
}
|
||||||
|
|
||||||
def delete(self):
|
def delete(self):
|
||||||
@@ -75,8 +74,8 @@ class InfoItem(models.Model):
|
|||||||
# since generic foreign keys suck, delete info
|
# since generic foreign keys suck, delete info
|
||||||
# items pointing here manually
|
# items pointing here manually
|
||||||
InfoInstance.objects.filter(
|
InfoInstance.objects.filter(
|
||||||
item_id=self.id,
|
item_id=self.id, item_type=ContentType.objects.get_for_model(self)
|
||||||
item_type=ContentType.objects.get_for_model(self)).delete()
|
).delete()
|
||||||
super().delete()
|
super().delete()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -139,7 +138,7 @@ class ExternalWebsiteInfoItem(InfoItem):
|
|||||||
def get_dict(self):
|
def get_dict(self):
|
||||||
"""Convert django model to dict and return it."""
|
"""Convert django model to dict and return it."""
|
||||||
d = super().get_dict()
|
d = super().get_dict()
|
||||||
d["options"] = {'url': self.url}
|
d["options"] = {"url": self.url}
|
||||||
return d
|
return d
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -152,23 +151,22 @@ class ExternalWebsiteInfoItem(InfoItem):
|
|||||||
def get_list(self):
|
def get_list(self):
|
||||||
"""Return list containing infoitem data."""
|
"""Return list containing infoitem data."""
|
||||||
return {
|
return {
|
||||||
'id': self.id,
|
"id": self.id,
|
||||||
'name': self.name,
|
"name": self.name,
|
||||||
'url': self.url,
|
"url": self.url,
|
||||||
}
|
}
|
||||||
|
|
||||||
def update_from_dict(self, d):
|
def update_from_dict(self, d):
|
||||||
"""Update model based on given dict."""
|
"""Update model based on given dict."""
|
||||||
try:
|
try:
|
||||||
expire_date = d.pop('expire_date', None)
|
expire_date = d.pop("expire_date", None)
|
||||||
self.expire_date = datetime.strptime(
|
self.expire_date = datetime.strptime(expire_date, "%Y-%m-%d %H:%M:%S")
|
||||||
expire_date, "%Y-%m-%d %H:%M:%S")
|
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
dmap = {
|
dmap = {
|
||||||
'name': 'name',
|
"name": "name",
|
||||||
'url': 'url',
|
"url": "url",
|
||||||
}
|
}
|
||||||
for k, v in d.items():
|
for k, v in d.items():
|
||||||
try:
|
try:
|
||||||
@@ -241,14 +239,14 @@ class ImageInfoItem(InfoItem):
|
|||||||
def get_dict(self):
|
def get_dict(self):
|
||||||
"""Convert django model to dict and return it."""
|
"""Convert django model to dict and return it."""
|
||||||
d = super().get_dict()
|
d = super().get_dict()
|
||||||
d["options"] = {'img': self.img.url}
|
d["options"] = {"img": self.img.url}
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
||||||
class VideoInfoItem(InfoItem):
|
class VideoInfoItem(InfoItem):
|
||||||
"""Class for Video Infoscreen item."""
|
"""Class for Video Infoscreen item."""
|
||||||
|
|
||||||
display_name = ("Video")
|
display_name = "Video"
|
||||||
video = models.FileField(upload_to="infovideos/")
|
video = models.FileField(upload_to="infovideos/")
|
||||||
|
|
||||||
def get_template_url(self):
|
def get_template_url(self):
|
||||||
@@ -263,7 +261,7 @@ class VideoInfoItem(InfoItem):
|
|||||||
def get_dict(self):
|
def get_dict(self):
|
||||||
"""Convert django model to dict and return it."""
|
"""Convert django model to dict and return it."""
|
||||||
d = super().get_dict()
|
d = super().get_dict()
|
||||||
d["options"] = {'video': self.video.url}
|
d["options"] = {"video": self.video.url}
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
||||||
@@ -285,7 +283,7 @@ class ExternalImageInfoItem(InfoItem):
|
|||||||
def get_dict(self):
|
def get_dict(self):
|
||||||
"""Convert django model to dict and return it."""
|
"""Convert django model to dict and return it."""
|
||||||
d = super().get_dict()
|
d = super().get_dict()
|
||||||
d["options"] = {'img': self.url}
|
d["options"] = {"img": self.url}
|
||||||
return d
|
return d
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -298,15 +296,14 @@ class ExternalImageInfoItem(InfoItem):
|
|||||||
def update_from_dict(self, d):
|
def update_from_dict(self, d):
|
||||||
"""Update model based on given dict."""
|
"""Update model based on given dict."""
|
||||||
try:
|
try:
|
||||||
expire_date = d.pop('expire_date', None)
|
expire_date = d.pop("expire_date", None)
|
||||||
self.expire_date = datetime.strptime(
|
self.expire_date = datetime.strptime(expire_date, "%Y-%m-%d %H:%M:%S")
|
||||||
expire_date, "%Y-%m-%d %H:%M:%S")
|
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
dmap = {
|
dmap = {
|
||||||
'name': 'name',
|
"name": "name",
|
||||||
'url': 'url',
|
"url": "url",
|
||||||
}
|
}
|
||||||
for k, v in d.items():
|
for k, v in d.items():
|
||||||
try:
|
try:
|
||||||
@@ -319,12 +316,14 @@ class ExternalImageInfoItem(InfoItem):
|
|||||||
class InfoInstance(models.Model):
|
class InfoInstance(models.Model):
|
||||||
"""Class for Info instance in Infoscreen."""
|
"""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
|
duration = models.FloatField(default=15.0) # seconds
|
||||||
# generic relation to some kind of InfoItem
|
# generic relation to some kind of InfoItem
|
||||||
item_id = models.PositiveIntegerField()
|
item_id = models.PositiveIntegerField()
|
||||||
item_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
|
item_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
|
||||||
item = GenericForeignKey('item_type', 'item_id')
|
item = GenericForeignKey("item_type", "item_id")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_from_dict(cls, d):
|
def create_from_dict(cls, d):
|
||||||
@@ -337,26 +336,21 @@ class InfoInstance(models.Model):
|
|||||||
except:
|
except:
|
||||||
raise RuntimeError("invalid parameters supplied supplied")
|
raise RuntimeError("invalid parameters supplied supplied")
|
||||||
try:
|
try:
|
||||||
return cls.objects.create(
|
return cls.objects.create(rotation=rotation, item=item, duration=duration)
|
||||||
rotation=rotation,
|
|
||||||
item=item,
|
|
||||||
duration=duration
|
|
||||||
)
|
|
||||||
except:
|
except:
|
||||||
raise RuntimeError("error while adding instance to db")
|
raise RuntimeError("error while adding instance to db")
|
||||||
|
|
||||||
def get_dict(self):
|
def get_dict(self):
|
||||||
"""Convert django model to dict and return it."""
|
"""Convert django model to dict and return it."""
|
||||||
return {
|
return {
|
||||||
'id': self.id,
|
"id": self.id,
|
||||||
'item': self.item.get_dict(),
|
"item": self.item.get_dict(),
|
||||||
'duration': self.duration,
|
"duration": self.duration,
|
||||||
}
|
}
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
"""Return model name."""
|
"""Return model name."""
|
||||||
return "{}: {} ({}s)".format(
|
return "{}: {} ({}s)".format(self.rotation.name, self.item.name, self.duration)
|
||||||
self.rotation.name, self.item.name, self.duration)
|
|
||||||
|
|
||||||
|
|
||||||
class Rotation(models.Model):
|
class Rotation(models.Model):
|
||||||
@@ -370,21 +364,20 @@ class Rotation(models.Model):
|
|||||||
# to avoid excluding items with no expire_date)
|
# to avoid excluding items with no expire_date)
|
||||||
now = timezone.now()
|
now = timezone.now()
|
||||||
instances = self.instances.all()
|
instances = self.instances.all()
|
||||||
filtered = filter(lambda i: (i.item.expire_date or now) >= now,
|
filtered = filter(lambda i: (i.item.expire_date or now) >= now, list(instances))
|
||||||
list(instances))
|
|
||||||
instance_list = list(map(lambda i: i.get_dict(), filtered))
|
instance_list = list(map(lambda i: i.get_dict(), filtered))
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'id': self.id,
|
"id": self.id,
|
||||||
'name': self.name,
|
"name": self.name,
|
||||||
'instances': instance_list,
|
"instances": instance_list,
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_list(self):
|
def get_list(self):
|
||||||
"""Return list containing infoitem data."""
|
"""Return list containing infoitem data."""
|
||||||
return {
|
return {
|
||||||
'id': self.id,
|
"id": self.id,
|
||||||
'name': self.name,
|
"name": self.name,
|
||||||
}
|
}
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|||||||
+1
-1
@@ -35,6 +35,6 @@ class InfoscreenTestCase(TestCase):
|
|||||||
That would mean that something meaningful has been included
|
That would mean that something meaningful has been included
|
||||||
in the response.
|
in the response.
|
||||||
"""
|
"""
|
||||||
resp = self.c.get('/infoscreen/items')
|
resp = self.c.get("/infoscreen/items")
|
||||||
content = resp.json()
|
content = resp.json()
|
||||||
self.assertTrue(len(content) > 0)
|
self.assertTrue(len(content) > 0)
|
||||||
|
|||||||
+23
-22
@@ -27,30 +27,31 @@ from infoscreen.views import createApyItem
|
|||||||
from infoscreen.views import get_apy_json
|
from infoscreen.views import get_apy_json
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^$', default),
|
url(r"^$", default),
|
||||||
url(r'^admin$', admin),
|
url(r"^admin$", admin),
|
||||||
url(r'^(?P<idx>\d+)$', index),
|
url(r"^(?P<idx>\d+)$", index),
|
||||||
url(r'^items$', info_items),
|
url(r"^items$", info_items),
|
||||||
url(r'^rotation/(?P<idx>\d+)$', rotation),
|
url(r"^rotation/(?P<idx>\d+)$", rotation),
|
||||||
url(r'^rotations$', rotations),
|
url(r"^rotations$", rotations),
|
||||||
url(r'^instance$', createInstance),
|
url(r"^instance$", createInstance),
|
||||||
url(r'^instance/(?P<idx>\d+)$', deleteInstance),
|
url(r"^instance/(?P<idx>\d+)$", deleteInstance),
|
||||||
url(r'^types$', info_types),
|
url(r"^types$", info_types),
|
||||||
url(r'^delete_item/(?P<type_id>\d+)/(?P<idx>\d+)$', delete_info_item),
|
url(r"^delete_item/(?P<type_id>\d+)/(?P<idx>\d+)$", delete_info_item),
|
||||||
url(r'^create_external_image$', createExternalImageInfoItem),
|
url(r"^create_external_image$", createExternalImageInfoItem),
|
||||||
url(r'^create_image$', create_image_item),
|
url(r"^create_image$", create_image_item),
|
||||||
url(r'^create_video$', create_video_item),
|
url(r"^create_video$", create_video_item),
|
||||||
url(r'^create_abbitem$', createABBItem),
|
url(r"^create_abbitem$", createABBItem),
|
||||||
url(r'^create_sossoitem$', createSossoItem),
|
url(r"^create_sossoitem$", createSossoItem),
|
||||||
url(r'^create_lunchitem$', createLunchItem),
|
url(r"^create_lunchitem$", createLunchItem),
|
||||||
url(r'^create_eventitem$', createEventItem),
|
url(r"^create_eventitem$", createEventItem),
|
||||||
url(r'^create_apyitem$', createApyItem),
|
url(r"^create_apyitem$", createApyItem),
|
||||||
url(r'^create_websiteitem$', createExternalWebsiteItem),
|
url(r"^create_websiteitem$", createExternalWebsiteItem),
|
||||||
url(r'^create_rotation$', create_rotation),
|
url(r"^create_rotation$", create_rotation),
|
||||||
url(r'^delete_rotation/(?P<id>\d+)$', delete_rotation),
|
url(r"^delete_rotation/(?P<id>\d+)$", delete_rotation),
|
||||||
url(r'^apyjson', get_apy_json),
|
url(r"^apyjson", get_apy_json),
|
||||||
]
|
]
|
||||||
|
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
||||||
|
|
||||||
urlpatterns += staticfiles_urlpatterns()
|
urlpatterns += staticfiles_urlpatterns()
|
||||||
|
|||||||
@@ -16,16 +16,27 @@ import threading
|
|||||||
import requests
|
import requests
|
||||||
|
|
||||||
from infoscreen.models import (
|
from infoscreen.models import (
|
||||||
Rotation, InfoItem, InfoInstance, ABBInfoItem, ExternalImageInfoItem,
|
Rotation,
|
||||||
ImageInfoItem, SossoInfoItem, LunchItem, EventInfoItem,
|
InfoItem,
|
||||||
ExternalWebsiteInfoItem, ImageUploadForm, ApyInfoItem, VideoInfoItem)
|
InfoInstance,
|
||||||
|
ABBInfoItem,
|
||||||
|
ExternalImageInfoItem,
|
||||||
|
ImageInfoItem,
|
||||||
|
SossoInfoItem,
|
||||||
|
LunchItem,
|
||||||
|
EventInfoItem,
|
||||||
|
ExternalWebsiteInfoItem,
|
||||||
|
ImageUploadForm,
|
||||||
|
ApyInfoItem,
|
||||||
|
VideoInfoItem,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('infoscreen.change_infoinstance', raise_exception=True)
|
@permission_required("infoscreen.change_infoinstance", raise_exception=True)
|
||||||
def admin(request, *args, **kwargs):
|
def admin(request, *args, **kwargs):
|
||||||
"""Render infoscreen admin page."""
|
"""Render infoscreen admin page."""
|
||||||
return render(request, 'infoscreen:infoscreen_admin.html', {})
|
return render(request, "infoscreen:infoscreen_admin.html", {})
|
||||||
|
|
||||||
|
|
||||||
def create_item_generator(model):
|
def create_item_generator(model):
|
||||||
@@ -33,20 +44,23 @@ def create_item_generator(model):
|
|||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('infoscreen.add_infoinstance', raise_exception=True)
|
@permission_required("infoscreen.add_infoinstance", raise_exception=True)
|
||||||
def create_item(request, *args, **kwargs):
|
def create_item(request, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
data = json.loads(request.body.decode("utf-8"))
|
data = json.loads(request.body.decode("utf-8"))
|
||||||
except json.JSONDecodeError:
|
except json.JSONDecodeError:
|
||||||
return HttpResponseBadRequest(
|
return HttpResponseBadRequest(
|
||||||
'{"status":"failure","error":"invalid json supplied"}')
|
'{"status":"failure","error":"invalid json supplied"}'
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
model.create_from_dict(data)
|
model.create_from_dict(data)
|
||||||
return HttpResponse('{"status":"success"}')
|
return HttpResponse('{"status":"success"}')
|
||||||
except RuntimeError as e:
|
except RuntimeError as e:
|
||||||
return HttpResponseBadRequest(
|
return HttpResponseBadRequest(
|
||||||
json.dumps({"status": "failure", "error": str(e)}))
|
json.dumps({"status": "failure", "error": str(e)})
|
||||||
|
)
|
||||||
|
|
||||||
return create_item
|
return create_item
|
||||||
|
|
||||||
|
|
||||||
@@ -55,8 +69,8 @@ def delete_item_generator(model):
|
|||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["DELETE"])
|
@require_http_methods(["DELETE"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('infoscreen.delete_infoinstance', raise_exception=True)
|
@permission_required("infoscreen.delete_infoinstance", raise_exception=True)
|
||||||
def delete_item(request, *args, **kwargs):
|
def delete_item(request, *args, **kwargs):
|
||||||
idx = kwargs.pop("idx", 0)
|
idx = kwargs.pop("idx", 0)
|
||||||
try:
|
try:
|
||||||
@@ -72,13 +86,14 @@ def delete_item_generator(model):
|
|||||||
resp = HttpResponse('{"error" : "could not delete item"}')
|
resp = HttpResponse('{"error" : "could not delete item"}')
|
||||||
resp.status_code = 500
|
resp.status_code = 500
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
return delete_item
|
return delete_item
|
||||||
|
|
||||||
|
|
||||||
# due to model structure this is little complicated
|
# due to model structure this is little complicated
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('infoscreen.delete_infoinstance', raise_exception=True)
|
@permission_required("infoscreen.delete_infoinstance", raise_exception=True)
|
||||||
@require_http_methods(["DELETE"])
|
@require_http_methods(["DELETE"])
|
||||||
def delete_info_item(request, *args, **kwargs):
|
def delete_info_item(request, *args, **kwargs):
|
||||||
"""Delete info item."""
|
"""Delete info item."""
|
||||||
@@ -102,42 +117,44 @@ def delete_info_item(request, *args, **kwargs):
|
|||||||
|
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('infoscreen.add_infoinstance', raise_exception=True)
|
@permission_required("infoscreen.add_infoinstance", raise_exception=True)
|
||||||
def create_image_item(request, *args, **kwargs):
|
def create_image_item(request, *args, **kwargs):
|
||||||
"""Create image Infoscreen item."""
|
"""Create image Infoscreen item."""
|
||||||
form = ImageUploadForm(request.POST, request.FILES)
|
form = ImageUploadForm(request.POST, request.FILES)
|
||||||
if not form.is_valid():
|
if not form.is_valid():
|
||||||
return HttpResponseBadRequest('{"status": "failure",'
|
return HttpResponseBadRequest(
|
||||||
'"error": "invalid data supplied"}')
|
'{"status": "failure",' '"error": "invalid data supplied"}'
|
||||||
|
)
|
||||||
|
|
||||||
img = form.cleaned_data['image']
|
img = form.cleaned_data["image"]
|
||||||
name = form.cleaned_data['name']
|
name = form.cleaned_data["name"]
|
||||||
ImageInfoItem.objects.create(img=img, name=name)
|
ImageInfoItem.objects.create(img=img, name=name)
|
||||||
return HttpResponse('{"status":"success"}')
|
return HttpResponse('{"status":"success"}')
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('infoscreen.add_infoinstance', raise_exception=True)
|
@permission_required("infoscreen.add_infoinstance", raise_exception=True)
|
||||||
def create_video_item(request, *args, **kwargs):
|
def create_video_item(request, *args, **kwargs):
|
||||||
"""Create video Infoscreen item."""
|
"""Create video Infoscreen item."""
|
||||||
form = UploadFileForm(request.POST, request.FILES)
|
form = UploadFileForm(request.POST, request.FILES)
|
||||||
if not form.is_valid():
|
if not form.is_valid():
|
||||||
return HttpResponseBadRequest('{"status": "failure",'
|
return HttpResponseBadRequest(
|
||||||
'"error": "invalid data supplied"}')
|
'{"status": "failure",' '"error": "invalid data supplied"}'
|
||||||
|
)
|
||||||
|
|
||||||
video = form.cleaned_data['video']
|
video = form.cleaned_data["video"]
|
||||||
name = form.cleaned_data['name']
|
name = form.cleaned_data["name"]
|
||||||
VideoInfoItem.objects.create(video=video, name=name)
|
VideoInfoItem.objects.create(video=video, name=name)
|
||||||
return HttpResponse('{"status": "success"}')
|
return HttpResponse('{"status": "success"}')
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('infoscreen.add_rotation', raise_exception=True)
|
@permission_required("infoscreen.add_rotation", raise_exception=True)
|
||||||
def create_rotation(request, *args, **kwargs):
|
def create_rotation(request, *args, **kwargs):
|
||||||
"""Create rotation."""
|
"""Create rotation."""
|
||||||
try:
|
try:
|
||||||
@@ -150,16 +167,15 @@ def create_rotation(request, *args, **kwargs):
|
|||||||
Rotation.objects.create(name=name)
|
Rotation.objects.create(name=name)
|
||||||
resp = HttpResponse(status=200)
|
resp = HttpResponse(status=200)
|
||||||
except DatabaseError:
|
except DatabaseError:
|
||||||
resp = HttpResponse(
|
resp = HttpResponse('{"error" : "could not create rotation!"}', status=400)
|
||||||
'{"error" : "could not create rotation!"}', status=400)
|
|
||||||
|
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(["DELETE"])
|
@require_http_methods(["DELETE"])
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('infoscreen.delete_rotation', raise_exception=True)
|
@permission_required("infoscreen.delete_rotation", raise_exception=True)
|
||||||
def delete_rotation(request, *args, **kwargs):
|
def delete_rotation(request, *args, **kwargs):
|
||||||
"""Delete rotation."""
|
"""Delete rotation."""
|
||||||
id = kwargs.pop("id", 0)
|
id = kwargs.pop("id", 0)
|
||||||
@@ -169,8 +185,7 @@ def delete_rotation(request, *args, **kwargs):
|
|||||||
Rotation.objects.filter(id=id).delete()
|
Rotation.objects.filter(id=id).delete()
|
||||||
resp = HttpResponse(status=200)
|
resp = HttpResponse(status=200)
|
||||||
except DatabaseError:
|
except DatabaseError:
|
||||||
resp = HttpResponse(
|
resp = HttpResponse('{"error" : "could not delete rotation!"}', status=400)
|
||||||
'{"error" : "could not delete rotation!"}', status=400)
|
|
||||||
|
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import requests
|
|||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
def index(request, idx, *args, **kwargs):
|
def index(request, idx, *args, **kwargs):
|
||||||
"""Render infoscreen index page."""
|
"""Render infoscreen index page."""
|
||||||
return render(request, 'infoscreen_index.html', {'rotation': idx})
|
return render(request, "infoscreen_index.html", {"rotation": idx})
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@@ -32,7 +32,8 @@ def default(request, *args, **kwargs):
|
|||||||
def get_apy_json(request):
|
def get_apy_json(request):
|
||||||
"""Render APY diilikone page."""
|
"""Render APY diilikone page."""
|
||||||
return HttpResponse(
|
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"])
|
@require_http_methods(["GET"])
|
||||||
@@ -61,10 +62,12 @@ def info_types(request, *args, **kwargs):
|
|||||||
types = []
|
types = []
|
||||||
classes = InfoItem.get_subclasses()
|
classes = InfoItem.get_subclasses()
|
||||||
for c in classes:
|
for c in classes:
|
||||||
types.append({
|
types.append(
|
||||||
"name": c.display_name,
|
{
|
||||||
"create_template_url": c.get_create_template_url(),
|
"name": c.display_name,
|
||||||
})
|
"create_template_url": c.get_create_template_url(),
|
||||||
|
}
|
||||||
|
)
|
||||||
return HttpResponse(json.dumps(types))
|
return HttpResponse(json.dumps(types))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -2,4 +2,4 @@ from django.apps import AppConfig
|
|||||||
|
|
||||||
|
|
||||||
class KaehmyConfig(AppConfig):
|
class KaehmyConfig(AppConfig):
|
||||||
name = 'kaehmy'
|
name = "kaehmy"
|
||||||
|
|||||||
+51
-26
@@ -6,12 +6,16 @@ from kaehmy.models import PresetRole, CustomRole, Application, Comment, KaehmyBa
|
|||||||
|
|
||||||
|
|
||||||
class CheckboxSelectMultiple(forms.widgets.CheckboxSelectMultiple):
|
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):
|
def create_option(
|
||||||
dic = super(CheckboxSelectMultiple, self).create_option(name, value, label, selected, index, subindex, attrs)
|
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
|
description = PresetRole.objects.get(id=value).description
|
||||||
dic['description'] = description
|
dic["description"] = description
|
||||||
return dic
|
return dic
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
@@ -25,30 +29,46 @@ class ApplicationForm(forms.ModelForm):
|
|||||||
"""Meta for class Application."""
|
"""Meta for class Application."""
|
||||||
|
|
||||||
model = Application
|
model = Application
|
||||||
fields = ['name', 'email', 'phone_number', 'year',
|
fields = [
|
||||||
'preset_roles', 'custom_roles', 'custom_role_name',
|
"name",
|
||||||
'custom_role_is_board', 'text']
|
"email",
|
||||||
|
"phone_number",
|
||||||
|
"year",
|
||||||
|
"preset_roles",
|
||||||
|
"custom_roles",
|
||||||
|
"custom_role_name",
|
||||||
|
"custom_role_is_board",
|
||||||
|
"text",
|
||||||
|
]
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(ApplicationForm, self).__init__(*args, **kwargs)
|
super(ApplicationForm, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
self.fields["email"].label = _('Email (not public)')
|
self.fields["email"].label = _("Email (not public)")
|
||||||
self.fields["phone_number"].label = _('Phone number (not public)')
|
self.fields["phone_number"].label = _("Phone number (not public)")
|
||||||
|
|
||||||
custom_roles_exist = CustomRole.objects.all().exists()
|
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"].help_text = ""
|
||||||
self.fields["custom_roles"].label = _('Custom roles')
|
self.fields["custom_roles"].label = _("Custom roles")
|
||||||
self.fields["custom_roles"].queryset = CustomRole.objects.all()
|
self.fields["custom_roles"].queryset = CustomRole.objects.all()
|
||||||
|
|
||||||
for cat_id, category in KaehmyBaseRole.CATEGORIES:
|
for cat_id, category in KaehmyBaseRole.CATEGORIES:
|
||||||
key = 'preset_roles_{}'.format(cat_id)
|
key = "preset_roles_{}".format(cat_id)
|
||||||
qset = PresetRole.objects.filter(category=cat_id).order_by('category', '-is_board')
|
qset = PresetRole.objects.filter(category=cat_id).order_by(
|
||||||
|
"category", "-is_board"
|
||||||
|
)
|
||||||
self.fields[key] = forms.ModelMultipleChoiceField(qset)
|
self.fields[key] = forms.ModelMultipleChoiceField(qset)
|
||||||
self.fields[key].widget = CheckboxSelectMultiple(attrs={
|
self.fields[key].widget = CheckboxSelectMultiple(
|
||||||
'title': _('Preset roles'),
|
attrs={
|
||||||
'name': 'preset_roles',
|
"title": _("Preset roles"),
|
||||||
})
|
"name": "preset_roles",
|
||||||
|
}
|
||||||
|
)
|
||||||
self.fields[key].help_text = ""
|
self.fields[key].help_text = ""
|
||||||
self.fields[key].queryset = qset
|
self.fields[key].queryset = qset
|
||||||
self.fields[key].label = _(category)
|
self.fields[key].label = _(category)
|
||||||
@@ -57,33 +77,38 @@ class ApplicationForm(forms.ModelForm):
|
|||||||
def clean(self):
|
def clean(self):
|
||||||
cleaned_data = super(ApplicationForm, self).clean()
|
cleaned_data = super(ApplicationForm, self).clean()
|
||||||
for key in cleaned_data.keys():
|
for key in cleaned_data.keys():
|
||||||
if 'preset_roles_' in key:
|
if "preset_roles_" in key:
|
||||||
cleaned_data['preset_roles'] = cleaned_data['preset_roles'] | cleaned_data[key]
|
cleaned_data["preset_roles"] = (
|
||||||
|
cleaned_data["preset_roles"] | cleaned_data[key]
|
||||||
|
)
|
||||||
|
|
||||||
return cleaned_data
|
return cleaned_data
|
||||||
|
|
||||||
def clean_phone_number(self):
|
def clean_phone_number(self):
|
||||||
"""Clean phone number field."""
|
"""Clean phone number field."""
|
||||||
number = self.cleaned_data.get('phone_number')
|
number = self.cleaned_data.get("phone_number")
|
||||||
if number.isdigit():
|
if number.isdigit():
|
||||||
return number
|
return number
|
||||||
else:
|
else:
|
||||||
raise ValidationError(_('Invalid phone number'))
|
raise ValidationError(_("Invalid phone number"))
|
||||||
|
|
||||||
def clean_custom_role_name(self):
|
def clean_custom_role_name(self):
|
||||||
"""Check that no other custom role with same name exists."""
|
"""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():
|
if not CustomRole.objects.filter(name=custom_name).exists():
|
||||||
return custom_name
|
return custom_name
|
||||||
else:
|
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):
|
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 CommentForm(forms.ModelForm):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Comment
|
model = Comment
|
||||||
fields = ['name', 'email', 'message', 'parent']
|
fields = ["name", "email", "message", "parent"]
|
||||||
|
|||||||
@@ -12,82 +12,188 @@ class Migration(migrations.Migration):
|
|||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0037_auto_20180125_2131'),
|
("webapp", "0037_auto_20180125_2131"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='CommentParent',
|
name="CommentParent",
|
||||||
fields=[
|
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')),
|
"id",
|
||||||
('email', models.EmailField(default='', max_length=254, verbose_name='Email')),
|
models.AutoField(
|
||||||
('timestamp', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Timestamp')),
|
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(
|
migrations.CreateModel(
|
||||||
name='CustomRole',
|
name="CustomRole",
|
||||||
fields=[
|
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={
|
options={
|
||||||
'verbose_name_plural': 'Custom kaehmy roles',
|
"verbose_name_plural": "Custom kaehmy roles",
|
||||||
'verbose_name': 'Custom kaehmy role',
|
"verbose_name": "Custom kaehmy role",
|
||||||
},
|
},
|
||||||
bases=('webapp.baserole',),
|
bases=("webapp.baserole",),
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='PresetRole',
|
name="PresetRole",
|
||||||
fields=[
|
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={
|
options={
|
||||||
'verbose_name_plural': 'Preset kaehmy roles',
|
"verbose_name_plural": "Preset kaehmy roles",
|
||||||
'verbose_name': 'Preset kaehmy role',
|
"verbose_name": "Preset kaehmy role",
|
||||||
},
|
},
|
||||||
bases=('webapp.presetrole',),
|
bases=("webapp.presetrole",),
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='TelegramChannel',
|
name="TelegramChannel",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('name', models.CharField(max_length=255)),
|
"id",
|
||||||
('channel_id', models.CharField(max_length=255, unique=True)),
|
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={
|
options={
|
||||||
'verbose_name_plural': 'Telegram channels',
|
"verbose_name_plural": "Telegram channels",
|
||||||
'verbose_name': 'Telegram channel',
|
"verbose_name": "Telegram channel",
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Application',
|
name="Application",
|
||||||
fields=[
|
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')),
|
"commentparent_ptr",
|
||||||
('year', models.IntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, 'N')], verbose_name='Year')),
|
models.OneToOneField(
|
||||||
('text', models.TextField(default='', max_length=300, verbose_name='Text')),
|
auto_created=True,
|
||||||
('custom_role_name', models.CharField(blank=True, max_length=255, verbose_name='Custom role name')),
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
('custom_role_is_board', models.BooleanField(verbose_name='Board member')),
|
parent_link=True,
|
||||||
('custom_roles', models.ManyToManyField(blank=True, related_name='forms', to='kaehmy.CustomRole')),
|
primary_key=True,
|
||||||
('preset_roles', models.ManyToManyField(blank=True, related_name='forms', to='kaehmy.PresetRole')),
|
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={
|
options={
|
||||||
'verbose_name_plural': 'Kaehmylomakkeet',
|
"verbose_name_plural": "Kaehmylomakkeet",
|
||||||
'verbose_name': 'Kaehmylomake',
|
"verbose_name": "Kaehmylomake",
|
||||||
},
|
},
|
||||||
bases=('kaehmy.commentparent',),
|
bases=("kaehmy.commentparent",),
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Comment',
|
name="Comment",
|
||||||
fields=[
|
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')),
|
"commentparent_ptr",
|
||||||
('parent', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='kaehmy.CommentParent')),
|
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={
|
options={
|
||||||
'verbose_name_plural': 'Kaehmykommentit',
|
"verbose_name_plural": "Kaehmykommentit",
|
||||||
'verbose_name': 'Kaehmykommentti',
|
"verbose_name": "Kaehmykommentti",
|
||||||
},
|
},
|
||||||
bases=('kaehmy.commentparent',),
|
bases=("kaehmy.commentparent",),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -7,26 +7,59 @@ import django.db.models.deletion
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0047_auto_20180710_2110'),
|
("webapp", "0047_auto_20180710_2110"),
|
||||||
('kaehmy', '0001_initial'),
|
("kaehmy", "0001_initial"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='KaehmyBaseRole',
|
name="KaehmyBaseRole",
|
||||||
fields=[
|
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(
|
migrations.DeleteModel(
|
||||||
name='Application',
|
name="Application",
|
||||||
),
|
),
|
||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='customrole',
|
name="customrole",
|
||||||
),
|
),
|
||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='presetrole',
|
name="presetrole",
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -7,57 +7,113 @@ import django.db.models.deletion
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('kaehmy', '0002_auto_20180902_1929'),
|
("kaehmy", "0002_auto_20180902_1929"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Application',
|
name="Application",
|
||||||
fields=[
|
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')),
|
"commentparent_ptr",
|
||||||
('year', models.IntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, 'N')], verbose_name='Year')),
|
models.OneToOneField(
|
||||||
('text', models.TextField(default='', max_length=300, verbose_name='Text')),
|
auto_created=True,
|
||||||
('custom_role_name', models.CharField(blank=True, max_length=255, verbose_name='Custom role name')),
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
('custom_role_is_board', models.BooleanField(verbose_name='Board member')),
|
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={
|
options={
|
||||||
'verbose_name': 'Kaehmylomake',
|
"verbose_name": "Kaehmylomake",
|
||||||
'verbose_name_plural': 'Kaehmylomakkeet',
|
"verbose_name_plural": "Kaehmylomakkeet",
|
||||||
},
|
},
|
||||||
bases=('kaehmy.commentparent',),
|
bases=("kaehmy.commentparent",),
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='CustomRole',
|
name="CustomRole",
|
||||||
fields=[
|
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={
|
options={
|
||||||
'verbose_name': 'Custom kaehmy role',
|
"verbose_name": "Custom kaehmy role",
|
||||||
'verbose_name_plural': 'Custom kaehmy roles',
|
"verbose_name_plural": "Custom kaehmy roles",
|
||||||
},
|
},
|
||||||
bases=('kaehmy.kaehmybaserole',),
|
bases=("kaehmy.kaehmybaserole",),
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='PresetRole',
|
name="PresetRole",
|
||||||
fields=[
|
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={
|
options={
|
||||||
'verbose_name': 'Preset kaehmy role',
|
"verbose_name": "Preset kaehmy role",
|
||||||
'verbose_name_plural': 'Preset kaehmy roles',
|
"verbose_name_plural": "Preset kaehmy roles",
|
||||||
},
|
},
|
||||||
bases=('kaehmy.kaehmybaserole',),
|
bases=("kaehmy.kaehmybaserole",),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='application',
|
model_name="application",
|
||||||
name='custom_roles',
|
name="custom_roles",
|
||||||
field=models.ManyToManyField(blank=True, related_name='forms', to='kaehmy.CustomRole'),
|
field=models.ManyToManyField(
|
||||||
|
blank=True, related_name="forms", to="kaehmy.CustomRole"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='application',
|
model_name="application",
|
||||||
name='preset_roles',
|
name="preset_roles",
|
||||||
field=models.ManyToManyField(blank=True, related_name='forms', to='kaehmy.PresetRole'),
|
field=models.ManyToManyField(
|
||||||
|
blank=True, related_name="forms", to="kaehmy.PresetRole"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -6,13 +6,32 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('kaehmy', '0003_auto_20180902_1943'),
|
("kaehmy", "0003_auto_20180902_1943"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='kaehmybaserole',
|
model_name="kaehmybaserole",
|
||||||
name='category',
|
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'),
|
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",
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -6,13 +6,13 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('kaehmy', '0004_auto_20181018_2121'),
|
("kaehmy", "0004_auto_20181018_2121"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='application',
|
model_name="application",
|
||||||
name='custom_role_is_board',
|
name="custom_role_is_board",
|
||||||
field=models.BooleanField(blank=True, verbose_name='Board member'),
|
field=models.BooleanField(blank=True, verbose_name="Board member"),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
+67
-53
@@ -10,56 +10,58 @@ from webapp.models import BaseRole
|
|||||||
# 2. Data migrate from webapp BaseRole to new kaehmy BaseRole
|
# 2. Data migrate from webapp BaseRole to new kaehmy BaseRole
|
||||||
# 3. Delete webapp BaseRole table
|
# 3. Delete webapp BaseRole table
|
||||||
|
|
||||||
VERBOSE_NAME = _('Kaehmy')
|
VERBOSE_NAME = _("Kaehmy")
|
||||||
|
|
||||||
|
|
||||||
class KaehmyBaseRole(BaseRole):
|
class KaehmyBaseRole(BaseRole):
|
||||||
"""ABC"""
|
"""ABC"""
|
||||||
|
|
||||||
CATEGORIES = (
|
CATEGORIES = (
|
||||||
('corporate', _('Corporate affairs')),
|
("corporate", _("Corporate affairs")),
|
||||||
('freshman', _('Freshmen')),
|
("freshman", _("Freshmen")),
|
||||||
('international', _('International')),
|
("international", _("International")),
|
||||||
('external', _('External affairs')),
|
("external", _("External affairs")),
|
||||||
('media', _('Media')),
|
("media", _("Media")),
|
||||||
('tech', _('Technology')),
|
("tech", _("Technology")),
|
||||||
('wellbeing', _('Wellbeing')),
|
("wellbeing", _("Wellbeing")),
|
||||||
('elepaja', _('Elepaja')),
|
("elepaja", _("Elepaja")),
|
||||||
('ceremonies', _('Ceremonies')),
|
("ceremonies", _("Ceremonies")),
|
||||||
('studies', _('Studies')),
|
("studies", _("Studies")),
|
||||||
('sosso', _('Sössö magazine')),
|
("sosso", _("Sössö magazine")),
|
||||||
('alumni', _('Alumni relations')),
|
("alumni", _("Alumni relations")),
|
||||||
('others', _('Others')),
|
("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):
|
class PresetRole(KaehmyBaseRole):
|
||||||
"""Model for kaehmy role."""
|
"""Model for kaehmy role."""
|
||||||
|
|
||||||
description = models.TextField(_('Description'))
|
description = models.TextField(_("Description"))
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('Preset kaehmy role')
|
verbose_name = _("Preset kaehmy role")
|
||||||
verbose_name_plural = _('Preset kaehmy roles')
|
verbose_name_plural = _("Preset kaehmy roles")
|
||||||
|
|
||||||
|
|
||||||
class CustomRole(KaehmyBaseRole):
|
class CustomRole(KaehmyBaseRole):
|
||||||
"""Model representing a user-specified custom occupation."""
|
"""Model representing a user-specified custom occupation."""
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('Custom kaehmy role')
|
verbose_name = _("Custom kaehmy role")
|
||||||
verbose_name_plural = _('Custom kaehmy roles')
|
verbose_name_plural = _("Custom kaehmy roles")
|
||||||
|
|
||||||
|
|
||||||
class CommentParent(models.Model):
|
class CommentParent(models.Model):
|
||||||
|
|
||||||
name = models.CharField(_('Name'), max_length=255, default='')
|
name = models.CharField(_("Name"), max_length=255, default="")
|
||||||
email = models.EmailField(_('Email'), default='')
|
email = models.EmailField(_("Email"), default="")
|
||||||
timestamp = models.DateTimeField(_('Timestamp'), default=timezone.now)
|
timestamp = models.DateTimeField(_("Timestamp"), default=timezone.now)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return 'Message parent #{}'.format(self.id)
|
return "Message parent #{}".format(self.id)
|
||||||
|
|
||||||
|
|
||||||
class Comment(CommentParent):
|
class Comment(CommentParent):
|
||||||
@@ -70,11 +72,13 @@ class Comment(CommentParent):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('Kaehmykommentti')
|
verbose_name = _("Kaehmykommentti")
|
||||||
verbose_name_plural = _('Kaehmykommentit')
|
verbose_name_plural = _("Kaehmykommentit")
|
||||||
|
|
||||||
message = models.TextField(_('Message'))
|
message = models.TextField(_("Message"))
|
||||||
parent = models.ForeignKey('CommentParent', related_name='messages', on_delete=models.CASCADE)
|
parent = models.ForeignKey(
|
||||||
|
"CommentParent", related_name="messages", on_delete=models.CASCADE
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Application(CommentParent):
|
class Application(CommentParent):
|
||||||
@@ -83,34 +87,36 @@ class Application(CommentParent):
|
|||||||
|
|
||||||
Allows user to choose from existing roles or to create custom ones.
|
Allows user to choose from existing roles or to create custom ones.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
YEAR_CHOICES = (
|
YEAR_CHOICES = (
|
||||||
(1, '1'),
|
(1, "1"),
|
||||||
(2, '2'),
|
(2, "2"),
|
||||||
(3, '3'),
|
(3, "3"),
|
||||||
(4, '4'),
|
(4, "4"),
|
||||||
(5, 'N'),
|
(5, "N"),
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('Kaehmylomake')
|
verbose_name = _("Kaehmylomake")
|
||||||
verbose_name_plural = _('Kaehmylomakkeet')
|
verbose_name_plural = _("Kaehmylomakkeet")
|
||||||
|
|
||||||
phone_number = models.CharField(
|
phone_number = models.CharField(_("Phone number"), max_length=10, default="")
|
||||||
_('Phone number'), max_length=10, default="")
|
year = models.IntegerField(_("Year"), choices=YEAR_CHOICES)
|
||||||
year = models.IntegerField(_('Year'), choices=YEAR_CHOICES)
|
text = models.TextField(_("Text"), default="", max_length=300)
|
||||||
text = models.TextField(_('Text'), default="", max_length=300)
|
|
||||||
custom_role_name = models.CharField(
|
custom_role_name = models.CharField(
|
||||||
_('Custom role name'), max_length=255, blank=True)
|
_("Custom role name"), max_length=255, blank=True
|
||||||
custom_role_is_board = models.BooleanField(
|
)
|
||||||
_('Board member'), blank=True)
|
custom_role_is_board = models.BooleanField(_("Board member"), blank=True)
|
||||||
custom_roles = models.ManyToManyField(
|
custom_roles = models.ManyToManyField(
|
||||||
'kaehmy.CustomRole', related_name='forms', blank=True)
|
"kaehmy.CustomRole", related_name="forms", blank=True
|
||||||
|
)
|
||||||
preset_roles = models.ManyToManyField(
|
preset_roles = models.ManyToManyField(
|
||||||
'kaehmy.PresetRole', related_name='forms', blank=True)
|
"kaehmy.PresetRole", related_name="forms", blank=True
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
"""Return model info."""
|
"""Return model info."""
|
||||||
return _('Kaehmy application: {}').format(self.name)
|
return _("Kaehmy application: {}").format(self.name)
|
||||||
|
|
||||||
def comment_count(self):
|
def comment_count(self):
|
||||||
"""Count comments for kaehmy."""
|
"""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)]
|
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)]
|
customs = [r.name.capitalize() for r in self.custom_roles.filter(is_board=True)]
|
||||||
combined = presets + customs
|
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):
|
def official_roles(self):
|
||||||
presets = [r.name.capitalize() for r in self.preset_roles.filter(is_board=False)]
|
presets = [
|
||||||
customs = [r.name.capitalize() for r in self.custom_roles.filter(is_board=False)]
|
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
|
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):
|
def all_roles(self):
|
||||||
presets = [r.name.capitalize() for r in self.preset_roles.all()]
|
presets = [r.name.capitalize() for r in self.preset_roles.all()]
|
||||||
customs = [r.name.capitalize() for r in self.custom_roles.all()]
|
customs = [r.name.capitalize() for r in self.custom_roles.all()]
|
||||||
combined = presets + customs
|
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):
|
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
|
# Telegram channel entry for Kaehmys
|
||||||
@@ -155,8 +169,8 @@ class TelegramChannel(models.Model):
|
|||||||
"""Model containing the channel id of a Telegram chat"""
|
"""Model containing the channel id of a Telegram chat"""
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('Telegram channel')
|
verbose_name = _("Telegram channel")
|
||||||
verbose_name_plural = _('Telegram channels')
|
verbose_name_plural = _("Telegram channels")
|
||||||
|
|
||||||
name = models.CharField(max_length=255)
|
name = models.CharField(max_length=255)
|
||||||
channel_id = models.CharField(max_length=255, unique=True)
|
channel_id = models.CharField(max_length=255, unique=True)
|
||||||
|
|||||||
+8
-2
@@ -8,6 +8,12 @@ from kaehmy.models import Application
|
|||||||
class ExportTable(tables.Table):
|
class ExportTable(tables.Table):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Application
|
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)
|
||||||
|
|||||||
+10
-12
@@ -1,7 +1,7 @@
|
|||||||
'''
|
"""
|
||||||
A telegram bot api for whatever purposes.
|
A telegram bot api for whatever purposes.
|
||||||
TODO: kaehmy app is definitely not correct place for this
|
TODO: kaehmy app is definitely not correct place for this
|
||||||
'''
|
"""
|
||||||
import logging
|
import logging
|
||||||
import requests
|
import requests
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
@@ -9,16 +9,18 @@ from kaehmy.models import TelegramChannel
|
|||||||
|
|
||||||
|
|
||||||
class TelegramBot:
|
class TelegramBot:
|
||||||
'''
|
"""
|
||||||
A telegram bot api for whatever purposes
|
A telegram bot api for whatever purposes
|
||||||
Currently only able to broadcast stuff to all registered
|
Currently only able to broadcast stuff to all registered
|
||||||
channels using broadcast method.
|
channels using broadcast method.
|
||||||
'''
|
"""
|
||||||
|
|
||||||
def __init__(self, api_token=None):
|
def __init__(self, api_token=None):
|
||||||
|
|
||||||
self.api_token = api_token or settings.TELEGRAM_BOT_TOKEN
|
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):
|
def broadcast(self, message):
|
||||||
channels_ids = TelegramChannel.objects.values_list("channel_id", flat=True)
|
channels_ids = TelegramChannel.objects.values_list("channel_id", flat=True)
|
||||||
@@ -26,13 +28,9 @@ class TelegramBot:
|
|||||||
self.send_message(id_, message)
|
self.send_message(id_, message)
|
||||||
|
|
||||||
def send_message(self, channel_id, message):
|
def send_message(self, channel_id, message):
|
||||||
'''
|
"""
|
||||||
Send message to a chat with given channel_id
|
Send message to a chat with given channel_id
|
||||||
'''
|
"""
|
||||||
data = {
|
data = {"chat_id": channel_id, "text": message, "parse_mode": "Markdown"}
|
||||||
'chat_id': channel_id,
|
|
||||||
'text': message,
|
|
||||||
'parse_mode': 'Markdown'
|
|
||||||
}
|
|
||||||
resp = requests.post(self.send_message_url, json=data)
|
resp = requests.post(self.send_message_url, json=data)
|
||||||
logging.debug(resp.content)
|
logging.debug(resp.content)
|
||||||
|
|||||||
@@ -6,13 +6,13 @@ from kaehmy.models import PresetRole, CustomRole
|
|||||||
|
|
||||||
@register(PresetRole)
|
@register(PresetRole)
|
||||||
class PresetRoleTranslationOptions(TranslationOptions):
|
class PresetRoleTranslationOptions(TranslationOptions):
|
||||||
""" Class for PresetRole translation options"""
|
"""Class for PresetRole translation options"""
|
||||||
|
|
||||||
fields = ()
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
@register(CustomRole)
|
@register(CustomRole)
|
||||||
class CustomRoleTranslationOptions(TranslationOptions):
|
class CustomRoleTranslationOptions(TranslationOptions):
|
||||||
""" Class for CustomROle translation options"""
|
"""Class for CustomROle translation options"""
|
||||||
|
|
||||||
fields = ()
|
fields = ()
|
||||||
|
|||||||
+7
-6
@@ -13,14 +13,15 @@ from kaehmy.views import export_view
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
# kaehmy
|
# kaehmy
|
||||||
url(r'^new', view),
|
url(r"^new", view),
|
||||||
url(r'^submit', submit),
|
url(r"^submit", submit),
|
||||||
url(r'^add_comment', comment),
|
url(r"^add_comment", comment),
|
||||||
url(r'^statistics', statistics_view),
|
url(r"^statistics", statistics_view),
|
||||||
url(r'^export', export_view),
|
url(r"^export", export_view),
|
||||||
url(r'^$', list_view),
|
url(r"^$", list_view),
|
||||||
]
|
]
|
||||||
|
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
||||||
|
|
||||||
urlpatterns += staticfiles_urlpatterns()
|
urlpatterns += staticfiles_urlpatterns()
|
||||||
|
|||||||
+1
-1
@@ -8,4 +8,4 @@ admin.site.register(Member)
|
|||||||
admin.site.register(Request)
|
admin.site.register(Request)
|
||||||
admin.site.register(Payment)
|
admin.site.register(Payment)
|
||||||
|
|
||||||
admin.site.site_header = 'SIK Admin'
|
admin.site.site_header = "SIK Admin"
|
||||||
|
|||||||
+1
-1
@@ -6,4 +6,4 @@ from django.apps import AppConfig
|
|||||||
class MembersConfig(AppConfig):
|
class MembersConfig(AppConfig):
|
||||||
"""Class for Members app configurations."""
|
"""Class for Members app configurations."""
|
||||||
|
|
||||||
name = 'members'
|
name = "members"
|
||||||
|
|||||||
+25
-22
@@ -23,7 +23,7 @@ class MemberForm(forms.ModelForm):
|
|||||||
"""Meta for Member model form."""
|
"""Meta for Member model form."""
|
||||||
|
|
||||||
model = Member
|
model = Member
|
||||||
fields = ['first_name', 'last_name', 'email', 'POR', 'AYY', 'jas']
|
fields = ["first_name", "last_name", "email", "POR", "AYY", "jas"]
|
||||||
|
|
||||||
class ImportResult:
|
class ImportResult:
|
||||||
def __init__(self, members, payments):
|
def __init__(self, members, payments):
|
||||||
@@ -32,22 +32,27 @@ class MemberForm(forms.ModelForm):
|
|||||||
|
|
||||||
def _clean_boolean_field(self, key):
|
def _clean_boolean_field(self, key):
|
||||||
value = self.data.get(key, None)
|
value = self.data.get(key, None)
|
||||||
if value in ['1', '0']:
|
if value in ["1", "0"]:
|
||||||
return bool(int(value))
|
return bool(int(value))
|
||||||
else:
|
else:
|
||||||
return value == 'on'
|
return value == "on"
|
||||||
|
|
||||||
def clean_jas(self):
|
def clean_jas(self):
|
||||||
return self._clean_boolean_field('jas')
|
return self._clean_boolean_field("jas")
|
||||||
|
|
||||||
def clean_AYY(self):
|
def clean_AYY(self):
|
||||||
return self._clean_boolean_field('AYY')
|
return self._clean_boolean_field("AYY")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def csv_to_models(data, payment_source='AYY', delimiter=','):
|
def csv_to_models(data, payment_source="AYY", delimiter=","):
|
||||||
clean_data = data.strip().split('\n')
|
clean_data = data.strip().split("\n")
|
||||||
clean_data = [row.rstrip(',').rstrip('\r').strip() for row in clean_data]
|
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)
|
csv_reader = csv.DictReader(
|
||||||
|
clean_data,
|
||||||
|
fieldnames=MemberForm.Meta.fields,
|
||||||
|
delimiter=delimiter,
|
||||||
|
quoting=csv.QUOTE_NONE,
|
||||||
|
)
|
||||||
|
|
||||||
members = []
|
members = []
|
||||||
payments = []
|
payments = []
|
||||||
@@ -57,10 +62,10 @@ class MemberForm(forms.ModelForm):
|
|||||||
line[key] = value.strip()
|
line[key] = value.strip()
|
||||||
except AttributeError as ex:
|
except AttributeError as ex:
|
||||||
logging.error('Invalid line in CSV: "{}"'.format(line))
|
logging.error('Invalid line in CSV: "{}"'.format(line))
|
||||||
logging.error('Delimiter: {}'.format(delimiter))
|
logging.error("Delimiter: {}".format(delimiter))
|
||||||
raise
|
raise
|
||||||
|
|
||||||
email = line['email']
|
email = line["email"]
|
||||||
member_exists = False
|
member_exists = False
|
||||||
if Member.objects.filter(email=email).exists():
|
if Member.objects.filter(email=email).exists():
|
||||||
member_exists = True
|
member_exists = True
|
||||||
@@ -76,9 +81,9 @@ class MemberForm(forms.ModelForm):
|
|||||||
else:
|
else:
|
||||||
member = Member.objects.get(email=email)
|
member = Member.objects.get(email=email)
|
||||||
payment_data = {
|
payment_data = {
|
||||||
'source': payment_source,
|
"source": payment_source,
|
||||||
'member': member.id,
|
"member": member.id,
|
||||||
'date': timezone.now(),
|
"date": timezone.now(),
|
||||||
}
|
}
|
||||||
form = PaymentForm(payment_data)
|
form = PaymentForm(payment_data)
|
||||||
if not form.is_valid():
|
if not form.is_valid():
|
||||||
@@ -95,17 +100,15 @@ class PaymentForm(forms.ModelForm):
|
|||||||
|
|
||||||
member = forms.ModelChoiceField(
|
member = forms.ModelChoiceField(
|
||||||
queryset=Member.objects.all(),
|
queryset=Member.objects.all(),
|
||||||
widget=autocomplete.ModelSelect2(url='member-autocomplete')
|
widget=autocomplete.ModelSelect2(url="member-autocomplete"),
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Meta for Payment model form."""
|
"""Meta for Payment model form."""
|
||||||
|
|
||||||
model = Payment
|
model = Payment
|
||||||
fields = ['date', 'source', 'member']
|
fields = ["date", "source", "member"]
|
||||||
labels = {
|
labels = {"member": _("Member")}
|
||||||
'member': _('Member')
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class ApplicationForm(forms.ModelForm):
|
class ApplicationForm(forms.ModelForm):
|
||||||
@@ -115,13 +118,13 @@ class ApplicationForm(forms.ModelForm):
|
|||||||
"""Meta for application model form."""
|
"""Meta for application model form."""
|
||||||
|
|
||||||
model = Request
|
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):
|
def __init__(self, *args, **kwargs):
|
||||||
super(ApplicationForm, self).__init__(*args, **kwargs)
|
super(ApplicationForm, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
self.fields['AYY'].label = _("I'm a member of AYY")
|
self.fields["AYY"].label = _("I'm a member of AYY")
|
||||||
self.fields['jas'].label = _("I want to receive a weekly newsletter")
|
self.fields["jas"].label = _("I want to receive a weekly newsletter")
|
||||||
|
|
||||||
|
|
||||||
class UploadFileForm(forms.Form):
|
class UploadFileForm(forms.Form):
|
||||||
|
|||||||
@@ -12,29 +12,52 @@ class Migration(migrations.Migration):
|
|||||||
|
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = []
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Member',
|
name="Member",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('first_name', models.CharField(max_length=127)),
|
"id",
|
||||||
('last_name', models.CharField(max_length=127)),
|
models.AutoField(
|
||||||
('email', models.EmailField(max_length=254)),
|
auto_created=True,
|
||||||
('POR', models.CharField(max_length=255)),
|
primary_key=True,
|
||||||
('AYY', models.BooleanField(default=False)),
|
serialize=False,
|
||||||
('jas', models.BooleanField(default=False)),
|
verbose_name="ID",
|
||||||
('created', models.DateTimeField(default=django.utils.timezone.now)),
|
),
|
||||||
('paid', models.DateTimeField(default=datetime.datetime(1970, 1, 1, 0, 0))),
|
),
|
||||||
|
("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(
|
migrations.CreateModel(
|
||||||
name='MemberRequest',
|
name="MemberRequest",
|
||||||
fields=[
|
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"
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,13 +9,13 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0001_initial'),
|
("members", "0001_initial"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='paid',
|
name="paid",
|
||||||
field=models.DateTimeField(default=datetime.datetime(1970, 1, 1, 2, 0)),
|
field=models.DateTimeField(default=datetime.datetime(1970, 1, 1, 2, 0)),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -11,57 +11,81 @@ import django.utils.timezone
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0002_auto_20170329_1857'),
|
("members", "0002_auto_20170329_1857"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Payment',
|
name="Payment",
|
||||||
fields=[
|
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))),
|
"id",
|
||||||
('source', models.CharField(max_length=255)),
|
models.AutoField(
|
||||||
('first_name', models.CharField(max_length=255)),
|
auto_created=True,
|
||||||
('last_name', models.CharField(max_length=255)),
|
primary_key=True,
|
||||||
('email', models.EmailField(max_length=255)),
|
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(
|
migrations.CreateModel(
|
||||||
name='Request',
|
name="Request",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('first_name', models.CharField(max_length=127)),
|
"id",
|
||||||
('last_name', models.CharField(max_length=127)),
|
models.AutoField(
|
||||||
('email', models.EmailField(max_length=254)),
|
auto_created=True,
|
||||||
('POR', models.CharField(default='ei_tiedossa', max_length=255)),
|
primary_key=True,
|
||||||
('AYY', models.BooleanField(default=False)),
|
serialize=False,
|
||||||
('jas', models.BooleanField(default=False)),
|
verbose_name="ID",
|
||||||
('submitted', models.DateTimeField(default=django.utils.timezone.now)),
|
),
|
||||||
|
),
|
||||||
|
("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={
|
options={
|
||||||
'abstract': False,
|
"abstract": False,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='memberrequest',
|
model_name="memberrequest",
|
||||||
name='member',
|
name="member",
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='POR',
|
name="POR",
|
||||||
field=models.CharField(default='ei_tiedossa', max_length=255),
|
field=models.CharField(default="ei_tiedossa", max_length=255),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='paid',
|
name="paid",
|
||||||
field=models.DateTimeField(default=django.utils.timezone.now),
|
field=models.DateTimeField(default=django.utils.timezone.now),
|
||||||
),
|
),
|
||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='MemberRequest',
|
name="MemberRequest",
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='member',
|
name="member",
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='members.Member'),
|
field=models.ForeignKey(
|
||||||
|
blank=True,
|
||||||
|
null=True,
|
||||||
|
on_delete=django.db.models.deletion.SET_NULL,
|
||||||
|
to="members.Member",
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,80 +8,80 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0003_auto_20170329_1928'),
|
("members", "0003_auto_20170329_1928"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='email',
|
name="email",
|
||||||
),
|
),
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='first_name',
|
name="first_name",
|
||||||
),
|
),
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='last_name',
|
name="last_name",
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='AYY',
|
name="AYY",
|
||||||
field=models.BooleanField(default=False, verbose_name='AYY'),
|
field=models.BooleanField(default=False, verbose_name="AYY"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='POR',
|
name="POR",
|
||||||
field=models.CharField(max_length=255, verbose_name='Place of residence'),
|
field=models.CharField(max_length=255, verbose_name="Place of residence"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='email',
|
name="email",
|
||||||
field=models.EmailField(max_length=254, verbose_name='Email'),
|
field=models.EmailField(max_length=254, verbose_name="Email"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='first_name',
|
name="first_name",
|
||||||
field=models.CharField(max_length=127, verbose_name='First name'),
|
field=models.CharField(max_length=127, verbose_name="First name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='jas',
|
name="jas",
|
||||||
field=models.BooleanField(default=False, verbose_name='JAS'),
|
field=models.BooleanField(default=False, verbose_name="JAS"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='last_name',
|
name="last_name",
|
||||||
field=models.CharField(max_length=127, verbose_name='Last name'),
|
field=models.CharField(max_length=127, verbose_name="Last name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='request',
|
model_name="request",
|
||||||
name='AYY',
|
name="AYY",
|
||||||
field=models.BooleanField(default=False, verbose_name='AYY'),
|
field=models.BooleanField(default=False, verbose_name="AYY"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='request',
|
model_name="request",
|
||||||
name='POR',
|
name="POR",
|
||||||
field=models.CharField(max_length=255, verbose_name='Place of residence'),
|
field=models.CharField(max_length=255, verbose_name="Place of residence"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='request',
|
model_name="request",
|
||||||
name='email',
|
name="email",
|
||||||
field=models.EmailField(max_length=254, verbose_name='Email'),
|
field=models.EmailField(max_length=254, verbose_name="Email"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='request',
|
model_name="request",
|
||||||
name='first_name',
|
name="first_name",
|
||||||
field=models.CharField(max_length=127, verbose_name='First name'),
|
field=models.CharField(max_length=127, verbose_name="First name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='request',
|
model_name="request",
|
||||||
name='jas',
|
name="jas",
|
||||||
field=models.BooleanField(default=False, verbose_name='JAS'),
|
field=models.BooleanField(default=False, verbose_name="JAS"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='request',
|
model_name="request",
|
||||||
name='last_name',
|
name="last_name",
|
||||||
field=models.CharField(max_length=127, verbose_name='Last name'),
|
field=models.CharField(max_length=127, verbose_name="Last name"),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,22 +9,31 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0004_auto_20170512_1454'),
|
("members", "0004_auto_20170512_1454"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='paid',
|
name="paid",
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='date',
|
name="date",
|
||||||
field=models.DateTimeField(default=datetime.datetime(2017, 5, 13, 10, 29, 50, 116064)),
|
field=models.DateTimeField(
|
||||||
|
default=datetime.datetime(2017, 5, 13, 10, 29, 50, 116064)
|
||||||
|
),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='source',
|
name="source",
|
||||||
field=models.CharField(choices=[('AYY', 'AYY'), ('cash', 'Cash'), ('bank_transfer', 'Bank transfer')], max_length=255),
|
field=models.CharField(
|
||||||
|
choices=[
|
||||||
|
("AYY", "AYY"),
|
||||||
|
("cash", "Cash"),
|
||||||
|
("bank_transfer", "Bank transfer"),
|
||||||
|
],
|
||||||
|
max_length=255,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,13 +9,15 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0005_auto_20170513_1029'),
|
("members", "0005_auto_20170513_1029"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='date',
|
name="date",
|
||||||
field=models.DateTimeField(default=datetime.datetime(2017, 5, 17, 13, 9, 21, 49238)),
|
field=models.DateTimeField(
|
||||||
|
default=datetime.datetime(2017, 5, 17, 13, 9, 21, 49238)
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,13 +9,15 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0006_auto_20170517_1309'),
|
("members", "0006_auto_20170517_1309"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='date',
|
name="date",
|
||||||
field=models.DateTimeField(default=datetime.datetime(2017, 5, 18, 15, 38, 7, 668612)),
|
field=models.DateTimeField(
|
||||||
|
default=datetime.datetime(2017, 5, 18, 15, 38, 7, 668612)
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,18 +9,18 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0007_auto_20170518_1538'),
|
("members", "0007_auto_20170518_1538"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='created',
|
name="created",
|
||||||
field=models.DateTimeField(default=datetime.datetime.now),
|
field=models.DateTimeField(default=datetime.datetime.now),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='date',
|
name="date",
|
||||||
field=models.DateTimeField(default=datetime.datetime.now),
|
field=models.DateTimeField(default=datetime.datetime.now),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,13 +9,15 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0008_auto_20170518_1540'),
|
("members", "0008_auto_20170518_1540"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='created',
|
name="created",
|
||||||
field=models.DateTimeField(default=datetime.datetime.now, verbose_name='Created'),
|
field=models.DateTimeField(
|
||||||
|
default=datetime.datetime.now, verbose_name="Created"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,18 +9,28 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0009_auto_20170526_1903'),
|
("members", "0009_auto_20170526_1903"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='date',
|
name="date",
|
||||||
field=models.DateTimeField(default=datetime.datetime.now, verbose_name='Date'),
|
field=models.DateTimeField(
|
||||||
|
default=datetime.datetime.now, verbose_name="Date"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='source',
|
name="source",
|
||||||
field=models.CharField(choices=[('AYY', 'AYY'), ('cash', 'Cash'), ('bank_transfer', 'Bank transfer')], max_length=255, verbose_name='Source'),
|
field=models.CharField(
|
||||||
|
choices=[
|
||||||
|
("AYY", "AYY"),
|
||||||
|
("cash", "Cash"),
|
||||||
|
("bank_transfer", "Bank transfer"),
|
||||||
|
],
|
||||||
|
max_length=255,
|
||||||
|
verbose_name="Source",
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,13 +9,15 @@ import django.utils.timezone
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0010_auto_20170526_1910'),
|
("members", "0010_auto_20170526_1910"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='request',
|
model_name="request",
|
||||||
name='submitted',
|
name="submitted",
|
||||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Submitted'),
|
field=models.DateTimeField(
|
||||||
|
default=django.utils.timezone.now, verbose_name="Submitted"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,16 +9,38 @@ import django.db.models.deletion
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0011_auto_20170526_2013'),
|
("members", "0011_auto_20170526_2013"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='MemberConflict',
|
name="MemberConflict",
|
||||||
fields=[
|
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')),
|
"id",
|
||||||
('second_member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberconflict_second_member', to='members.Member')),
|
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",
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,13 +9,19 @@ import django.db.models.deletion
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0012_memberconflict'),
|
("members", "0012_memberconflict"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='member',
|
name="member",
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='payments', to='members.Member'),
|
field=models.ForeignKey(
|
||||||
|
blank=True,
|
||||||
|
null=True,
|
||||||
|
on_delete=django.db.models.deletion.PROTECT,
|
||||||
|
related_name="payments",
|
||||||
|
to="members.Member",
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,18 +8,18 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0013_auto_20170601_1822'),
|
("members", "0013_auto_20170601_1822"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='email',
|
name="email",
|
||||||
field=models.EmailField(max_length=254, unique=True, verbose_name='Email'),
|
field=models.EmailField(max_length=254, unique=True, verbose_name="Email"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='request',
|
model_name="request",
|
||||||
name='email',
|
name="email",
|
||||||
field=models.EmailField(max_length=254, unique=True, verbose_name='Email'),
|
field=models.EmailField(max_length=254, unique=True, verbose_name="Email"),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,19 +8,19 @@ from django.db import migrations
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0014_auto_20170920_1457'),
|
("members", "0014_auto_20170920_1457"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='memberconflict',
|
model_name="memberconflict",
|
||||||
name='first_member',
|
name="first_member",
|
||||||
),
|
),
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='memberconflict',
|
model_name="memberconflict",
|
||||||
name='second_member',
|
name="second_member",
|
||||||
),
|
),
|
||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='MemberConflict',
|
name="MemberConflict",
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,18 +9,22 @@ import django.utils.timezone
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0015_auto_20170925_1917'),
|
("members", "0015_auto_20170925_1917"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='member',
|
model_name="member",
|
||||||
name='created',
|
name="created",
|
||||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Created'),
|
field=models.DateTimeField(
|
||||||
|
default=django.utils.timezone.now, verbose_name="Created"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='payment',
|
model_name="payment",
|
||||||
name='date',
|
name="date",
|
||||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Date'),
|
field=models.DateTimeField(
|
||||||
|
default=django.utils.timezone.now, verbose_name="Date"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,12 +8,16 @@ from django.db import migrations
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0016_auto_20170925_1924'),
|
("members", "0016_auto_20170925_1924"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='member',
|
name="member",
|
||||||
options={'permissions': (('check_by_email', 'Can check if user exists by email'),)},
|
options={
|
||||||
|
"permissions": (
|
||||||
|
("check_by_email", "Can check if user exists by email"),
|
||||||
|
)
|
||||||
|
},
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,20 +8,29 @@ from django.db import migrations
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0017_auto_20170926_1316'),
|
("members", "0017_auto_20170926_1316"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='member',
|
name="member",
|
||||||
options={'permissions': (('check_by_email', 'Can check if user exists by email'), ('read_member', 'Can see member in list'))},
|
options={
|
||||||
|
"permissions": (
|
||||||
|
("check_by_email", "Can check if user exists by email"),
|
||||||
|
("read_member", "Can see member in list"),
|
||||||
|
)
|
||||||
|
},
|
||||||
),
|
),
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='payment',
|
name="payment",
|
||||||
options={'permissions': (('read_payment', 'Can see payment in list'),)},
|
options={"permissions": (("read_payment", "Can see payment in list"),)},
|
||||||
),
|
),
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='request',
|
name="request",
|
||||||
options={'permissions': (('read_application', 'Can see member application in list'),)},
|
options={
|
||||||
|
"permissions": (
|
||||||
|
("read_application", "Can see member application in list"),
|
||||||
|
)
|
||||||
|
},
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,12 +8,19 @@ from django.db import migrations
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('members', '0018_auto_20170927_1918'),
|
("members", "0018_auto_20170927_1918"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='member',
|
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'},
|
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",
|
||||||
|
},
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
+36
-30
@@ -12,8 +12,9 @@ class BaseMember(models.Model):
|
|||||||
first_name = models.CharField(_("First name"), max_length=127)
|
first_name = models.CharField(_("First name"), max_length=127)
|
||||||
last_name = models.CharField(_("Last name"), max_length=127)
|
last_name = models.CharField(_("Last name"), max_length=127)
|
||||||
email = models.EmailField(_("Email"), unique=True)
|
email = models.EmailField(_("Email"), unique=True)
|
||||||
POR = models.CharField(_("Place of residence"),
|
POR = models.CharField(
|
||||||
max_length=255) # place of residence
|
_("Place of residence"), max_length=255
|
||||||
|
) # place of residence
|
||||||
AYY = models.BooleanField(_("AYY"), default=False)
|
AYY = models.BooleanField(_("AYY"), default=False)
|
||||||
jas = models.BooleanField(_("JAS"), default=False)
|
jas = models.BooleanField(_("JAS"), default=False)
|
||||||
|
|
||||||
@@ -34,7 +35,7 @@ class BaseMember(models.Model):
|
|||||||
self.email,
|
self.email,
|
||||||
self.POR,
|
self.POR,
|
||||||
int(self.AYY),
|
int(self.AYY),
|
||||||
int(self.jas)
|
int(self.jas),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -42,11 +43,9 @@ class Request(BaseMember):
|
|||||||
"""Member request model represents one member request."""
|
"""Member request model represents one member request."""
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (
|
permissions = (("read_application", "Can see member application in list"),)
|
||||||
('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):
|
def to_member(self):
|
||||||
"""Convert array to member model."""
|
"""Convert array to member model."""
|
||||||
@@ -59,47 +58,54 @@ class Payment(models.Model):
|
|||||||
"""Payment model representing one payment event."""
|
"""Payment model representing one payment event."""
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (
|
permissions = (("read_payment", "Can see payment in list"),)
|
||||||
('read_payment', 'Can see payment in list'),
|
|
||||||
)
|
|
||||||
|
|
||||||
date = models.DateTimeField(_('Date'), default=timezone.now)
|
date = models.DateTimeField(_("Date"), default=timezone.now)
|
||||||
source = models.CharField(_('Source'), choices=[
|
source = models.CharField(
|
||||||
('AYY', _('AYY')),
|
_("Source"),
|
||||||
('cash', _('Cash')),
|
choices=[
|
||||||
('bank_transfer', _('Bank transfer')),
|
("AYY", _("AYY")),
|
||||||
], max_length=255)
|
("cash", _("Cash")),
|
||||||
|
("bank_transfer", _("Bank transfer")),
|
||||||
|
],
|
||||||
|
max_length=255,
|
||||||
|
)
|
||||||
|
|
||||||
member = models.ForeignKey('Member',
|
member = models.ForeignKey(
|
||||||
on_delete=models.PROTECT,
|
"Member",
|
||||||
blank=True,
|
on_delete=models.PROTECT,
|
||||||
null=True,
|
blank=True,
|
||||||
related_name='payments')
|
null=True,
|
||||||
|
related_name="payments",
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
"""Return payment id and date."""
|
"""Return payment id and date."""
|
||||||
return 'Payment no. {}, {}'.format(self.id, str(self.date))
|
return "Payment no. {}, {}".format(self.id, str(self.date))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def find_payments_by_name(query_name):
|
def find_payments_by_name(query_name):
|
||||||
qs = Payment.objects.all()
|
qs = Payment.objects.all()
|
||||||
for term in query_name.split():
|
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
|
return qs
|
||||||
|
|
||||||
|
|
||||||
class Member(BaseMember):
|
class Member(BaseMember):
|
||||||
"""Member model represets one member on the registry."""
|
"""Member model represets one member on the registry."""
|
||||||
|
|
||||||
created = models.DateTimeField(_('Created'), default=timezone.now)
|
created = models.DateTimeField(_("Created"), default=timezone.now)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
permissions = (
|
permissions = (
|
||||||
('check_by_email', 'Can check if user exists by email'),
|
("check_by_email", "Can check if user exists by email"),
|
||||||
('read_member', 'Can see member in list'),
|
("read_member", "Can see member in list"),
|
||||||
)
|
)
|
||||||
verbose_name = _('Member')
|
verbose_name = _("Member")
|
||||||
verbose_name_plural = _('Members')
|
verbose_name_plural = _("Members")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def from_array(array):
|
def from_array(array):
|
||||||
@@ -126,5 +132,5 @@ class Member(BaseMember):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def get_members_with_latest_payment(members_query):
|
def get_members_with_latest_payment(members_query):
|
||||||
"""Return QuerySet of given members QS with last_paid attribute."""
|
"""Return QuerySet of given members QS with last_paid attribute."""
|
||||||
latest = Payment.objects.filter(member=OuterRef('pk')).order_by('-date')
|
latest = Payment.objects.filter(member=OuterRef("pk")).order_by("-date")
|
||||||
return members_query.annotate(last_paid=Subquery(latest.values('date')[:1]))
|
return members_query.annotate(last_paid=Subquery(latest.values("date")[:1]))
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ import logging
|
|||||||
|
|
||||||
class CheckByEmailPermission(BasePermission):
|
class CheckByEmailPermission(BasePermission):
|
||||||
def has_permission(self, request, view):
|
def has_permission(self, request, view):
|
||||||
return request.user.has_perm('members.check_by_email')
|
return request.user.has_perm("members.check_by_email")
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from .models import Member, Payment, Request
|
|||||||
class MemberResource(resources.ModelResource):
|
class MemberResource(resources.ModelResource):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Member
|
model = Member
|
||||||
exclude = ['id', 'created']
|
exclude = ["id", "created"]
|
||||||
|
|
||||||
|
|
||||||
class PaymentResource(resources.ModelResource):
|
class PaymentResource(resources.ModelResource):
|
||||||
@@ -14,13 +14,13 @@ class PaymentResource(resources.ModelResource):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Payment
|
model = Payment
|
||||||
exclude = ['id']
|
exclude = ["id"]
|
||||||
|
|
||||||
def dehydrate_member(self, payment):
|
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 ApplicationResource(resources.ModelResource):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Request
|
model = Request
|
||||||
exclude = ['id']
|
exclude = ["id"]
|
||||||
|
|||||||
+12
-3
@@ -7,11 +7,20 @@ from members.models import Member
|
|||||||
class MemberSerializer(serializers.ModelSerializer):
|
class MemberSerializer(serializers.ModelSerializer):
|
||||||
"""Model serializer for member."""
|
"""Model serializer for member."""
|
||||||
|
|
||||||
paid = serializers.DateTimeField(source='last_paid')
|
paid = serializers.DateTimeField(source="last_paid")
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Meta of member serializer."""
|
"""Meta of member serializer."""
|
||||||
|
|
||||||
model = Member
|
model = Member
|
||||||
fields = ('id', 'first_name', 'last_name', 'email',
|
fields = (
|
||||||
'POR', 'AYY', 'jas', 'created', 'paid')
|
"id",
|
||||||
|
"first_name",
|
||||||
|
"last_name",
|
||||||
|
"email",
|
||||||
|
"POR",
|
||||||
|
"AYY",
|
||||||
|
"jas",
|
||||||
|
"created",
|
||||||
|
"paid",
|
||||||
|
)
|
||||||
|
|||||||
+32
-13
@@ -12,11 +12,16 @@ from members.models import Member, Payment, Request
|
|||||||
class MemberTable(tables.Table):
|
class MemberTable(tables.Table):
|
||||||
"""Table for member."""
|
"""Table for member."""
|
||||||
|
|
||||||
last_paid = tables.DateTimeColumn(verbose_name=_('Last paid'))
|
last_paid = tables.DateTimeColumn(verbose_name=_("Last paid"))
|
||||||
|
|
||||||
options = tables.TemplateColumn(
|
options = tables.TemplateColumn(
|
||||||
('<a class="data-table-button btn btn-primary" '
|
(
|
||||||
'href="/members/edit/{{ record.id }}">') + _('Edit') + '</a>', verbose_name=""
|
'<a class="data-table-button btn btn-primary" '
|
||||||
|
'href="/members/edit/{{ record.id }}">'
|
||||||
|
)
|
||||||
|
+ _("Edit")
|
||||||
|
+ "</a>",
|
||||||
|
verbose_name="",
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
@@ -26,24 +31,34 @@ class MemberTable(tables.Table):
|
|||||||
|
|
||||||
def render_last_paid(self, record):
|
def render_last_paid(self, record):
|
||||||
try:
|
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:
|
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):
|
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)
|
return (queryset, True)
|
||||||
|
|
||||||
|
|
||||||
class PaymentTable(tables.Table):
|
class PaymentTable(tables.Table):
|
||||||
"""Table for payments."""
|
"""Table for payments."""
|
||||||
|
|
||||||
member = tables.Column(accessor='member', verbose_name=_('Member'))
|
member = tables.Column(accessor="member", verbose_name=_("Member"))
|
||||||
|
|
||||||
options = tables.TemplateColumn(
|
options = tables.TemplateColumn(
|
||||||
('<a class="data-table-button btn btn-primary" '
|
(
|
||||||
'href="/members/edit_payment/{{ record.id }}">') + _('Edit') + '</a>',
|
'<a class="data-table-button btn btn-primary" '
|
||||||
verbose_name=""
|
'href="/members/edit_payment/{{ record.id }}">'
|
||||||
|
)
|
||||||
|
+ _("Edit")
|
||||||
|
+ "</a>",
|
||||||
|
verbose_name="",
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
@@ -56,9 +71,13 @@ class RequestTable(tables.Table):
|
|||||||
"""Table for member applications."""
|
"""Table for member applications."""
|
||||||
|
|
||||||
options = tables.TemplateColumn(
|
options = tables.TemplateColumn(
|
||||||
('<a class="data-table-button btn btn-primary" '
|
(
|
||||||
'href="/members/edit_application/{{ record.id }}">') + _('Edit') + '</a>',
|
'<a class="data-table-button btn btn-primary" '
|
||||||
verbose_name=""
|
'href="/members/edit_application/{{ record.id }}">'
|
||||||
|
)
|
||||||
|
+ _("Edit")
|
||||||
|
+ "</a>",
|
||||||
|
verbose_name="",
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|||||||
+76
-47
@@ -17,16 +17,23 @@ class MemberRegisterTestCase(TestCase):
|
|||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
"""Setup testing environment by creating member and admin."""
|
"""Setup testing environment by creating member and admin."""
|
||||||
memb = Member.objects.create(first_name="Tidus", last_name="Tester", email="tidus@tester.fi")
|
memb = Member.objects.create(
|
||||||
payment = Payment.objects.create(member=memb, source='AYY')
|
first_name="Tidus", last_name="Tester", email="tidus@tester.fi"
|
||||||
|
)
|
||||||
|
payment = Payment.objects.create(member=memb, source="AYY")
|
||||||
appl = Request.objects.create(
|
appl = Request.objects.create(
|
||||||
first_name="Liisa", last_name="Mattila",
|
first_name="Liisa",
|
||||||
email="liisa.mattila@pylly.com", POR="Kouvola",
|
last_name="Mattila",
|
||||||
AYY=True, jas=False)
|
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(
|
test_admin = User.objects.create_superuser(
|
||||||
username, 'myemail@test.com', password)
|
username, "myemail@test.com", password
|
||||||
|
)
|
||||||
self.c = Client()
|
self.c = Client()
|
||||||
self.c.login(username=username, password=password)
|
self.c.login(username=username, password=password)
|
||||||
|
|
||||||
@@ -39,84 +46,106 @@ class MemberRegisterTestCase(TestCase):
|
|||||||
"""Test csv import only with single line in csv file."""
|
"""Test csv import only with single line in csv file."""
|
||||||
|
|
||||||
current_dir = os.path.dirname(os.path.abspath(__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:
|
with open(
|
||||||
response = self.c.post('/members/import_csv', {
|
os.path.join(current_dir, "test_resources", "single_line_import.csv")
|
||||||
'csvFile': csvFile,
|
) as csvFile:
|
||||||
'delimiter': ';',
|
response = self.c.post(
|
||||||
'payment_source': 'AYY'
|
"/members/import_csv",
|
||||||
}, follow=True)
|
{"csvFile": csvFile, "delimiter": ";", "payment_source": "AYY"},
|
||||||
|
follow=True,
|
||||||
|
)
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
def test_import_csv_multi_line(self):
|
def test_import_csv_multi_line(self):
|
||||||
"""Test csv import with multilined csv."""
|
"""Test csv import with multilined csv."""
|
||||||
|
|
||||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
with open(os.path.join(current_dir, 'test_resources', 'multi_line_import.csv')) as csvFile:
|
with open(
|
||||||
response = self.c.post('/members/import_csv', {
|
os.path.join(current_dir, "test_resources", "multi_line_import.csv")
|
||||||
'csvFile': csvFile,
|
) as csvFile:
|
||||||
'delimiter': ';',
|
response = self.c.post(
|
||||||
'payment_source': 'AYY'
|
"/members/import_csv",
|
||||||
}, follow=True)
|
{"csvFile": csvFile, "delimiter": ";", "payment_source": "AYY"},
|
||||||
|
follow=True,
|
||||||
|
)
|
||||||
|
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
def test_autocomplete_search_found(self):
|
def test_autocomplete_search_found(self):
|
||||||
"""Test member autocomplete search"""
|
"""Test member autocomplete search"""
|
||||||
search_terms = 'Tidus'
|
search_terms = "Tidus"
|
||||||
response = self.c.get('/members/member-autocomplete?q={}'.format(search_terms), follow=True)
|
response = self.c.get(
|
||||||
results = response.json()['results']
|
"/members/member-autocomplete?q={}".format(search_terms), follow=True
|
||||||
|
)
|
||||||
|
results = response.json()["results"]
|
||||||
self.assertEqual(len(results), 1)
|
self.assertEqual(len(results), 1)
|
||||||
|
|
||||||
def test_autocomplete_search_not_found(self):
|
def test_autocomplete_search_not_found(self):
|
||||||
"""Test member autocomplete search"""
|
"""Test member autocomplete search"""
|
||||||
search_terms = 'Notfound'
|
search_terms = "Notfound"
|
||||||
response = self.c.get('/members/member-autocomplete?q={}'.format(search_terms), follow=True)
|
response = self.c.get(
|
||||||
results = response.json()['results']
|
"/members/member-autocomplete?q={}".format(search_terms), follow=True
|
||||||
|
)
|
||||||
|
results = response.json()["results"]
|
||||||
self.assertEqual(len(results), 0)
|
self.assertEqual(len(results), 0)
|
||||||
|
|
||||||
def test_export_members_excel(self):
|
def test_export_members_excel(self):
|
||||||
"""Test if the user can download an excel file of the member register"""
|
"""Test if the user can download an excel file of the member register"""
|
||||||
resp = self.c.get('/members/export_members')
|
resp = self.c.get("/members/export_members")
|
||||||
content_type = 'application/vnd.ms-excel'
|
content_type = "application/vnd.ms-excel"
|
||||||
self.assertIn(content_type, resp['Content-Type'])
|
self.assertIn(content_type, resp["Content-Type"])
|
||||||
|
|
||||||
content = resp.content
|
content = resp.content
|
||||||
arrays = pyexcel.get_array(file_content=content, file_type='xlsx')
|
arrays = pyexcel.get_array(file_content=content, file_type="xlsx")
|
||||||
tidus_array = ['Tidus', 'Tester', 'tidus@tester.fi', '', '0', '0']
|
tidus_array = ["Tidus", "Tester", "tidus@tester.fi", "", "0", "0"]
|
||||||
self.assertIn(tidus_array, arrays)
|
self.assertIn(tidus_array, arrays)
|
||||||
|
|
||||||
def test_export_payments_excel(self):
|
def test_export_payments_excel(self):
|
||||||
"""Test if the user can download an excel file of the payment register"""
|
"""Test if the user can download an excel file of the payment register"""
|
||||||
resp = self.c.get('/members/export_payments')
|
resp = self.c.get("/members/export_payments")
|
||||||
content_type = 'application/vnd.ms-excel'
|
content_type = "application/vnd.ms-excel"
|
||||||
self.assertIn(content_type, resp['Content-Type'])
|
self.assertIn(content_type, resp["Content-Type"])
|
||||||
|
|
||||||
content = resp.content
|
content = resp.content
|
||||||
arrays = pyexcel.get_array(file_content=content, file_type='xlsx')
|
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')
|
created = Payment.objects.get(member__email="tidus@tester.fi").date.strftime(
|
||||||
tidus_array = ['Tidus Tester', created, 'AYY']
|
"%Y-%m-%d %H:%M:%S"
|
||||||
|
)
|
||||||
|
tidus_array = ["Tidus Tester", created, "AYY"]
|
||||||
self.assertIn(tidus_array, arrays)
|
self.assertIn(tidus_array, arrays)
|
||||||
|
|
||||||
def test_export_applications_excel(self):
|
def test_export_applications_excel(self):
|
||||||
"""Test if the user can download an excel file of the member application register"""
|
"""Test if the user can download an excel file of the member application register"""
|
||||||
resp = self.c.get('/members/export_applications')
|
resp = self.c.get("/members/export_applications")
|
||||||
content_type = 'application/vnd.ms-excel'
|
content_type = "application/vnd.ms-excel"
|
||||||
self.assertIn(content_type, resp['Content-Type'])
|
self.assertIn(content_type, resp["Content-Type"])
|
||||||
|
|
||||||
content = resp.content
|
content = resp.content
|
||||||
arrays = pyexcel.get_array(file_content=content, file_type='xlsx')
|
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')
|
submitted = Request.objects.get(
|
||||||
liisa_array = ['Liisa', 'Mattila', 'liisa.mattila@pylly.com', 'Kouvola', '1', '0', submitted]
|
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)
|
self.assertIn(liisa_array, arrays)
|
||||||
|
|
||||||
def test_submit_member_application(self):
|
def test_submit_member_application(self):
|
||||||
"""Test if submitting a member application works"""
|
"""Test if submitting a member application works"""
|
||||||
data = {
|
data = {
|
||||||
'first_name': 'Seppo', 'last_name': 'Saastamoinen',
|
"first_name": "Seppo",
|
||||||
'email': 'seppo@saastamoin.en', 'jas': 'on',
|
"last_name": "Saastamoinen",
|
||||||
'POR': 'Dipolin viinibaari'
|
"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.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())
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ from rest_framework.throttling import UserRateThrottle
|
|||||||
class BurstRateThrottle(UserRateThrottle):
|
class BurstRateThrottle(UserRateThrottle):
|
||||||
"""Class for burst rate throttle."""
|
"""Class for burst rate throttle."""
|
||||||
|
|
||||||
scope = 'burst'
|
scope = "burst"
|
||||||
|
|
||||||
|
|
||||||
class SustainedRateThrottle(UserRateThrottle):
|
class SustainedRateThrottle(UserRateThrottle):
|
||||||
"""Class for sustained rate throttle."""
|
"""Class for sustained rate throttle."""
|
||||||
|
|
||||||
scope = 'sustained'
|
scope = "sustained"
|
||||||
|
|||||||
+34
-55
@@ -41,86 +41,65 @@ from members.views import application_submit
|
|||||||
# from members.views import validateEmail, validate_success, validate_fail
|
# from members.views import validateEmail, validate_success, validate_fail
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
||||||
# landing page
|
# landing page
|
||||||
url(r'^$', member_list),
|
url(r"^$", member_list),
|
||||||
url(r'^list$', member_list),
|
url(r"^list$", member_list),
|
||||||
|
|
||||||
# add member form view
|
# add member form view
|
||||||
url(r'^add$', member_add),
|
url(r"^add$", member_add),
|
||||||
|
|
||||||
# add many members view
|
# add many members view
|
||||||
url(r'^add_many$', member_add_many),
|
url(r"^add_many$", member_add_many),
|
||||||
|
|
||||||
# edit member information view
|
# edit member information view
|
||||||
url(r'^edit/(?P<index>\d+)$', member_edit),
|
url(r"^edit/(?P<index>\d+)$", member_edit),
|
||||||
|
|
||||||
# delete confirmation view
|
# delete confirmation view
|
||||||
url(r'^delete_member_confirm/(?P<index>\d+)$', member_delete_confirm),
|
url(r"^delete_member_confirm/(?P<index>\d+)$", member_delete_confirm),
|
||||||
|
|
||||||
# list all member applications
|
# list all member applications
|
||||||
url(r'^applications$', application_list),
|
url(r"^applications$", application_list),
|
||||||
|
|
||||||
# edit member application
|
# edit member application
|
||||||
url(r'^edit_application/(?P<index>\d+)$', application_edit),
|
url(r"^edit_application/(?P<index>\d+)$", application_edit),
|
||||||
|
|
||||||
# post request targets
|
# post request targets
|
||||||
url(r'^submit_member$', member_submit),
|
url(r"^submit_member$", member_submit),
|
||||||
url(r'^update_member$', member_update),
|
url(r"^update_member$", member_update),
|
||||||
url(r'^delete_member$', member_delete),
|
url(r"^delete_member$", member_delete),
|
||||||
url(r'^submit_payment$', payment_submit),
|
url(r"^submit_payment$", payment_submit),
|
||||||
url(r'^update_payment$', payment_update),
|
url(r"^update_payment$", payment_update),
|
||||||
url(r'^delete_payment$', payment_delete),
|
url(r"^delete_payment$", payment_delete),
|
||||||
url(r'^submit_application$', application_submit),
|
url(r"^submit_application$", application_submit),
|
||||||
url(r'^accept_application$', application_accept),
|
url(r"^accept_application$", application_accept),
|
||||||
url(r'^delete_application$', application_delete),
|
url(r"^delete_application$", application_delete),
|
||||||
|
|
||||||
# the actual member application form
|
# the actual member application form
|
||||||
url(r'^application/$', application_form),
|
url(r"^application/$", application_form),
|
||||||
|
|
||||||
# delete confirmation view for applications
|
# delete confirmation view for applications
|
||||||
url(r'^delete_application_confirm/(?P<index>\d+)$',
|
url(r"^delete_application_confirm/(?P<index>\d+)$", application_delete_confirm),
|
||||||
application_delete_confirm),
|
|
||||||
|
|
||||||
# list all payment events
|
# list all payment events
|
||||||
url(r'^payments$', payment_list),
|
url(r"^payments$", payment_list),
|
||||||
|
|
||||||
# add payment event
|
# add payment event
|
||||||
url(r'^add_payment$', payment_add),
|
url(r"^add_payment$", payment_add),
|
||||||
|
|
||||||
# edit payment event
|
# edit payment event
|
||||||
url(r'^edit_payment/(?P<index>\d+)$', payment_edit),
|
url(r"^edit_payment/(?P<index>\d+)$", payment_edit),
|
||||||
|
|
||||||
# delete confirmation view
|
# delete confirmation view
|
||||||
url(r'^delete_payment_confirm/(?P<index>\d+)$', payment_delete_confirm),
|
url(r"^delete_payment_confirm/(?P<index>\d+)$", payment_delete_confirm),
|
||||||
|
|
||||||
# post endpoint for confirming multiple entries
|
# post endpoint for confirming multiple entries
|
||||||
url(r'^add_many_confirm$', add_many_confirm),
|
url(r"^add_many_confirm$", add_many_confirm),
|
||||||
|
|
||||||
# settings page
|
# settings page
|
||||||
url(r'^settings$', settings_page),
|
url(r"^settings$", settings_page),
|
||||||
|
|
||||||
# send CSV member data by POST
|
# send CSV member data by POST
|
||||||
url(r'^import_csv', import_csv),
|
url(r"^import_csv", import_csv),
|
||||||
|
|
||||||
# export members as excel file
|
# export members as excel file
|
||||||
url(r'export_members', export_members_excel),
|
url(r"export_members", export_members_excel),
|
||||||
url(r'export_payments', export_payments_excel),
|
url(r"export_payments", export_payments_excel),
|
||||||
url(r'export_applications', export_applications_excel),
|
url(r"export_applications", export_applications_excel),
|
||||||
|
|
||||||
# rest api url
|
# rest api url
|
||||||
url(r'^api/members/(?P<pk>\d+)$', MemberDetail.as_view()),
|
url(r"^api/members/(?P<pk>\d+)$", MemberDetail.as_view()),
|
||||||
|
|
||||||
# member select autocomplete view
|
# member select autocomplete view
|
||||||
url(
|
url(
|
||||||
r'^member-autocomplete/$',
|
r"^member-autocomplete/$",
|
||||||
MemberAutoComplete.as_view(),
|
MemberAutoComplete.as_view(),
|
||||||
name='member-autocomplete',
|
name="member-autocomplete",
|
||||||
),
|
),
|
||||||
|
url(r"^check", CheckByEmail.as_view()),
|
||||||
url(r'^check', CheckByEmail.as_view())
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
||||||
|
|
||||||
urlpatterns += staticfiles_urlpatterns()
|
urlpatterns += staticfiles_urlpatterns()
|
||||||
|
|||||||
@@ -21,52 +21,53 @@ from members.views import error_view
|
|||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.read_application', raise_exception=True)
|
@permission_required("members.read_application", raise_exception=True)
|
||||||
def application_list(request, *args, **kwargs):
|
def application_list(request, *args, **kwargs):
|
||||||
"""List member applications not yet processed."""
|
"""List member applications not yet processed."""
|
||||||
applications = Request.objects.all()
|
applications = Request.objects.all()
|
||||||
application_count = len(applications)
|
application_count = len(applications)
|
||||||
table = RequestTable(applications,
|
table = RequestTable(
|
||||||
request=request,
|
applications,
|
||||||
exclude=['id'],
|
request=request,
|
||||||
attrs={'class': 'table table-bordered table-hover'})
|
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)
|
table_html = convert_table_to_html(table, request)
|
||||||
context = {
|
context = {
|
||||||
'table': table_html,
|
"table": table_html,
|
||||||
'application_count': application_count,
|
"application_count": application_count,
|
||||||
'notification': request.GET.get('notification', None)
|
"notification": request.GET.get("notification", None),
|
||||||
}
|
}
|
||||||
return render(request, 'application_list.html', context)
|
return render(request, "application_list.html", context)
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.change_request', raise_exception=True)
|
@permission_required("members.change_request", raise_exception=True)
|
||||||
def application_edit(request, *args, **kwargs):
|
def application_edit(request, *args, **kwargs):
|
||||||
"""Edit member request information."""
|
"""Edit member request information."""
|
||||||
i = kwargs.pop('index', None)
|
i = kwargs.pop("index", None)
|
||||||
if i is None:
|
if i is None:
|
||||||
return error_view(request, _('No application id specified'))
|
return error_view(request, _("No application id specified"))
|
||||||
else:
|
else:
|
||||||
application = Request.objects.get(id=i)
|
application = Request.objects.get(id=i)
|
||||||
form = ApplicationForm(instance=application)
|
form = ApplicationForm(instance=application)
|
||||||
return render(
|
return render(
|
||||||
request,
|
request, "application_edit.html", {"application_id": i, "form": form}
|
||||||
'application_edit.html',
|
)
|
||||||
{'application_id': i, 'form': form})
|
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.add_member', raise_exception=True)
|
@permission_required("members.add_member", raise_exception=True)
|
||||||
def application_accept(request, *args, **kwargs):
|
def application_accept(request, *args, **kwargs):
|
||||||
"""Accept application."""
|
"""Accept application."""
|
||||||
id = request.POST.get('id', None)
|
id = request.POST.get("id", None)
|
||||||
if id is not None:
|
if id is not None:
|
||||||
application = Request.objects.get(id=id)
|
application = Request.objects.get(id=id)
|
||||||
else:
|
else:
|
||||||
@@ -78,9 +79,12 @@ def application_accept(request, *args, **kwargs):
|
|||||||
application = form.save()
|
application = form.save()
|
||||||
|
|
||||||
if Member.objects.filter(email=application.email).exists():
|
if Member.objects.filter(email=application.email).exists():
|
||||||
return error_view(request, _(
|
return error_view(
|
||||||
'Email {} is already in use by a member. Application cannot be accepted.'
|
request,
|
||||||
).format(application.email))
|
_(
|
||||||
|
"Email {} is already in use by a member. Application cannot be accepted."
|
||||||
|
).format(application.email),
|
||||||
|
)
|
||||||
|
|
||||||
member = application.to_member()
|
member = application.to_member()
|
||||||
member.save()
|
member.save()
|
||||||
@@ -88,24 +92,25 @@ def application_accept(request, *args, **kwargs):
|
|||||||
|
|
||||||
logging.info(
|
logging.info(
|
||||||
"Accepted application in member "
|
"Accepted application in member "
|
||||||
"register with the following info: {}"
|
"register with the following info: {}".format(form)
|
||||||
.format(form))
|
)
|
||||||
notification = "{} {}.".format(_("Successfully accepted application"),
|
notification = "{} {}.".format(
|
||||||
str(application))
|
_("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(
|
message = render_to_string(
|
||||||
'members:email_application_accept.html', {
|
"members:email_application_accept.html",
|
||||||
'first_name': application.first_name
|
{"first_name": application.first_name},
|
||||||
}
|
|
||||||
)
|
)
|
||||||
send_email(member.email, subject, message)
|
send_email(member.email, subject, message)
|
||||||
|
|
||||||
return HttpResponseRedirect(
|
return HttpResponseRedirect(
|
||||||
'/members/list?notification={}'.format(html.escape(notification)))
|
"/members/list?notification={}".format(html.escape(notification))
|
||||||
|
)
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
logging.exception('Exception while accepting application')
|
logging.exception("Exception while accepting application")
|
||||||
return error_view(request, str(ex))
|
return error_view(request, str(ex))
|
||||||
else:
|
else:
|
||||||
logging.info(form)
|
logging.info(form)
|
||||||
@@ -114,52 +119,55 @@ def application_accept(request, *args, **kwargs):
|
|||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.delete_request', raise_exception=True)
|
@permission_required("members.delete_request", raise_exception=True)
|
||||||
def application_delete(request, *args, **kwargs):
|
def application_delete(request, *args, **kwargs):
|
||||||
"""Delete member application."""
|
"""Delete member application."""
|
||||||
try:
|
try:
|
||||||
id = request.POST['id']
|
id = request.POST["id"]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return error_view(request, _('No application id specified'))
|
return error_view(request, _("No application id specified"))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
application = Request.objects.get(id=id)
|
application = Request.objects.get(id=id)
|
||||||
notification = "{} {}.".format(_("Successfully deleted application"),
|
notification = "{} {}.".format(
|
||||||
str(application))
|
_("Successfully deleted application"), str(application)
|
||||||
|
)
|
||||||
application.delete()
|
application.delete()
|
||||||
logging.info(
|
logging.info(
|
||||||
"Delete application in member register with the following id: {}"
|
"Delete application in member register with the following id: {}".format(id)
|
||||||
.format(id))
|
)
|
||||||
return HttpResponseRedirect(
|
return HttpResponseRedirect(
|
||||||
'/members/applications?notification={}'
|
"/members/applications?notification={}".format(html.escape(notification))
|
||||||
.format(html.escape(notification)))
|
)
|
||||||
except:
|
except:
|
||||||
return error_view(request, _('Could not delete application object'))
|
return error_view(request, _("Could not delete application object"))
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.delete_request', raise_exception=True)
|
@permission_required("members.delete_request", raise_exception=True)
|
||||||
def application_delete_confirm(request, *args, **kwargs):
|
def application_delete_confirm(request, *args, **kwargs):
|
||||||
"""Confirm application deletion."""
|
"""Confirm application deletion."""
|
||||||
i = kwargs.pop('index', None)
|
i = kwargs.pop("index", None)
|
||||||
if i is None:
|
if i is None:
|
||||||
return error_view(request, _('No application id specified'))
|
return error_view(request, _("No application id specified"))
|
||||||
else:
|
else:
|
||||||
application = Request.objects.get(id=i)
|
application = Request.objects.get(id=i)
|
||||||
form = ApplicationForm(instance=application)
|
form = ApplicationForm(instance=application)
|
||||||
return render(request,
|
return render(
|
||||||
'application_delete_confirm.html',
|
request,
|
||||||
{'application_id': i, 'form': form})
|
"application_delete_confirm.html",
|
||||||
|
{"application_id": i, "form": form},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
def application_form(request, *args, **kwargs):
|
def application_form(request, *args, **kwargs):
|
||||||
"""Render member application form."""
|
"""Render member application form."""
|
||||||
form = ApplicationForm()
|
form = ApplicationForm()
|
||||||
return render(request, 'application_index.html', {'form': form})
|
return render(request, "application_index.html", {"form": form})
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@@ -171,19 +179,22 @@ def application_submit(request, *args, **kwargs):
|
|||||||
form.save()
|
form.save()
|
||||||
try:
|
try:
|
||||||
application = form.instance
|
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(
|
message = render_to_string(
|
||||||
'members:email_application_submit.html', {
|
"members:email_application_submit.html",
|
||||||
'application': application,
|
{
|
||||||
'ayy': _('Kyllä') if application.AYY else _('Ei'),
|
"application": application,
|
||||||
'jas': _('Kyllä') if application.jas else _('Ei')
|
"ayy": _("Kyllä") if application.AYY else _("Ei"),
|
||||||
}
|
"jas": _("Kyllä") if application.jas else _("Ei"),
|
||||||
|
},
|
||||||
)
|
)
|
||||||
send_email(email, subject, message)
|
send_email(email, subject, message)
|
||||||
finally:
|
finally:
|
||||||
return render(request, 'application_success.html', {})
|
return render(request, "application_success.html", {})
|
||||||
else:
|
else:
|
||||||
return error_view(request, form.errors)
|
return error_view(request, form.errors)
|
||||||
|
|||||||
+90
-71
@@ -3,7 +3,12 @@ from django.contrib.auth.decorators import permission_required, login_required
|
|||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.views.decorators.http import require_http_methods
|
from django.views.decorators.http import require_http_methods
|
||||||
from django.views.decorators.csrf import ensure_csrf_cookie
|
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.conf import settings
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.forms.models import model_to_dict
|
from django.forms.models import model_to_dict
|
||||||
@@ -28,22 +33,24 @@ from members.views.utils import *
|
|||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.read_member', raise_exception=True)
|
@permission_required("members.read_member", raise_exception=True)
|
||||||
def member_list(request, *args, **kwargs):
|
def member_list(request, *args, **kwargs):
|
||||||
"""Render members list."""
|
"""Render members list."""
|
||||||
search = request.GET.get('q', None)
|
search = request.GET.get("q", None)
|
||||||
if search:
|
if search:
|
||||||
members = Member.find_members_by_name(search)
|
members = Member.find_members_by_name(search)
|
||||||
else:
|
else:
|
||||||
members = Member.objects.all()
|
members = Member.objects.all()
|
||||||
|
|
||||||
table = MemberTable(members,
|
table = MemberTable(
|
||||||
request=request,
|
members,
|
||||||
exclude=['id'],
|
request=request,
|
||||||
attrs={'class': 'table table-bordered table-hover'})
|
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)
|
table_html = convert_table_to_html(table, request)
|
||||||
|
|
||||||
queryset = Member.get_members_with_latest_payment(members)
|
queryset = Member.get_members_with_latest_payment(members)
|
||||||
@@ -51,61 +58,64 @@ def member_list(request, *args, **kwargs):
|
|||||||
f_day = 1
|
f_day = 1
|
||||||
f_month = 9
|
f_month = 9
|
||||||
now = timezone.now()
|
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))
|
filter_date = timezone.make_aware(datetime.datetime(now.year, f_month, f_day))
|
||||||
else:
|
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 = {
|
context = {
|
||||||
'table': table_html,
|
"table": table_html,
|
||||||
'member_count': len(members),
|
"member_count": len(members),
|
||||||
'paid_count': len(queryset.filter(last_paid__gte=filter_date)),
|
"paid_count": len(queryset.filter(last_paid__gte=filter_date)),
|
||||||
'notification': request.GET.get('notification', None),
|
"notification": request.GET.get("notification", None),
|
||||||
}
|
}
|
||||||
return render(request, 'member_list.html', context)
|
return render(request, "member_list.html", context)
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.add_member', raise_exception=True)
|
@permission_required("members.add_member", raise_exception=True)
|
||||||
def member_add(request, *args, **kwargs):
|
def member_add(request, *args, **kwargs):
|
||||||
"""Render add member page."""
|
"""Render add member page."""
|
||||||
form = MemberForm()
|
form = MemberForm()
|
||||||
return render(request, 'member_add.html', {'form': form})
|
return render(request, "member_add.html", {"form": form})
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.delete_member', raise_exception=True)
|
@permission_required("members.delete_member", raise_exception=True)
|
||||||
def member_delete_confirm(request, *args, **kwargs):
|
def member_delete_confirm(request, *args, **kwargs):
|
||||||
"""Render member deletion confirmation page."""
|
"""Render member deletion confirmation page."""
|
||||||
i = kwargs.pop('index', None)
|
i = kwargs.pop("index", None)
|
||||||
if i is None:
|
if i is None:
|
||||||
return error_view(request, _('No member id specified'))
|
return error_view(request, _("No member id specified"))
|
||||||
else:
|
else:
|
||||||
member = Member.objects.get(id=i)
|
member = Member.objects.get(id=i)
|
||||||
form = MemberForm(instance=member)
|
form = MemberForm(instance=member)
|
||||||
return render(request, 'member_delete_confirm.html',
|
return render(
|
||||||
{'member_id': i, 'form': form})
|
request, "member_delete_confirm.html", {"member_id": i, "form": form}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.add_member', raise_exception=True)
|
@permission_required("members.add_member", raise_exception=True)
|
||||||
def member_add_many(request, *args, **kwargs):
|
def member_add_many(request, *args, **kwargs):
|
||||||
"""Render add multiple members page."""
|
"""Render add multiple members page."""
|
||||||
return render(request, 'member_add_many.html', {})
|
return render(request, "member_add_many.html", {})
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.add_member', raise_exception=True)
|
@permission_required("members.add_member", raise_exception=True)
|
||||||
def add_many_confirm(request, *args, **kwargs):
|
def add_many_confirm(request, *args, **kwargs):
|
||||||
models = request.session['models']
|
models = request.session["models"]
|
||||||
payment_source = request.session['payment_source']
|
payment_source = request.session["payment_source"]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
members, payments = models.members, models.payments
|
members, payments = models.members, models.payments
|
||||||
@@ -120,40 +130,47 @@ def add_many_confirm(request, *args, **kwargs):
|
|||||||
|
|
||||||
msg = "Successfully imported {} members and {} payments."
|
msg = "Successfully imported {} members and {} payments."
|
||||||
notification = _(msg).format(len(members), len(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:
|
except Exception as ex:
|
||||||
logging.exception('Failed to save models after "add many."')
|
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
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.add_member', raise_exception=True)
|
@permission_required("members.add_member", raise_exception=True)
|
||||||
def member_submit(request, *args, **kwargs):
|
def member_submit(request, *args, **kwargs):
|
||||||
"""Add member based on data gained from member form."""
|
"""Add member based on data gained from member form."""
|
||||||
form = MemberForm(request.POST)
|
form = MemberForm(request.POST)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
form.save()
|
form.save()
|
||||||
logging.info("Saved new member to member register"
|
logging.info(
|
||||||
"with the following info: {}".format(form.cleaned_data))
|
"Saved new member to member register"
|
||||||
notification = "{} {} {}.".format(_("Successfully added member"),
|
"with the following info: {}".format(form.cleaned_data)
|
||||||
form.cleaned_data['last_name'],
|
)
|
||||||
form.cleaned_data['first_name'])
|
notification = "{} {} {}.".format(
|
||||||
|
_("Successfully added member"),
|
||||||
|
form.cleaned_data["last_name"],
|
||||||
|
form.cleaned_data["first_name"],
|
||||||
|
)
|
||||||
|
|
||||||
return HttpResponseRedirect(
|
return HttpResponseRedirect(
|
||||||
'/members/list?notification={}'.format(html.escape(notification)))
|
"/members/list?notification={}".format(html.escape(notification))
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
return error_view(request, form.errors)
|
return error_view(request, form.errors)
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.change_member', raise_exception=True)
|
@permission_required("members.change_member", raise_exception=True)
|
||||||
def member_update(request, *args, **kwargs):
|
def member_update(request, *args, **kwargs):
|
||||||
"""Update member information."""
|
"""Update member information."""
|
||||||
id = request.POST.get('id', None)
|
id = request.POST.get("id", None)
|
||||||
logging.debug(id)
|
logging.debug(id)
|
||||||
if id is not None:
|
if id is not None:
|
||||||
member = Member.objects.get(id=id)
|
member = Member.objects.get(id=id)
|
||||||
@@ -165,61 +182,63 @@ def member_update(request, *args, **kwargs):
|
|||||||
form.save()
|
form.save()
|
||||||
|
|
||||||
logging.info(
|
logging.info(
|
||||||
"Updated member in member register with the following info: {}"
|
"Updated member in member register with the following info: {}".format(form)
|
||||||
.format(form))
|
)
|
||||||
notification = "{} {} {}.".format(_("Successfully updated member"),
|
notification = "{} {} {}.".format(
|
||||||
member.last_name, member.first_name)
|
_("Successfully updated member"), member.last_name, member.first_name
|
||||||
|
)
|
||||||
return HttpResponseRedirect(
|
return HttpResponseRedirect(
|
||||||
'/members/list?notification={}'.format(html.escape(notification)))
|
"/members/list?notification={}".format(html.escape(notification))
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
return error_view(request, form.errors)
|
return error_view(request, form.errors)
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.delete_member', raise_exception=True)
|
@permission_required("members.delete_member", raise_exception=True)
|
||||||
def member_delete(request, *args, **kwargs):
|
def member_delete(request, *args, **kwargs):
|
||||||
"""Delete member."""
|
"""Delete member."""
|
||||||
try:
|
try:
|
||||||
id = request.POST['id']
|
id = request.POST["id"]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return error_view(request, _('No member id specified'))
|
return error_view(request, _("No member id specified"))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
member = Member.objects.get(id=id)
|
member = Member.objects.get(id=id)
|
||||||
notification = "{} {} {}.".format(_("Successfully deleted member"),
|
notification = "{} {} {}.".format(
|
||||||
member.last_name, member.first_name)
|
_("Successfully deleted member"), member.last_name, member.first_name
|
||||||
|
)
|
||||||
member.delete()
|
member.delete()
|
||||||
logging.info(
|
logging.info(
|
||||||
"Delete member in member register with the following id: {}"
|
"Delete member in member register with the following id: {}".format(id)
|
||||||
.format(id))
|
)
|
||||||
return HttpResponseRedirect(
|
return HttpResponseRedirect(
|
||||||
'/members/list?notification={}'.format(html.escape(notification)))
|
"/members/list?notification={}".format(html.escape(notification))
|
||||||
|
)
|
||||||
except:
|
except:
|
||||||
return error_view(request, _('Could not delete member object'))
|
return error_view(request, _("Could not delete member object"))
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.change_member', raise_exception=True)
|
@permission_required("members.change_member", raise_exception=True)
|
||||||
def member_edit(request, *args, **kwargs):
|
def member_edit(request, *args, **kwargs):
|
||||||
"""Edit member information."""
|
"""Edit member information."""
|
||||||
i = kwargs.pop('index', None)
|
i = kwargs.pop("index", None)
|
||||||
if i is None:
|
if i is None:
|
||||||
return error_view(request, _('No member id specified'))
|
return error_view(request, _("No member id specified"))
|
||||||
else:
|
else:
|
||||||
member = Member.objects.get(id=i)
|
member = Member.objects.get(id=i)
|
||||||
form = MemberForm(instance=member)
|
form = MemberForm(instance=member)
|
||||||
return render(
|
return render(request, "member_edit.html", {"member_id": i, "form": form})
|
||||||
request, 'member_edit.html', {'member_id': i, 'form': form})
|
|
||||||
|
|
||||||
|
|
||||||
@method_decorator(login_required(login_url='/admin/login'), name='dispatch')
|
@method_decorator(login_required(login_url="/admin/login"), name="dispatch")
|
||||||
@method_decorator(permission_required('members.change_member'), name='dispatch')
|
@method_decorator(permission_required("members.change_member"), name="dispatch")
|
||||||
class MemberAutoComplete(autocomplete.Select2QuerySetView):
|
class MemberAutoComplete(autocomplete.Select2QuerySetView):
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = Member.objects.all()
|
qs = Member.objects.all()
|
||||||
|
|
||||||
@@ -236,7 +255,7 @@ class CheckByEmail(APIView):
|
|||||||
permission_classes = (CheckByEmailPermission,)
|
permission_classes = (CheckByEmailPermission,)
|
||||||
|
|
||||||
def get(self, request, format=None):
|
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())
|
exists = bool(email and Member.objects.filter(email=email).exists())
|
||||||
resp = {'exists': exists}
|
resp = {"exists": exists}
|
||||||
return JsonResponse(resp)
|
return JsonResponse(resp)
|
||||||
|
|||||||
+57
-58
@@ -18,143 +18,142 @@ from members.views import error_view
|
|||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.read_payment', raise_exception=True)
|
@permission_required("members.read_payment", raise_exception=True)
|
||||||
def payment_list(request, *args, **kwargs):
|
def payment_list(request, *args, **kwargs):
|
||||||
"""Render list of payments."""
|
"""Render list of payments."""
|
||||||
search = request.GET.get('q', None)
|
search = request.GET.get("q", None)
|
||||||
if search:
|
if search:
|
||||||
payments = Payment.find_payments_by_name(search)
|
payments = Payment.find_payments_by_name(search)
|
||||||
else:
|
else:
|
||||||
payments = Payment.objects.all()
|
payments = Payment.objects.all()
|
||||||
|
|
||||||
table = PaymentTable(payments,
|
table = PaymentTable(
|
||||||
request=request,
|
payments,
|
||||||
exclude=['id'],
|
request=request,
|
||||||
attrs={'class': 'table table-bordered table-hover'})
|
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)
|
table_html = convert_table_to_html(table, request)
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'table': table_html,
|
"table": table_html,
|
||||||
'payment_count': len(payments),
|
"payment_count": len(payments),
|
||||||
'notification': request.GET.get('notification', None)
|
"notification": request.GET.get("notification", None),
|
||||||
}
|
}
|
||||||
return render(request, 'payment_list.html', context)
|
return render(request, "payment_list.html", context)
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.add_payment', raise_exception=True)
|
@permission_required("members.add_payment", raise_exception=True)
|
||||||
def payment_add(request, *args, **kwargs):
|
def payment_add(request, *args, **kwargs):
|
||||||
"""Render add payment form."""
|
"""Render add payment form."""
|
||||||
form = PaymentForm()
|
form = PaymentForm()
|
||||||
return render(request, 'payment_add.html', {'form': form})
|
return render(request, "payment_add.html", {"form": form})
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.add_payment', raise_exception=True)
|
@permission_required("members.add_payment", raise_exception=True)
|
||||||
def payment_submit(request, *args, **kwargs):
|
def payment_submit(request, *args, **kwargs):
|
||||||
"""Submit payment."""
|
"""Submit payment."""
|
||||||
form = PaymentForm(request.POST)
|
form = PaymentForm(request.POST)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
form.save()
|
form.save()
|
||||||
logging.info(
|
logging.info(
|
||||||
"Saved new payment to member register with the following info: {}"
|
"Saved new payment to member register with the following info: {}".format(
|
||||||
.format(form.cleaned_data))
|
form.cleaned_data
|
||||||
|
)
|
||||||
|
)
|
||||||
notification = "{} {}.".format(
|
notification = "{} {}.".format(
|
||||||
_("Successfully added payment for member"),
|
_("Successfully added payment for member"), form.cleaned_data["member"]
|
||||||
form.cleaned_data['member'])
|
)
|
||||||
return HttpResponseRedirect(
|
return HttpResponseRedirect(
|
||||||
'/members/payments?notification={}'
|
"/members/payments?notification={}".format(html.escape(notification))
|
||||||
.format(html.escape(notification)))
|
)
|
||||||
else:
|
else:
|
||||||
return error_view(request, form.errors)
|
return error_view(request, form.errors)
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.change_payment', raise_exception=True)
|
@permission_required("members.change_payment", raise_exception=True)
|
||||||
def payment_edit(request, *args, **kwargs):
|
def payment_edit(request, *args, **kwargs):
|
||||||
"""Edit payment."""
|
"""Edit payment."""
|
||||||
i = kwargs.pop('index', None)
|
i = kwargs.pop("index", None)
|
||||||
if i is None:
|
if i is None:
|
||||||
return error_view(request, _('No payment id specified'))
|
return error_view(request, _("No payment id specified"))
|
||||||
else:
|
else:
|
||||||
payment = Payment.objects.get(id=i)
|
payment = Payment.objects.get(id=i)
|
||||||
form = PaymentForm(instance=payment)
|
form = PaymentForm(instance=payment)
|
||||||
return render(request,
|
return render(request, "payment_edit.html", {"payment_id": i, "form": form})
|
||||||
'payment_edit.html',
|
|
||||||
{'payment_id': i, 'form': form})
|
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.delete_payment', raise_exception=True)
|
@permission_required("members.delete_payment", raise_exception=True)
|
||||||
def payment_delete_confirm(request, *args, **kwargs):
|
def payment_delete_confirm(request, *args, **kwargs):
|
||||||
"""Render payment delete confirmation page."""
|
"""Render payment delete confirmation page."""
|
||||||
i = kwargs.pop('index', None)
|
i = kwargs.pop("index", None)
|
||||||
if i is None:
|
if i is None:
|
||||||
return error_view(request, _('No payment id specified'))
|
return error_view(request, _("No payment id specified"))
|
||||||
else:
|
else:
|
||||||
payment = Payment.objects.get(id=i)
|
payment = Payment.objects.get(id=i)
|
||||||
form = PaymentForm(instance=payment)
|
form = PaymentForm(instance=payment)
|
||||||
return render(request,
|
return render(
|
||||||
'payment_delete_confirm.html',
|
request, "payment_delete_confirm.html", {"payment_id": i, "form": form}
|
||||||
{'payment_id': i, 'form': form})
|
)
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.delete_payment', raise_exception=True)
|
@permission_required("members.delete_payment", raise_exception=True)
|
||||||
def payment_delete(request, *args, **kwargs):
|
def payment_delete(request, *args, **kwargs):
|
||||||
"""Delete payment."""
|
"""Delete payment."""
|
||||||
try:
|
try:
|
||||||
id = request.POST['id']
|
id = request.POST["id"]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return error_view(request, _('No payment id specified'))
|
return error_view(request, _("No payment id specified"))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
payment = Payment.objects.get(id=id)
|
payment = Payment.objects.get(id=id)
|
||||||
notification = "{} {}.".format(
|
notification = "{} {}.".format(_("Successfully deleted payment"), str(payment))
|
||||||
_("Successfully deleted payment"), str(payment))
|
|
||||||
payment.delete()
|
payment.delete()
|
||||||
logging.info(
|
logging.info("Delete payment '{}' in member register".format(str(payment)))
|
||||||
"Delete payment '{}' in member register".format(str(payment)))
|
|
||||||
return HttpResponseRedirect(
|
return HttpResponseRedirect(
|
||||||
'/members/payments?notification={}'
|
"/members/payments?notification={}".format(html.escape(notification))
|
||||||
.format(html.escape(notification)))
|
)
|
||||||
except:
|
except:
|
||||||
return error_view(request, _('Could not delete payment object'))
|
return error_view(request, _("Could not delete payment object"))
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.change_payment', raise_exception=True)
|
@permission_required("members.change_payment", raise_exception=True)
|
||||||
def payment_update(request, *args, **kwargs):
|
def payment_update(request, *args, **kwargs):
|
||||||
"""Update payment information."""
|
"""Update payment information."""
|
||||||
form = PaymentForm(request.POST)
|
form = PaymentForm(request.POST)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
id = request.POST['id']
|
id = request.POST["id"]
|
||||||
payment = Payment.objects.get(id=id)
|
payment = Payment.objects.get(id=id)
|
||||||
form = PaymentForm(request.POST, instance=payment)
|
form = PaymentForm(request.POST, instance=payment)
|
||||||
form.save()
|
form.save()
|
||||||
|
|
||||||
logging.info(
|
logging.info(
|
||||||
"Updated member in member register with the following info: {}"
|
"Updated member in member register with the following info: {}".format(form)
|
||||||
.format(form))
|
)
|
||||||
notification = "{} {}.".format(
|
notification = "{} {}.".format(_("Successfully updated payment"), str(payment))
|
||||||
_("Successfully updated payment"), str(payment))
|
|
||||||
return HttpResponseRedirect(
|
return HttpResponseRedirect(
|
||||||
'/members/payments?notification={}'
|
"/members/payments?notification={}".format(html.escape(notification))
|
||||||
.format(html.escape(notification)))
|
)
|
||||||
else:
|
else:
|
||||||
return error_view(request, _('Could not update payment object'))
|
return error_view(request, _("Could not update payment object"))
|
||||||
|
|||||||
+59
-43
@@ -21,7 +21,13 @@ from rest_framework import generics
|
|||||||
from rest_framework import permissions
|
from rest_framework import permissions
|
||||||
|
|
||||||
from members.models import Member, Request, Payment
|
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.tables import MemberTable, PaymentTable, RequestTable
|
||||||
from members.resources import MemberResource, PaymentResource, ApplicationResource
|
from members.resources import MemberResource, PaymentResource, ApplicationResource
|
||||||
|
|
||||||
@@ -32,12 +38,15 @@ class MemberDetail(generics.RetrieveAPIView):
|
|||||||
|
|
||||||
queryset = Member.objects.all()
|
queryset = Member.objects.all()
|
||||||
serializer_class = MemberSerializer
|
serializer_class = MemberSerializer
|
||||||
permission_classes = (permissions.DjangoModelPermissions, )
|
permission_classes = (permissions.DjangoModelPermissions,)
|
||||||
throttle_classes = (BurstRateThrottle, SustainedRateThrottle, )
|
throttle_classes = (
|
||||||
|
BurstRateThrottle,
|
||||||
|
SustainedRateThrottle,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def error_view(request, message, status=400):
|
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):
|
def validate_recaptcha(response):
|
||||||
@@ -48,15 +57,15 @@ def validate_recaptcha(response):
|
|||||||
:return: Boolean, success or not
|
:return: Boolean, success or not
|
||||||
"""
|
"""
|
||||||
values = {
|
values = {
|
||||||
'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
|
"secret": settings.GOOGLE_RECAPTCHA_SECRET_KEY,
|
||||||
'response': response,
|
"response": response,
|
||||||
}
|
}
|
||||||
url = "https://www.google.com/recaptcha/api/siteverify"
|
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)
|
resp = requests.post(url, values, headers=headers)
|
||||||
try:
|
try:
|
||||||
result = json.loads(resp.text)
|
result = json.loads(resp.text)
|
||||||
logging.info('Recaptcha response: {}'.format(result))
|
logging.info("Recaptcha response: {}".format(result))
|
||||||
return result["success"]
|
return result["success"]
|
||||||
except:
|
except:
|
||||||
return False
|
return False
|
||||||
@@ -87,81 +96,88 @@ def convert_table_to_html(table, request):
|
|||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required('members.change_member', raise_exception=True)
|
@permission_required("members.change_member", raise_exception=True)
|
||||||
def settings_page(request, *args, **kwargs):
|
def settings_page(request, *args, **kwargs):
|
||||||
"""Render member app settings page."""
|
"""Render member app settings page."""
|
||||||
return render(request, 'settings.html', {})
|
return render(request, "settings.html", {})
|
||||||
|
|
||||||
|
|
||||||
@ensure_csrf_cookie
|
@ensure_csrf_cookie
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@login_required(login_url='/admin/login')
|
@login_required(login_url="/admin/login")
|
||||||
@permission_required(['members.change_member', 'members.change_payment'], raise_exception=True)
|
@permission_required(
|
||||||
|
["members.change_member", "members.change_payment"], raise_exception=True
|
||||||
|
)
|
||||||
def import_csv(request, *args, **kwargs):
|
def import_csv(request, *args, **kwargs):
|
||||||
"""Get csv data imported to page and create members based on that."""
|
"""Get csv data imported to page and create members based on that."""
|
||||||
try:
|
try:
|
||||||
csv_in_memory_file = request.FILES.get('csvFile')
|
csv_in_memory_file = request.FILES.get("csvFile")
|
||||||
csv_file = csv_in_memory_file.file
|
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', ',')
|
delimiter = request.POST.get("delimiter", ",")
|
||||||
payment_source = request.POST['payment_source']
|
payment_source = request.POST["payment_source"]
|
||||||
except:
|
except:
|
||||||
return error_view(request, _('Missing CSV file'))
|
return error_view(request, _("Missing CSV file"))
|
||||||
|
|
||||||
try:
|
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:
|
except CSVValidationError as ex:
|
||||||
logging.exception('Model validation error')
|
logging.exception("Model validation error")
|
||||||
return error_view(request, ex.form_errors)
|
return error_view(request, ex.form_errors)
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
logging.exception('Other error in CSV import')
|
logging.exception("Other error in CSV import")
|
||||||
return error_view(request, str(ex))
|
return error_view(request, str(ex))
|
||||||
|
|
||||||
member_table = MemberTable(result.members,
|
member_table = MemberTable(
|
||||||
request=request,
|
result.members,
|
||||||
exclude=['id', 'options'],
|
request=request,
|
||||||
attrs={'class': 'table table-bordered table-hover'})
|
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)
|
member_table_html = convert_table_to_html(member_table, request)
|
||||||
|
|
||||||
payment_table = PaymentTable(result.payments,
|
payment_table = PaymentTable(
|
||||||
request=request,
|
result.payments,
|
||||||
exclude=['id', 'options'],
|
request=request,
|
||||||
attrs={'class': 'table table-bordered table-hover'})
|
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)
|
payment_table_html = convert_table_to_html(payment_table, request)
|
||||||
|
|
||||||
request.session['models'] = result
|
request.session["models"] = result
|
||||||
request.session['payment_source'] = payment_source
|
request.session["payment_source"] = payment_source
|
||||||
context = {
|
context = {"members": member_table_html, "payments": payment_table_html}
|
||||||
'members': member_table_html,
|
return render(request, "member_add_many_confirm.html", context)
|
||||||
'payments': payment_table_html
|
|
||||||
}
|
|
||||||
return render(request, 'member_add_many_confirm.html', context)
|
|
||||||
|
|
||||||
|
|
||||||
def make_excel_response(Resource):
|
def make_excel_response(Resource):
|
||||||
res = Resource()
|
res = Resource()
|
||||||
dataset = res.export()
|
dataset = res.export()
|
||||||
response = HttpResponse(dataset.xlsx, content_type='application/vnd.ms-excel; charset=utf-8')
|
response = HttpResponse(
|
||||||
response['Content-Disposition'] = 'attachment; filename="export.xlsx"'
|
dataset.xlsx, content_type="application/vnd.ms-excel; charset=utf-8"
|
||||||
|
)
|
||||||
|
response["Content-Disposition"] = 'attachment; filename="export.xlsx"'
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(['GET'])
|
@require_http_methods(["GET"])
|
||||||
def export_members_excel(request, *args, **kwargs):
|
def export_members_excel(request, *args, **kwargs):
|
||||||
return make_excel_response(MemberResource)
|
return make_excel_response(MemberResource)
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(['GET'])
|
@require_http_methods(["GET"])
|
||||||
def export_payments_excel(request, *args, **kwargs):
|
def export_payments_excel(request, *args, **kwargs):
|
||||||
return make_excel_response(PaymentResource)
|
return make_excel_response(PaymentResource)
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(['GET'])
|
@require_http_methods(["GET"])
|
||||||
def export_applications_excel(request, *args, **kwargs):
|
def export_applications_excel(request, *args, **kwargs):
|
||||||
return make_excel_response(ApplicationResource)
|
return make_excel_response(ApplicationResource)
|
||||||
|
|||||||
+10
-6
@@ -3,14 +3,18 @@ import os
|
|||||||
|
|
||||||
|
|
||||||
def generate_names(n):
|
def generate_names(n):
|
||||||
'''
|
"""
|
||||||
generates list of n random names
|
generates list of n random names
|
||||||
returns tuple(first, last)
|
returns tuple(first, last)
|
||||||
'''
|
"""
|
||||||
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), "firstnames.txt")) as f:
|
with open(
|
||||||
fs = f.read().split('\n')
|
os.path.join(os.path.dirname(os.path.realpath(__file__)), "firstnames.txt")
|
||||||
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), "lastnames.txt")) as f:
|
) as f:
|
||||||
ls = f.read().split('\n')
|
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 = []
|
names = []
|
||||||
for i in range(n):
|
for i in range(n):
|
||||||
|
|||||||
+1
-1
@@ -2,4 +2,4 @@ from django.apps import AppConfig
|
|||||||
|
|
||||||
|
|
||||||
class OhlhafvConfig(AppConfig):
|
class OhlhafvConfig(AppConfig):
|
||||||
name = 'ohlhafv'
|
name = "ohlhafv"
|
||||||
|
|||||||
+1
-1
@@ -14,4 +14,4 @@ class OhlhafvForm(forms.ModelForm):
|
|||||||
"""Meta class for Ohlhafv form."""
|
"""Meta class for Ohlhafv form."""
|
||||||
|
|
||||||
model = OhlhafvChallenge
|
model = OhlhafvChallenge
|
||||||
fields = ['challenger', 'victim', 'victim_email', 'series', 'message']
|
fields = ["challenger", "victim", "victim_email", "series", "message"]
|
||||||
|
|||||||
@@ -9,24 +9,55 @@ class Migration(migrations.Migration):
|
|||||||
|
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = []
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='OhlhafvChallenge',
|
name="OhlhafvChallenge",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('challenger', models.CharField(max_length=255, verbose_name='Challenger')),
|
"id",
|
||||||
('victim', models.CharField(max_length=255, verbose_name='Victim')),
|
models.AutoField(
|
||||||
('challenger_email', models.EmailField(max_length=254, verbose_name='Challenger email')),
|
auto_created=True,
|
||||||
('victim_email', models.EmailField(max_length=254, verbose_name='Victim email')),
|
primary_key=True,
|
||||||
('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')),
|
serialize=False,
|
||||||
('message', models.TextField(blank=True, verbose_name='Message')),
|
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={
|
options={
|
||||||
'verbose_name': 'Ohlhafv challenge',
|
"verbose_name": "Ohlhafv challenge",
|
||||||
'verbose_name_plural': 'Ohlhafv challenges',
|
"verbose_name_plural": "Ohlhafv challenges",
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ from django.db import migrations
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('ohlhafv', '0001_initial'),
|
("ohlhafv", "0001_initial"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='ohlhafvchallenge',
|
model_name="ohlhafvchallenge",
|
||||||
name='challenger_email',
|
name="challenger_email",
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
+13
-13
@@ -12,32 +12,32 @@ from phonenumber_field.modelfields import PhoneNumberField
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
VERBOSE_NAME = _('Ohlhafv')
|
VERBOSE_NAME = _("Ohlhafv")
|
||||||
|
|
||||||
|
|
||||||
class OhlhafvChallenge(models.Model):
|
class OhlhafvChallenge(models.Model):
|
||||||
"""Model containing all info about ohlhafv challenge."""
|
"""Model containing all info about ohlhafv challenge."""
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('Ohlhafv challenge')
|
verbose_name = _("Ohlhafv challenge")
|
||||||
verbose_name_plural = _('Ohlhafv challenges')
|
verbose_name_plural = _("Ohlhafv challenges")
|
||||||
|
|
||||||
SERIES_CHOICES = (
|
SERIES_CHOICES = (
|
||||||
('0.33 L', '0.33 L'),
|
("0.33 L", "0.33 L"),
|
||||||
('0.5 L', '0.5 L'),
|
("0.5 L", "0.5 L"),
|
||||||
('1.0 L', '1.0 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)'))
|
("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)
|
challenger = models.CharField(_("Challenger"), max_length=255)
|
||||||
victim = models.CharField(_('Victim'), max_length=255)
|
victim = models.CharField(_("Victim"), max_length=255)
|
||||||
victim_email = models.EmailField(_('Victim email'))
|
victim_email = models.EmailField(_("Victim email"))
|
||||||
series = models.CharField(_('Series'), choices=SERIES_CHOICES, max_length=10)
|
series = models.CharField(_("Series"), choices=SERIES_CHOICES, max_length=10)
|
||||||
message = models.TextField(_('Message'), blank=True, null=False)
|
message = models.TextField(_("Message"), blank=True, null=False)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
"""Return model info."""
|
"""Return model info."""
|
||||||
return _('Ohlhafv challenge: {} vs. {}').format(self.challenger, self.victim)
|
return _("Ohlhafv challenge: {} vs. {}").format(self.challenger, self.victim)
|
||||||
|
|
||||||
|
|
||||||
auditlog.register(OhlhafvChallenge)
|
auditlog.register(OhlhafvChallenge)
|
||||||
|
|||||||
+4
-3
@@ -8,11 +8,12 @@ from ohlhafv.views import *
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
# ohlhafv
|
# ohlhafv
|
||||||
url(r'^submit', ohlhafv_submit),
|
url(r"^submit", ohlhafv_submit),
|
||||||
url(r'^list', ohlhafv_list),
|
url(r"^list", ohlhafv_list),
|
||||||
url(r'^$', ohlhafv_view)
|
url(r"^$", ohlhafv_view),
|
||||||
]
|
]
|
||||||
|
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
||||||
|
|
||||||
urlpatterns += staticfiles_urlpatterns()
|
urlpatterns += staticfiles_urlpatterns()
|
||||||
|
|||||||
+123
-140
@@ -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/
|
# 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
|
# Logger level
|
||||||
|
|
||||||
@@ -20,49 +20,47 @@ LOGPATH = os.path.join(BASE_DIR, "logs", "debug.log")
|
|||||||
|
|
||||||
|
|
||||||
def disable_pyexcel_logs(record):
|
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 False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
LOGGING = {
|
LOGGING = {
|
||||||
'version': 1,
|
"version": 1,
|
||||||
'disable_existing_loggers': False,
|
"disable_existing_loggers": False,
|
||||||
'filters': {
|
"filters": {
|
||||||
'disable_pyexcel_logs': {
|
"disable_pyexcel_logs": {
|
||||||
'()': 'django.utils.log.CallbackFilter',
|
"()": "django.utils.log.CallbackFilter",
|
||||||
'callback': disable_pyexcel_logs
|
"callback": disable_pyexcel_logs,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'formatters': {
|
"formatters": {
|
||||||
'verbose': {
|
"verbose": {"format": "%(levelname)s %(asctime)s %(module)s: %(message)s"},
|
||||||
'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': {
|
"root": {
|
||||||
'file': {
|
"handlers": ["file", "console"],
|
||||||
'level': 'DEBUG',
|
"level": "DEBUG",
|
||||||
'class': 'logging.FileHandler',
|
"propagate": True,
|
||||||
'filename': LOGPATH,
|
|
||||||
'formatter': 'verbose',
|
|
||||||
},
|
|
||||||
'console': {
|
|
||||||
'level': 'DEBUG',
|
|
||||||
'class': 'logging.StreamHandler',
|
|
||||||
'formatter': 'verbose',
|
|
||||||
'filters': ['disable_pyexcel_logs'],
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
'root': {
|
"loggers": {
|
||||||
'handlers': ['file', 'console'],
|
"django": {
|
||||||
'level': 'DEBUG',
|
"handlers": ["file", "console"],
|
||||||
'propagate': True,
|
"level": "WARNING",
|
||||||
},
|
"propagate": True,
|
||||||
'loggers': {
|
|
||||||
'django': {
|
|
||||||
'handlers': ['file', 'console'],
|
|
||||||
'level': 'WARNING',
|
|
||||||
'propagate': True,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -71,121 +69,117 @@ LOGGING = {
|
|||||||
# Application definition
|
# Application definition
|
||||||
|
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
'modeltranslation', # has to be before admin for translation admin to work
|
"modeltranslation", # has to be before admin for translation admin to work
|
||||||
'suit',
|
"suit",
|
||||||
'dal',
|
"dal",
|
||||||
'dal_select2',
|
"dal_select2",
|
||||||
'django.contrib.admin',
|
"django.contrib.admin",
|
||||||
'django.contrib.auth',
|
"django.contrib.auth",
|
||||||
'django.contrib.contenttypes',
|
"django.contrib.contenttypes",
|
||||||
'django.contrib.sessions',
|
"django.contrib.sessions",
|
||||||
'django.contrib.messages',
|
"django.contrib.messages",
|
||||||
'django.contrib.staticfiles',
|
"django.contrib.staticfiles",
|
||||||
'rest_framework.authtoken',
|
"rest_framework.authtoken",
|
||||||
'corsheaders',
|
"corsheaders",
|
||||||
'webapp',
|
"webapp",
|
||||||
'members',
|
"members",
|
||||||
'infoscreen',
|
"infoscreen",
|
||||||
'kaehmy',
|
"kaehmy",
|
||||||
'ohlhafv',
|
"ohlhafv",
|
||||||
'rest_framework',
|
"rest_framework",
|
||||||
'rest_framework_jwt',
|
"rest_framework_jwt",
|
||||||
'django_nose',
|
"django_nose",
|
||||||
'bootstrap3',
|
"bootstrap3",
|
||||||
'django_tables2',
|
"django_tables2",
|
||||||
'auditlog',
|
"auditlog",
|
||||||
'phonenumber_field',
|
"phonenumber_field",
|
||||||
'import_export',
|
"import_export",
|
||||||
'django_filters',
|
"django_filters",
|
||||||
]
|
]
|
||||||
|
|
||||||
IMPORT_EXPORT_USE_TRANSACTIONS = True
|
IMPORT_EXPORT_USE_TRANSACTIONS = True
|
||||||
|
|
||||||
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
|
TEST_RUNNER = "django_nose.NoseTestSuiteRunner"
|
||||||
|
|
||||||
NOSE_ARGS = [
|
NOSE_ARGS = [
|
||||||
'--with-coverage',
|
"--with-coverage",
|
||||||
'--cover-package=webapp,members,infoscreen',
|
"--cover-package=webapp,members,infoscreen",
|
||||||
'--exclude-dir={}'.format(os.path.join(BASE_DIR, 'members', 'migrations')),
|
"--exclude-dir={}".format(os.path.join(BASE_DIR, "members", "migrations")),
|
||||||
'--exclude-dir={}'.format(os.path.join(BASE_DIR,
|
"--exclude-dir={}".format(os.path.join(BASE_DIR, "infoscreen", "migrations")),
|
||||||
'infoscreen', 'migrations')),
|
"--exclude-dir={}".format(os.path.join(BASE_DIR, "webapp", "migrations")),
|
||||||
'--exclude-dir={}'.format(os.path.join(BASE_DIR, 'webapp', 'migrations')),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
'sikweb.middleware.ForceDefaultLanguageMiddleware',
|
"sikweb.middleware.ForceDefaultLanguageMiddleware",
|
||||||
'django.middleware.security.SecurityMiddleware',
|
"django.middleware.security.SecurityMiddleware",
|
||||||
'whitenoise.middleware.WhiteNoiseMiddleware',
|
"whitenoise.middleware.WhiteNoiseMiddleware",
|
||||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
"django.contrib.sessions.middleware.SessionMiddleware",
|
||||||
'django.middleware.locale.LocaleMiddleware',
|
"django.middleware.locale.LocaleMiddleware",
|
||||||
'corsheaders.middleware.CorsMiddleware',
|
"corsheaders.middleware.CorsMiddleware",
|
||||||
'django.middleware.common.CommonMiddleware',
|
"django.middleware.common.CommonMiddleware",
|
||||||
'django.middleware.csrf.CsrfViewMiddleware',
|
"django.middleware.csrf.CsrfViewMiddleware",
|
||||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
"django.contrib.auth.middleware.AuthenticationMiddleware",
|
||||||
'django.contrib.messages.middleware.MessageMiddleware',
|
"django.contrib.messages.middleware.MessageMiddleware",
|
||||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
"django.middleware.clickjacking.XFrameOptionsMiddleware",
|
||||||
'auditlog.middleware.AuditlogMiddleware'
|
"auditlog.middleware.AuditlogMiddleware",
|
||||||
]
|
]
|
||||||
|
|
||||||
CORS_ORIGIN_ALLOW_ALL = True
|
CORS_ORIGIN_ALLOW_ALL = True
|
||||||
|
|
||||||
ROOT_URLCONF = 'sikweb.urls'
|
ROOT_URLCONF = "sikweb.urls"
|
||||||
|
|
||||||
TEMPLATES = [
|
TEMPLATES = [
|
||||||
{
|
{
|
||||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
||||||
'DIRS': ['templates'],
|
"DIRS": ["templates"],
|
||||||
'OPTIONS': {
|
"OPTIONS": {
|
||||||
'loaders': [
|
"loaders": [
|
||||||
'app_namespace.Loader',
|
"app_namespace.Loader",
|
||||||
'django.template.loaders.filesystem.Loader',
|
"django.template.loaders.filesystem.Loader",
|
||||||
'django.template.loaders.app_directories.Loader',
|
"django.template.loaders.app_directories.Loader",
|
||||||
],
|
],
|
||||||
'context_processors': [
|
"context_processors": [
|
||||||
'django.template.context_processors.debug',
|
"django.template.context_processors.debug",
|
||||||
'django.template.context_processors.request',
|
"django.template.context_processors.request",
|
||||||
'django.template.context_processors.i18n',
|
"django.template.context_processors.i18n",
|
||||||
'django.contrib.auth.context_processors.auth',
|
"django.contrib.auth.context_processors.auth",
|
||||||
'django.contrib.messages.context_processors.messages',
|
"django.contrib.messages.context_processors.messages",
|
||||||
'django.template.context_processors.static',
|
"django.template.context_processors.static",
|
||||||
'dealer.contrib.django.context_processor',
|
"dealer.contrib.django.context_processor",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
WSGI_APPLICATION = 'sikweb.wsgi.application'
|
WSGI_APPLICATION = "sikweb.wsgi.application"
|
||||||
|
|
||||||
# Password validation
|
# Password validation
|
||||||
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
|
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
|
||||||
|
|
||||||
AUTH_PASSWORD_VALIDATORS = [
|
AUTH_PASSWORD_VALIDATORS = [
|
||||||
{
|
{
|
||||||
'NAME': 'django.contrib.auth.password_validation.'
|
"NAME": "django.contrib.auth.password_validation."
|
||||||
'UserAttributeSimilarityValidator',
|
"UserAttributeSimilarityValidator",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'NAME': 'django.contrib.auth.password_validation.'
|
"NAME": "django.contrib.auth.password_validation." "MinimumLengthValidator",
|
||||||
'MinimumLengthValidator',
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'NAME': 'django.contrib.auth.password_validation.'
|
"NAME": "django.contrib.auth.password_validation." "CommonPasswordValidator",
|
||||||
'CommonPasswordValidator',
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'NAME': 'django.contrib.auth.password_validation.'
|
"NAME": "django.contrib.auth.password_validation." "NumericPasswordValidator",
|
||||||
'NumericPasswordValidator',
|
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
REST_FRAMEWORK = {
|
REST_FRAMEWORK = {
|
||||||
'DEFAULT_PERMISSION_CLASSES': (
|
"DEFAULT_PERMISSION_CLASSES": (
|
||||||
'rest_framework.permissions.IsAuthenticated',
|
"rest_framework.permissions.IsAuthenticated",
|
||||||
'rest_framework.permissions.DjangoModelPermissions',
|
"rest_framework.permissions.DjangoModelPermissions",
|
||||||
'rest_framework.permissions.IsAdminUser',
|
"rest_framework.permissions.IsAdminUser",
|
||||||
),
|
),
|
||||||
'DEFAULT_AUTHENTICATION_CLASSES': (
|
"DEFAULT_AUTHENTICATION_CLASSES": (
|
||||||
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
|
"rest_framework_jwt.authentication.JSONWebTokenAuthentication",
|
||||||
),
|
),
|
||||||
# 'DEFAULT_THROTTLE_CLASSES': (
|
# 'DEFAULT_THROTTLE_CLASSES': (
|
||||||
# 'members.throttles.BurstRateThrottle',
|
# 'members.throttles.BurstRateThrottle',
|
||||||
@@ -195,11 +189,9 @@ REST_FRAMEWORK = {
|
|||||||
# 'burst': '60/min',
|
# 'burst': '60/min',
|
||||||
# 'sustained': '1000/day'
|
# 'sustained': '1000/day'
|
||||||
# },
|
# },
|
||||||
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
|
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
|
||||||
'PAGE_SIZE': 1000,
|
"PAGE_SIZE": 1000,
|
||||||
'DEFAULT_FILTER_BACKENDS': (
|
"DEFAULT_FILTER_BACKENDS": ("django_filters.rest_framework.DjangoFilterBackend",),
|
||||||
'django_filters.rest_framework.DjangoFilterBackend',
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Email settings (tested working with gmail)
|
# Email settings (tested working with gmail)
|
||||||
@@ -213,17 +205,15 @@ REST_FRAMEWORK = {
|
|||||||
# https://docs.djangoproject.com/en/1.9/topics/i18n/
|
# https://docs.djangoproject.com/en/1.9/topics/i18n/
|
||||||
|
|
||||||
LANGUAGES = (
|
LANGUAGES = (
|
||||||
('fi', _('Finnish')),
|
("fi", _("Finnish")),
|
||||||
('en', _('English')),
|
("en", _("English")),
|
||||||
)
|
)
|
||||||
|
|
||||||
LANGUAGE_CODE = 'fi'
|
LANGUAGE_CODE = "fi"
|
||||||
|
|
||||||
LOCALE_PATHS = (
|
LOCALE_PATHS = (os.path.join(BASE_DIR, "locale"),)
|
||||||
os.path.join(BASE_DIR, 'locale'),
|
|
||||||
)
|
|
||||||
|
|
||||||
TIME_ZONE = 'Europe/Helsinki'
|
TIME_ZONE = "Europe/Helsinki"
|
||||||
|
|
||||||
USE_I18N = True
|
USE_I18N = True
|
||||||
|
|
||||||
@@ -235,30 +225,26 @@ USE_TZ = True
|
|||||||
# Static files (CSS, JavaScript, Images)
|
# Static files (CSS, JavaScript, Images)
|
||||||
# https://docs.djangoproject.com/en/1.9/howto/static-files/
|
# https://docs.djangoproject.com/en/1.9/howto/static-files/
|
||||||
STATICFILES_FINDERS = (
|
STATICFILES_FINDERS = (
|
||||||
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
|
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
|
||||||
'django.contrib.staticfiles.finders.FileSystemFinder',
|
"django.contrib.staticfiles.finders.FileSystemFinder",
|
||||||
)
|
)
|
||||||
STATIC_URL = '/static/'
|
STATIC_URL = "/static/"
|
||||||
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')
|
STATIC_ROOT = os.path.join(BASE_DIR, "collected_static")
|
||||||
STATICFILES_DIRS = (
|
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
|
||||||
os.path.join(BASE_DIR, 'static'),
|
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
|
||||||
)
|
MEDIA_URL = "/media/"
|
||||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
|
||||||
MEDIA_URL = '/media/'
|
|
||||||
|
|
||||||
LOGIN_URL = '/login/'
|
LOGIN_URL = "/login/"
|
||||||
LOGIN_REDIRECT_URL = '/admin'
|
LOGIN_REDIRECT_URL = "/admin"
|
||||||
|
|
||||||
SUIT_CONFIG = {
|
SUIT_CONFIG = {
|
||||||
# header
|
# header
|
||||||
'ADMIN_NAME': 'SIK Admin',
|
"ADMIN_NAME": "SIK Admin",
|
||||||
# 'HEADER_DATE_FORMAT': 'l, j. F Y',
|
# 'HEADER_DATE_FORMAT': 'l, j. F Y',
|
||||||
# 'HEADER_TIME_FORMAT': 'H:i',
|
# 'HEADER_TIME_FORMAT': 'H:i',
|
||||||
|
|
||||||
# forms
|
# forms
|
||||||
# 'SHOW_REQUIRED_ASTERISK': True, # Default True
|
# 'SHOW_REQUIRED_ASTERISK': True, # Default True
|
||||||
# 'CONFIRM_UNSAVED_CHANGES': True, # Default True
|
# 'CONFIRM_UNSAVED_CHANGES': True, # Default True
|
||||||
|
|
||||||
# menu
|
# menu
|
||||||
# 'SEARCH_URL': '/admin/auth/user/',
|
# 'SEARCH_URL': '/admin/auth/user/',
|
||||||
# 'MENU_ICONS': {
|
# 'MENU_ICONS': {
|
||||||
@@ -273,11 +259,8 @@ SUIT_CONFIG = {
|
|||||||
# {'label': 'Settings', 'icon':'icon-cog', 'models': ('auth.user', 'auth.group')},
|
# {'label': 'Settings', 'icon':'icon-cog', 'models': ('auth.user', 'auth.group')},
|
||||||
# {'label': 'Support', 'icon':'icon-question-sign', 'url': '/support/'},
|
# {'label': 'Support', 'icon':'icon-question-sign', 'url': '/support/'},
|
||||||
# ),
|
# ),
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
# 'LIST_PER_PAGE': 15
|
# 'LIST_PER_PAGE': 15
|
||||||
}
|
}
|
||||||
|
|
||||||
JWT_AUTH = {
|
JWT_AUTH = {"JWT_EXPIRATION_DELTA": datetime.timedelta(days=7)}
|
||||||
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -8,9 +8,10 @@ def ForceDefaultLanguageMiddleware(get_response):
|
|||||||
Should be installed *before* any middleware that checks request.META['HTTP_ACCEPT_LANGUAGE'],
|
Should be installed *before* any middleware that checks request.META['HTTP_ACCEPT_LANGUAGE'],
|
||||||
namely django.middleware.locale.LocaleMiddleware
|
namely django.middleware.locale.LocaleMiddleware
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def process_request(request):
|
def process_request(request):
|
||||||
if 'HTTP_ACCEPT_LANGUAGE' in request.META:
|
if "HTTP_ACCEPT_LANGUAGE" in request.META:
|
||||||
del request.META['HTTP_ACCEPT_LANGUAGE']
|
del request.META["HTTP_ACCEPT_LANGUAGE"]
|
||||||
return get_response(request)
|
return get_response(request)
|
||||||
|
|
||||||
return process_request
|
return process_request
|
||||||
|
|||||||
+29
-26
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
Django settings for sikweb project.
|
Django settings for sikweb project.
|
||||||
|
|
||||||
@@ -15,8 +14,8 @@ import sentry_sdk
|
|||||||
from sentry_sdk.integrations.django import DjangoIntegration
|
from sentry_sdk.integrations.django import DjangoIntegration
|
||||||
from sikweb.base import *
|
from sikweb.base import *
|
||||||
|
|
||||||
SENTRY_DSN = os.getenv('SENTRY_DSN', '')
|
SENTRY_DSN = os.getenv("SENTRY_DSN", "")
|
||||||
DEPLOY_ENV = os.getenv('DEPLOY_ENV', 'production')
|
DEPLOY_ENV = os.getenv("DEPLOY_ENV", "production")
|
||||||
|
|
||||||
# Setup sentry
|
# Setup sentry
|
||||||
sentry_sdk.init(
|
sentry_sdk.init(
|
||||||
@@ -25,52 +24,56 @@ sentry_sdk.init(
|
|||||||
integrations=[DjangoIntegration()],
|
integrations=[DjangoIntegration()],
|
||||||
# If you wish to associate users to errors (assuming you are using
|
# If you wish to associate users to errors (assuming you are using
|
||||||
# django.contrib.auth) you may enable sending PII data.
|
# 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!
|
# 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')
|
URL = os.getenv("HOST", "api.sahkoinsinoorikilta.fi")
|
||||||
FRONTEND_URL = os.getenv('FRONTEND_URL', 'sahkoinsinoorikilta.fi')
|
FRONTEND_URL = os.getenv("FRONTEND_URL", "sahkoinsinoorikilta.fi")
|
||||||
ALLOWED_HOSTS = ['localhost', '127.0.0.1', FRONTEND_URL, URL]
|
ALLOWED_HOSTS = ["localhost", "127.0.0.1", FRONTEND_URL, URL]
|
||||||
if DEBUG:
|
if DEBUG:
|
||||||
ALLOWED_HOSTS = ['*']
|
ALLOWED_HOSTS = ["*"]
|
||||||
|
|
||||||
USE_X_FORWARDED_HOST = True
|
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!
|
# 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
|
# ReCaptcha
|
||||||
# http://www.yaconiello.com/blog/integrating-google-recaptcha-to-django/
|
# 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_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_SECRET_KEY = os.getenv(
|
||||||
|
"GOOGLE_RECAPTCHA_SECRET_KEY", "YOUR-PRIVATE-KEY"
|
||||||
|
)
|
||||||
|
|
||||||
# Email settings (more settings in base.py)
|
# 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', '')
|
# EMAIL_API_SECRET = os.getenv('EMAIL_API_SECRET', '')
|
||||||
DEFAULT_EMAIL_FROM = 'SIK'
|
DEFAULT_EMAIL_FROM = "SIK"
|
||||||
DEFAULT_EMAIL_FROM_ADDR = 'noreply@sahkoinsinoorikilta.fi'
|
DEFAULT_EMAIL_FROM_ADDR = "noreply@sahkoinsinoorikilta.fi"
|
||||||
ENABLE_AUTOMATIC_EMAILS = True
|
ENABLE_AUTOMATIC_EMAILS = True
|
||||||
|
|
||||||
# Token for Telegram bot
|
# Token for Telegram bot
|
||||||
TELEGRAM_BOT_TOKEN = os.getenv('TG_BOT_TOKEN', '<tg token>')
|
TELEGRAM_BOT_TOKEN = os.getenv("TG_BOT_TOKEN", "<tg token>")
|
||||||
|
|
||||||
# Database settings
|
# Database settings
|
||||||
# Only uncomment if default settings in base.py are not ok
|
# 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 = {
|
DATABASES = {
|
||||||
'default': {
|
"default": {
|
||||||
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
"ENGINE": "django.db.backends.postgresql_psycopg2",
|
||||||
'NAME': os.getenv('DB_NAME', 'postgres'),
|
"NAME": os.getenv("DB_NAME", "postgres"),
|
||||||
'USER': os.getenv('DB_USER', 'postgres'),
|
"USER": os.getenv("DB_USER", "postgres"),
|
||||||
'PASSWORD': os.getenv('DB_PASSWD', 'postgres'),
|
"PASSWORD": os.getenv("DB_PASSWD", "postgres"),
|
||||||
'HOST': os.getenv('DB_HOST', 'localhost'),
|
"HOST": os.getenv("DB_HOST", "localhost"),
|
||||||
'PORT': os.getenv('DB_PORT', 5432),
|
"PORT": os.getenv("DB_PORT", 5432),
|
||||||
'OPTIONS': DB_OPTIONS,
|
"OPTIONS": DB_OPTIONS,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-17
@@ -23,28 +23,22 @@ from django.conf import settings
|
|||||||
from django.contrib.staticfiles import views as static_views
|
from django.contrib.staticfiles import views as static_views
|
||||||
from django.views.generic.base import RedirectView
|
from django.views.generic.base import RedirectView
|
||||||
|
|
||||||
favicon_view = RedirectView.as_view(
|
favicon_view = RedirectView.as_view(url="static/img/favicon.png", permanent=True)
|
||||||
url='static/img/favicon.png', permanent=True)
|
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'', include('webapp.urls')),
|
url(r"", include("webapp.urls")),
|
||||||
url(r'^members/', include('members.urls')),
|
url(r"^members/", include("members.urls")),
|
||||||
url(r'^infoscreen/', include('infoscreen.urls')),
|
url(r"^infoscreen/", include("infoscreen.urls")),
|
||||||
url(r'^kaehmy/', include('kaehmy.urls')),
|
url(r"^kaehmy/", include("kaehmy.urls")),
|
||||||
url(r'^ohlhafv/', include('ohlhafv.urls')),
|
url(r"^ohlhafv/", include("ohlhafv.urls")),
|
||||||
|
|
||||||
# favourite icon
|
# favourite icon
|
||||||
url(r'^favicon\.ico$', favicon_view),
|
url(r"^favicon\.ico$", favicon_view),
|
||||||
|
|
||||||
# admin
|
# admin
|
||||||
url(r'^admin/', admin.site.urls),
|
url(r"^admin/", admin.site.urls),
|
||||||
|
|
||||||
# i18n default view for changing the active language
|
# 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
|
# staticfiles default view for static files in development
|
||||||
url(r'^static/(?P<path>.*)$', static_views.serve),
|
url(r"^static/(?P<path>.*)$", static_views.serve),
|
||||||
url(r'^media/(?P<path>.*)$',
|
url(r"^media/(?P<path>.*)$", static_serve, {"document_root": settings.MEDIA_ROOT}),
|
||||||
static_serve, {'document_root': settings.MEDIA_ROOT}),
|
|
||||||
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from django.contrib import admin
|
|||||||
from webapp.models import Feed, Tag, Event, Signup, SignupForm, TemplateQuestion, JobAd
|
from webapp.models import Feed, Tag, Event, Signup, SignupForm, TemplateQuestion, JobAd
|
||||||
from modeltranslation.admin import TranslationAdmin
|
from modeltranslation.admin import TranslationAdmin
|
||||||
from django.contrib.auth.models import Permission
|
from django.contrib.auth.models import Permission
|
||||||
|
|
||||||
# this is needed so that the models get registered for translation
|
# this is needed so that the models get registered for translation
|
||||||
import webapp.translation
|
import webapp.translation
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ from django.apps import AppConfig
|
|||||||
class WebappConfig(AppConfig):
|
class WebappConfig(AppConfig):
|
||||||
"""Webapp configurations."""
|
"""Webapp configurations."""
|
||||||
|
|
||||||
name = 'webapp'
|
name = "webapp"
|
||||||
|
|
||||||
def ready(self):
|
def ready(self):
|
||||||
"""Import translations."""
|
"""Import translations."""
|
||||||
|
|||||||
@@ -17,4 +17,8 @@ class Command(BaseCommand):
|
|||||||
u.is_staff = True
|
u.is_staff = True
|
||||||
u.save()
|
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
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|||||||
@@ -10,17 +10,18 @@ from django.core.management.base import BaseCommand, CommandError
|
|||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
|
|
||||||
print('THIS SCRIPT WILL GENERATE DUMMY VALUES TO DATABASE '
|
print(
|
||||||
'AND SHOULD __NEVER__ BE RUN ON PRODUCTION. '
|
"THIS SCRIPT WILL GENERATE DUMMY VALUES TO DATABASE "
|
||||||
'IF YOU ARE ON PRODUCTION ABORT (ctrl-c) IMMEDIATELY!!!! '
|
"AND SHOULD __NEVER__ BE RUN ON PRODUCTION. "
|
||||||
'CONTINUING IN 10 SECONDS')
|
"IF YOU ARE ON PRODUCTION ABORT (ctrl-c) IMMEDIATELY!!!! "
|
||||||
|
"CONTINUING IN 10 SECONDS"
|
||||||
|
)
|
||||||
|
|
||||||
time.sleep(10)
|
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"]
|
PLACES = ["Helsinki", "Espoo", "Korso", "Kerava", "Kouvostoliitto"]
|
||||||
MEMBER_COUNT = 30
|
MEMBER_COUNT = 30
|
||||||
MEMBER_REQUEST_COUNT = 3
|
MEMBER_REQUEST_COUNT = 3
|
||||||
@@ -28,44 +29,37 @@ class Command(BaseCommand):
|
|||||||
names = generate_names(MEMBER_COUNT)
|
names = generate_names(MEMBER_COUNT)
|
||||||
for i in range(MEMBER_COUNT):
|
for i in range(MEMBER_COUNT):
|
||||||
first, last = names[i]
|
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)
|
por = random.choice(PLACES)
|
||||||
ayy = random.randint(0, 1)
|
ayy = random.randint(0, 1)
|
||||||
jas = random.randint(0, 1)
|
jas = random.randint(0, 1)
|
||||||
Member.objects.create(first_name=first,
|
Member.objects.create(
|
||||||
last_name=last,
|
first_name=first, last_name=last, email=mail, POR=por, AYY=ayy, jas=jas
|
||||||
email=mail,
|
)
|
||||||
POR=por,
|
|
||||||
AYY=ayy,
|
|
||||||
jas=jas)
|
|
||||||
|
|
||||||
i_item = ExternalImageInfoItem.objects.create(
|
i_item = ExternalImageInfoItem.objects.create(
|
||||||
name="Heavy",
|
name="Heavy", url="https://i.imgur.com/XXSSqDG.gif"
|
||||||
url="https://i.imgur.com/XXSSqDG.gif"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
rot = Rotation.objects.create(name="Demo")
|
rot = Rotation.objects.create(name="Demo")
|
||||||
inst = InfoInstance.objects.create(
|
inst = InfoInstance.objects.create(rotation=rot, item=i_item, duration=20.0)
|
||||||
rotation=rot,
|
|
||||||
item=i_item,
|
|
||||||
duration=20.0
|
|
||||||
)
|
|
||||||
|
|
||||||
names = generate_names(MEMBER_COUNT)
|
names = generate_names(MEMBER_COUNT)
|
||||||
for i in range(MEMBER_COUNT):
|
for i in range(MEMBER_COUNT):
|
||||||
first, last = names[i]
|
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)
|
por = random.choice(PLACES)
|
||||||
ayy = random.randint(0, 1)
|
ayy = random.randint(0, 1)
|
||||||
jas = random.randint(0, 1)
|
jas = random.randint(0, 1)
|
||||||
Member.objects.create(first_name=first,
|
Member.objects.create(
|
||||||
last_name=last,
|
first_name=first, last_name=last, email=mail, POR=por, AYY=ayy, jas=jas
|
||||||
email=mail,
|
)
|
||||||
POR=por,
|
|
||||||
AYY=ayy,
|
|
||||||
jas=jas)
|
|
||||||
|
|
||||||
TAGS = ["Party", "International", "Freshmen", "Culture"]
|
TAGS = ["Party", "International", "Freshmen", "Culture"]
|
||||||
TAG_COUNT = 2
|
TAG_COUNT = 2
|
||||||
@@ -74,9 +68,9 @@ class Command(BaseCommand):
|
|||||||
slug = TAGS[i] + str(random.randint(0, 10))
|
slug = TAGS[i] + str(random.randint(0, 10))
|
||||||
name = slug + str(random.randint(0, 10))
|
name = slug + str(random.randint(0, 10))
|
||||||
print(slug, name)
|
print(slug, name)
|
||||||
Tag.objects.create(slug=slug,
|
Tag.objects.create(
|
||||||
name=name,
|
slug=slug, name=name, icon="http://testiurl.com/kuva.jpg"
|
||||||
icon="http://testiurl.com/kuva.jpg")
|
)
|
||||||
|
|
||||||
FEED_COUNT = 3
|
FEED_COUNT = 3
|
||||||
|
|
||||||
@@ -84,10 +78,9 @@ class Command(BaseCommand):
|
|||||||
title = "ds" + str(random.randint(0, 15))
|
title = "ds" + str(random.randint(0, 15))
|
||||||
description = "dsg" + str(random.randint(0, 20))
|
description = "dsg" + str(random.randint(0, 20))
|
||||||
content = "fdfd"
|
content = "fdfd"
|
||||||
Feed.objects.create(title=title,
|
Feed.objects.create(
|
||||||
visible=True,
|
title=title, visible=True, description=description, content=content
|
||||||
description=description,
|
)
|
||||||
content=content)
|
|
||||||
tag1 = Tag.objects.get(id=1)
|
tag1 = Tag.objects.get(id=1)
|
||||||
Feed.objects.get(title=title).tags.add(tag1)
|
Feed.objects.get(title=title).tags.add(tag1)
|
||||||
tag2 = Tag.objects.get(id=1)
|
tag2 = Tag.objects.get(id=1)
|
||||||
|
|||||||
@@ -4,42 +4,56 @@ from django.contrib.contenttypes.models import ContentType
|
|||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
'''
|
"""
|
||||||
Creates initial skeleton for the webapp.
|
Creates initial skeleton for the webapp.
|
||||||
This command MUST do nothing if already run.
|
This command MUST do nothing if already run.
|
||||||
'''
|
"""
|
||||||
|
|
||||||
def create_infoscreen_moderator(self):
|
def create_infoscreen_moderator(self):
|
||||||
self.stdout.write("Creating infoscreen moderator group")
|
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:
|
if not created:
|
||||||
self.stdout.write('The group "infoscreen moderators" already existed '
|
self.stdout.write(
|
||||||
'and was not therefore created')
|
'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)
|
permissions = Permission.objects.filter(content_type__in=cts)
|
||||||
infoscreen_group.permissions.add(*permissions)
|
infoscreen_group.permissions.add(*permissions)
|
||||||
|
|
||||||
def create_member_register_viewer(self):
|
def create_member_register_viewer(self):
|
||||||
self.stdout.write("Creating member register viewer group")
|
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:
|
if not created:
|
||||||
self.stdout.write('The group "member register viewers" already existed '
|
self.stdout.write(
|
||||||
'and was not therefore created')
|
'The group "member register viewers" already existed '
|
||||||
|
"and was not therefore created"
|
||||||
|
)
|
||||||
|
|
||||||
cts = ContentType.objects.filter(app_label='members')
|
cts = ContentType.objects.filter(app_label="members")
|
||||||
members_permissions = Permission.objects.filter(content_type__in=cts, codename__contains='read')
|
members_permissions = Permission.objects.filter(
|
||||||
|
content_type__in=cts, codename__contains="read"
|
||||||
|
)
|
||||||
|
|
||||||
viewers_group.permissions.add(*members_permissions)
|
viewers_group.permissions.add(*members_permissions)
|
||||||
|
|
||||||
def create_member_register_administrator(self):
|
def create_member_register_administrator(self):
|
||||||
self.stdout.write("Creating member register administrator group")
|
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:
|
if not created:
|
||||||
self.stdout.write('The group "member register administrators" already existed '
|
self.stdout.write(
|
||||||
'and was not therefore created')
|
'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)
|
permissions = Permission.objects.filter(content_type__in=cts)
|
||||||
admins_group.permissions.add(*permissions)
|
admins_group.permissions.add(*permissions)
|
||||||
|
|
||||||
@@ -47,13 +61,20 @@ class Command(BaseCommand):
|
|||||||
self.stdout.write("Creating official group")
|
self.stdout.write("Creating official group")
|
||||||
officials_group, created = Group.objects.get_or_create(name="officials")
|
officials_group, created = Group.objects.get_or_create(name="officials")
|
||||||
if not created:
|
if not created:
|
||||||
self.stdout.write('The group "officials" already existed '
|
self.stdout.write(
|
||||||
'and was not therefore created')
|
'The group "officials" already existed ' "and was not therefore created"
|
||||||
|
)
|
||||||
|
|
||||||
cts = ContentType.objects.filter(app_label='webapp')
|
cts = ContentType.objects.filter(app_label="webapp")
|
||||||
feed_permissions = Permission.objects.filter(content_type__in=cts, codename__contains='feed')
|
feed_permissions = Permission.objects.filter(
|
||||||
event_permissions = Permission.objects.filter(content_type__in=cts, codename__contains='event')
|
content_type__in=cts, codename__contains="feed"
|
||||||
registration_permissions = Permission.objects.filter(content_type__in=cts, codename__contains='registration')
|
)
|
||||||
|
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(*feed_permissions)
|
||||||
officials_group.permissions.add(*event_permissions)
|
officials_group.permissions.add(*event_permissions)
|
||||||
@@ -61,12 +82,16 @@ class Command(BaseCommand):
|
|||||||
|
|
||||||
def create_webapp_administrator(self):
|
def create_webapp_administrator(self):
|
||||||
self.stdout.write("Creating webapp administrator group")
|
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:
|
if not created:
|
||||||
self.stdout.write('The group "webapp administrators" already existed '
|
self.stdout.write(
|
||||||
'and was not therefore created')
|
'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)
|
permissions = Permission.objects.filter(content_type__in=cts)
|
||||||
admins_group.permissions.add(*permissions)
|
admins_group.permissions.add(*permissions)
|
||||||
|
|
||||||
|
|||||||
@@ -11,46 +11,94 @@ class Migration(migrations.Migration):
|
|||||||
|
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = []
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Info',
|
name="Info",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='InfoTr',
|
name="InfoTr",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('lang', models.CharField(default='fi', max_length=2)),
|
"id",
|
||||||
('topic', models.CharField(max_length=255)),
|
models.AutoField(
|
||||||
('content', models.TextField()),
|
auto_created=True,
|
||||||
('translation_for', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='webapp.Info')),
|
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(
|
migrations.CreateModel(
|
||||||
name='Tag',
|
name="Tag",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='TagTr',
|
name="TagTr",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('lang', models.CharField(default='fi', max_length=2)),
|
"id",
|
||||||
('name', models.CharField(max_length=127)),
|
models.AutoField(
|
||||||
('translation_for', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='webapp.Tag')),
|
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(
|
migrations.AddField(
|
||||||
model_name='info',
|
model_name="info",
|
||||||
name='tags',
|
name="tags",
|
||||||
field=models.ManyToManyField(related_name='news', to='webapp.Tag'),
|
field=models.ManyToManyField(related_name="news", to="webapp.Tag"),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -10,62 +10,76 @@ import webapp.utils
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0001_initial'),
|
("webapp", "0001_initial"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Feed',
|
name="Feed",
|
||||||
fields=[
|
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",
|
||||||
('autohide', models.BooleanField(default=False)),
|
models.AutoField(
|
||||||
('autohide_time', models.DateTimeField(default=webapp.utils.month_from_now)),
|
auto_created=True,
|
||||||
('topic', models.CharField(max_length=255)),
|
primary_key=True,
|
||||||
('description', models.CharField(max_length=255)),
|
serialize=False,
|
||||||
('content', models.TextField()),
|
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(
|
migrations.RemoveField(
|
||||||
model_name='info',
|
model_name="info",
|
||||||
name='tags',
|
name="tags",
|
||||||
),
|
),
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='infotr',
|
model_name="infotr",
|
||||||
name='translation_for',
|
name="translation_for",
|
||||||
),
|
),
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='tagtr',
|
model_name="tagtr",
|
||||||
name='translation_for',
|
name="translation_for",
|
||||||
),
|
),
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='tag',
|
model_name="tag",
|
||||||
name='dummyname',
|
name="dummyname",
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='tag',
|
model_name="tag",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(default='', max_length=127),
|
field=models.CharField(default="", max_length=127),
|
||||||
preserve_default=False,
|
preserve_default=False,
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='tag',
|
model_name="tag",
|
||||||
name='slug',
|
name="slug",
|
||||||
field=models.SlugField(default=''),
|
field=models.SlugField(default=""),
|
||||||
preserve_default=False,
|
preserve_default=False,
|
||||||
),
|
),
|
||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='Info',
|
name="Info",
|
||||||
),
|
),
|
||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='InfoTr',
|
name="InfoTr",
|
||||||
),
|
),
|
||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='TagTr',
|
name="TagTr",
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='feed',
|
model_name="feed",
|
||||||
name='tags',
|
name="tags",
|
||||||
field=models.ManyToManyField(related_name='news', to='webapp.Tag'),
|
field=models.ManyToManyField(related_name="news", to="webapp.Tag"),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -11,59 +11,114 @@ import django.db.models.deletion
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('auth', '0008_alter_user_username_max_length'),
|
("auth", "0008_alter_user_username_max_length"),
|
||||||
('webapp', '0001_initial'),
|
("webapp", "0001_initial"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='BaseRole',
|
name="BaseRole",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('name', models.TextField(verbose_name='Name')),
|
"id",
|
||||||
('is_board', models.BooleanField(verbose_name='Board member')),
|
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(
|
migrations.CreateModel(
|
||||||
name='Official',
|
name="Official",
|
||||||
fields=[
|
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={
|
options={
|
||||||
'verbose_name': 'user',
|
"verbose_name": "user",
|
||||||
'verbose_name_plural': 'users',
|
"verbose_name_plural": "users",
|
||||||
'abstract': False,
|
"abstract": False,
|
||||||
},
|
},
|
||||||
bases=('auth.user',),
|
bases=("auth.user",),
|
||||||
managers=[
|
managers=[
|
||||||
('objects', django.contrib.auth.models.UserManager()),
|
("objects", django.contrib.auth.models.UserManager()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='CustomRole',
|
name="CustomRole",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='PresetRole',
|
name="PresetRole",
|
||||||
fields=[
|
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')),
|
"baserole_ptr",
|
||||||
('summary', models.TextField(verbose_name='Summary')),
|
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(
|
migrations.CreateModel(
|
||||||
name='Role',
|
name="Role",
|
||||||
fields=[
|
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')),
|
"presetrole_ptr",
|
||||||
('end_date', models.DateField(verbose_name='End date')),
|
models.OneToOneField(
|
||||||
('official', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='roles', to='webapp.Official')),
|
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",),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,38 +8,38 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0002_auto_20170601_1919'),
|
("webapp", "0002_auto_20170601_1919"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='feed',
|
model_name="feed",
|
||||||
name='content_en',
|
name="content_en",
|
||||||
field=models.TextField(null=True),
|
field=models.TextField(null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='feed',
|
model_name="feed",
|
||||||
name='content_fi',
|
name="content_fi",
|
||||||
field=models.TextField(null=True),
|
field=models.TextField(null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='feed',
|
model_name="feed",
|
||||||
name='description_en',
|
name="description_en",
|
||||||
field=models.CharField(max_length=255, null=True),
|
field=models.CharField(max_length=255, null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='feed',
|
model_name="feed",
|
||||||
name='description_fi',
|
name="description_fi",
|
||||||
field=models.CharField(max_length=255, null=True),
|
field=models.CharField(max_length=255, null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='feed',
|
model_name="feed",
|
||||||
name='topic_en',
|
name="topic_en",
|
||||||
field=models.CharField(max_length=255, null=True),
|
field=models.CharField(max_length=255, null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='feed',
|
model_name="feed",
|
||||||
name='topic_fi',
|
name="topic_fi",
|
||||||
field=models.CharField(max_length=255, null=True),
|
field=models.CharField(max_length=255, null=True),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ from django.db import migrations
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0002_baserole_customrole_official_presetrole_role'),
|
("webapp", "0002_baserole_customrole_official_presetrole_role"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='role',
|
name="role",
|
||||||
options={'verbose_name': 'Official'},
|
options={"verbose_name": "Official"},
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,13 +8,15 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0003_auto_20170607_1643'),
|
("webapp", "0003_auto_20170607_1643"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='feed',
|
model_name="feed",
|
||||||
name='tags',
|
name="tags",
|
||||||
field=models.ManyToManyField(blank=True, related_name='news', to='webapp.Tag'),
|
field=models.ManyToManyField(
|
||||||
|
blank=True, related_name="news", to="webapp.Tag"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,16 +8,16 @@ from django.db import migrations
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0003_auto_20170607_1825'),
|
("webapp", "0003_auto_20170607_1825"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='official',
|
name="official",
|
||||||
options={'verbose_name': 'Official'},
|
options={"verbose_name": "Official"},
|
||||||
),
|
),
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='role',
|
name="role",
|
||||||
options={'verbose_name': 'Role'},
|
options={"verbose_name": "Role"},
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,18 +8,18 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0004_auto_20170607_1712'),
|
("webapp", "0004_auto_20170607_1712"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='tag',
|
model_name="tag",
|
||||||
name='name_en',
|
name="name_en",
|
||||||
field=models.CharField(max_length=127, null=True),
|
field=models.CharField(max_length=127, null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='tag',
|
model_name="tag",
|
||||||
name='name_fi',
|
name="name_fi",
|
||||||
field=models.CharField(max_length=127, null=True),
|
field=models.CharField(max_length=127, null=True),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ import webapp.utils
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0005_auto_20170607_1717'),
|
("webapp", "0005_auto_20170607_1717"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='Tag',
|
name="Tag",
|
||||||
),
|
),
|
||||||
migrations.DeleteModel(
|
migrations.DeleteModel(
|
||||||
name='Feed',
|
name="Feed",
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -13,49 +13,82 @@ class Migration(migrations.Migration):
|
|||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0006_delete_deprecated_models'),
|
("webapp", "0006_delete_deprecated_models"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='BaseFeed',
|
name="BaseFeed",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('visible', models.BooleanField(default=True)),
|
"id",
|
||||||
('title', models.CharField(max_length=255)),
|
models.AutoField(
|
||||||
('description', models.CharField(max_length=255)),
|
auto_created=True,
|
||||||
('content', models.TextField()),
|
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(
|
migrations.CreateModel(
|
||||||
name='Tag',
|
name="Tag",
|
||||||
fields=[
|
fields=[
|
||||||
('slug', models.SlugField(primary_key=True, serialize=False)),
|
("slug", models.SlugField(primary_key=True, serialize=False)),
|
||||||
('name', models.CharField(max_length=127)),
|
("name", models.CharField(max_length=127)),
|
||||||
('icon', models.ImageField(upload_to='')),
|
("icon", models.ImageField(upload_to="")),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Event',
|
name="Event",
|
||||||
fields=[
|
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)),
|
"basefeed_ptr",
|
||||||
('end_time', models.DateTimeField(default=django.utils.timezone.now)),
|
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(
|
migrations.CreateModel(
|
||||||
name='Feed',
|
name="Feed",
|
||||||
fields=[
|
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)),
|
"basefeed_ptr",
|
||||||
('autohide', models.DateTimeField(default=webapp.utils.month_from_now)),
|
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(
|
migrations.AddField(
|
||||||
model_name='basefeed',
|
model_name="basefeed",
|
||||||
name='tags',
|
name="tags",
|
||||||
field=models.ManyToManyField(blank=True, related_name='feeds', to='webapp.Tag'),
|
field=models.ManyToManyField(
|
||||||
|
blank=True, related_name="feeds", to="webapp.Tag"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,48 +8,48 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0007_auto_20170607_1815'),
|
("webapp", "0007_auto_20170607_1815"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='basefeed',
|
model_name="basefeed",
|
||||||
name='content_en',
|
name="content_en",
|
||||||
field=models.TextField(null=True),
|
field=models.TextField(null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='basefeed',
|
model_name="basefeed",
|
||||||
name='content_fi',
|
name="content_fi",
|
||||||
field=models.TextField(null=True),
|
field=models.TextField(null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='basefeed',
|
model_name="basefeed",
|
||||||
name='description_en',
|
name="description_en",
|
||||||
field=models.CharField(max_length=255, null=True),
|
field=models.CharField(max_length=255, null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='basefeed',
|
model_name="basefeed",
|
||||||
name='description_fi',
|
name="description_fi",
|
||||||
field=models.CharField(max_length=255, null=True),
|
field=models.CharField(max_length=255, null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='basefeed',
|
model_name="basefeed",
|
||||||
name='title_en',
|
name="title_en",
|
||||||
field=models.CharField(max_length=255, null=True),
|
field=models.CharField(max_length=255, null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='basefeed',
|
model_name="basefeed",
|
||||||
name='title_fi',
|
name="title_fi",
|
||||||
field=models.CharField(max_length=255, null=True),
|
field=models.CharField(max_length=255, null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='tag',
|
model_name="tag",
|
||||||
name='name_en',
|
name="name_en",
|
||||||
field=models.CharField(max_length=127, null=True),
|
field=models.CharField(max_length=127, null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='tag',
|
model_name="tag",
|
||||||
name='name_fi',
|
name="name_fi",
|
||||||
field=models.CharField(max_length=127, null=True),
|
field=models.CharField(max_length=127, null=True),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ from django.db import migrations
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0008_auto_20170607_1828'),
|
("webapp", "0008_auto_20170607_1828"),
|
||||||
('webapp', '0004_auto_20170607_1826'),
|
("webapp", "0004_auto_20170607_1826"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = []
|
||||||
]
|
|
||||||
|
|||||||
@@ -9,62 +9,125 @@ import django.db.models.deletion
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0009_merge_20170607_1854'),
|
("webapp", "0009_merge_20170607_1854"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='CustomKaehmyRole',
|
name="CustomKaehmyRole",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='MessageParent',
|
name="MessageParent",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='PresetKaehmyRole',
|
name="PresetKaehmyRole",
|
||||||
fields=[
|
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(
|
migrations.CreateModel(
|
||||||
name='KaehmyForm',
|
name="KaehmyForm",
|
||||||
fields=[
|
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')),
|
"messageparent_ptr",
|
||||||
('email', models.EmailField(max_length=254, verbose_name='Email')),
|
models.OneToOneField(
|
||||||
('year', models.IntegerField(verbose_name='Year')),
|
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(
|
migrations.CreateModel(
|
||||||
name='KaehmyMessage',
|
name="KaehmyMessage",
|
||||||
fields=[
|
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')),
|
"messageparent_ptr",
|
||||||
('email', models.EmailField(max_length=254, verbose_name='Email')),
|
models.OneToOneField(
|
||||||
('message', models.TextField(verbose_name='Message')),
|
auto_created=True,
|
||||||
('parent', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='webapp.MessageParent')),
|
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(
|
migrations.DeleteModel(
|
||||||
name='CustomRole',
|
name="CustomRole",
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='presetkaehmyrole',
|
model_name="presetkaehmyrole",
|
||||||
name='form',
|
name="form",
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='preset_roles', to='webapp.KaehmyForm'),
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
related_name="preset_roles",
|
||||||
|
to="webapp.KaehmyForm",
|
||||||
|
),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='customkaehmyrole',
|
model_name="customkaehmyrole",
|
||||||
name='form',
|
name="form",
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='custom_roles', to='webapp.KaehmyForm'),
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
related_name="custom_roles",
|
||||||
|
to="webapp.KaehmyForm",
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,28 +9,30 @@ import phonenumber_field.modelfields
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0010_auto_20170608_0924'),
|
("webapp", "0010_auto_20170608_0924"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='baserole',
|
model_name="baserole",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=256, verbose_name='Name'),
|
field=models.CharField(max_length=256, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='kaehmyform',
|
model_name="kaehmyform",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=256, verbose_name='Name'),
|
field=models.CharField(max_length=256, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='kaehmymessage',
|
model_name="kaehmymessage",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=256, verbose_name='Name'),
|
field=models.CharField(max_length=256, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='official',
|
model_name="official",
|
||||||
name='phone_number',
|
name="phone_number",
|
||||||
field=phonenumber_field.modelfields.PhoneNumberField(max_length=128, verbose_name='Phone number'),
|
field=phonenumber_field.modelfields.PhoneNumberField(
|
||||||
|
max_length=128, verbose_name="Phone number"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -10,49 +10,79 @@ import django.db.models.deletion
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0011_auto_20170913_1841'),
|
("webapp", "0011_auto_20170913_1841"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='OhlhafvChallenge',
|
name="OhlhafvChallenge",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('challenger', models.CharField(max_length=255)),
|
"id",
|
||||||
('victim', models.CharField(max_length=255)),
|
models.AutoField(
|
||||||
('challenger_email', models.EmailField(max_length=254)),
|
auto_created=True,
|
||||||
('victim_email', models.EmailField(max_length=254)),
|
primary_key=True,
|
||||||
('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)),
|
serialize=False,
|
||||||
('message', models.TextField()),
|
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(
|
migrations.CreateModel(
|
||||||
name='Registration',
|
name="Registration",
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
(
|
||||||
('name', models.CharField(max_length=255)),
|
"id",
|
||||||
('email', models.EmailField(max_length=254)),
|
models.AutoField(
|
||||||
('options', django.contrib.postgres.fields.jsonb.JSONField()),
|
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(
|
migrations.AlterField(
|
||||||
model_name='baserole',
|
model_name="baserole",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=255, verbose_name='Name'),
|
field=models.CharField(max_length=255, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='kaehmyform',
|
model_name="kaehmyform",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=255, verbose_name='Name'),
|
field=models.CharField(max_length=255, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='kaehmymessage',
|
model_name="kaehmymessage",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=255, verbose_name='Name'),
|
field=models.CharField(max_length=255, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='event',
|
model_name="event",
|
||||||
name='registration',
|
name="registration",
|
||||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='webapp.Registration'),
|
field=models.ForeignKey(
|
||||||
|
null=True,
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
to="webapp.Registration",
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,38 +8,38 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0012_auto_20170913_1934'),
|
("webapp", "0012_auto_20170913_1934"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='baserole',
|
model_name="baserole",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=256, verbose_name='Name'),
|
field=models.CharField(max_length=256, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='kaehmyform',
|
model_name="kaehmyform",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=256, verbose_name='Name'),
|
field=models.CharField(max_length=256, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='kaehmymessage',
|
model_name="kaehmymessage",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=256, verbose_name='Name'),
|
field=models.CharField(max_length=256, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='ohlhafvchallenge',
|
model_name="ohlhafvchallenge",
|
||||||
name='challenger',
|
name="challenger",
|
||||||
field=models.CharField(max_length=256),
|
field=models.CharField(max_length=256),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='ohlhafvchallenge',
|
model_name="ohlhafvchallenge",
|
||||||
name='victim',
|
name="victim",
|
||||||
field=models.CharField(max_length=256),
|
field=models.CharField(max_length=256),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='registration',
|
model_name="registration",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=256),
|
field=models.CharField(max_length=256),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,38 +8,38 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0013_auto_20170920_1800'),
|
("webapp", "0013_auto_20170920_1800"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='baserole',
|
model_name="baserole",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=255, verbose_name='Name'),
|
field=models.CharField(max_length=255, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='kaehmyform',
|
model_name="kaehmyform",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=255, verbose_name='Name'),
|
field=models.CharField(max_length=255, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='kaehmymessage',
|
model_name="kaehmymessage",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=255, verbose_name='Name'),
|
field=models.CharField(max_length=255, verbose_name="Name"),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='ohlhafvchallenge',
|
model_name="ohlhafvchallenge",
|
||||||
name='challenger',
|
name="challenger",
|
||||||
field=models.CharField(max_length=255),
|
field=models.CharField(max_length=255),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='ohlhafvchallenge',
|
model_name="ohlhafvchallenge",
|
||||||
name='victim',
|
name="victim",
|
||||||
field=models.CharField(max_length=255),
|
field=models.CharField(max_length=255),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='registration',
|
model_name="registration",
|
||||||
name='name',
|
name="name",
|
||||||
field=models.CharField(max_length=255),
|
field=models.CharField(max_length=255),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,34 +8,37 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0014_auto_20170920_1807'),
|
("webapp", "0014_auto_20170920_1807"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='event',
|
name="event",
|
||||||
options={'verbose_name': 'Event', 'verbose_name_plural': 'Events'},
|
options={"verbose_name": "Event", "verbose_name_plural": "Events"},
|
||||||
),
|
),
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='feed',
|
name="feed",
|
||||||
options={'verbose_name': 'Feed', 'verbose_name_plural': 'Feeds'},
|
options={"verbose_name": "Feed", "verbose_name_plural": "Feeds"},
|
||||||
),
|
),
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='registration',
|
name="registration",
|
||||||
options={'verbose_name': 'Registration', 'verbose_name_plural': 'Registrations'},
|
options={
|
||||||
|
"verbose_name": "Registration",
|
||||||
|
"verbose_name_plural": "Registrations",
|
||||||
|
},
|
||||||
),
|
),
|
||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='tag',
|
name="tag",
|
||||||
options={'verbose_name': 'Tag', 'verbose_name_plural': 'Tags'},
|
options={"verbose_name": "Tag", "verbose_name_plural": "Tags"},
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='registration',
|
model_name="registration",
|
||||||
name='name_en',
|
name="name_en",
|
||||||
field=models.CharField(max_length=255, null=True),
|
field=models.CharField(max_length=255, null=True),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='registration',
|
model_name="registration",
|
||||||
name='name_fi',
|
name="name_fi",
|
||||||
field=models.CharField(max_length=255, null=True),
|
field=models.CharField(max_length=255, null=True),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,32 +8,44 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0015_auto_20170928_2331'),
|
("webapp", "0015_auto_20170928_2331"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='KaehmyFormSelectedRole',
|
name="KaehmyFormSelectedRole",
|
||||||
fields=[
|
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(
|
migrations.RemoveField(
|
||||||
model_name='customkaehmyrole',
|
model_name="customkaehmyrole",
|
||||||
name='form',
|
name="form",
|
||||||
),
|
),
|
||||||
migrations.RemoveField(
|
migrations.RemoveField(
|
||||||
model_name='presetkaehmyrole',
|
model_name="presetkaehmyrole",
|
||||||
name='form',
|
name="form",
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='kaehmyform',
|
model_name="kaehmyform",
|
||||||
name='custom_roles',
|
name="custom_roles",
|
||||||
field=models.ManyToManyField(blank=True, related_name='forms', to='webapp.CustomKaehmyRole'),
|
field=models.ManyToManyField(
|
||||||
|
blank=True, related_name="forms", to="webapp.CustomKaehmyRole"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='kaehmyform',
|
model_name="kaehmyform",
|
||||||
name='preset_roles',
|
name="preset_roles",
|
||||||
field=models.ManyToManyField(blank=True, related_name='forms', to='webapp.PresetKaehmyRole'),
|
field=models.ManyToManyField(
|
||||||
|
blank=True, related_name="forms", to="webapp.PresetKaehmyRole"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,13 +8,13 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0016_auto_20171011_1828'),
|
("webapp", "0016_auto_20171011_1828"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='kaehmyform',
|
model_name="kaehmyform",
|
||||||
name='text',
|
name="text",
|
||||||
field=models.TextField(default='', max_length=300, verbose_name='Text'),
|
field=models.TextField(default="", max_length=300, verbose_name="Text"),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,13 +8,16 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0017_kaehmyform_text'),
|
("webapp", "0017_kaehmyform_text"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='kaehmyform',
|
model_name="kaehmyform",
|
||||||
name='year',
|
name="year",
|
||||||
field=models.IntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, 'N')], verbose_name='Year'),
|
field=models.IntegerField(
|
||||||
|
choices=[(1, "1"), (2, "2"), (3, "3"), (4, "4"), (5, "N")],
|
||||||
|
verbose_name="Year",
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,13 +9,15 @@ import django.utils.timezone
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0018_auto_20171011_1856'),
|
("webapp", "0018_auto_20171011_1856"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='kaehmymessage',
|
model_name="kaehmymessage",
|
||||||
name='timestamp',
|
name="timestamp",
|
||||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Timestamp'),
|
field=models.DateTimeField(
|
||||||
|
default=django.utils.timezone.now, verbose_name="Timestamp"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,18 +8,20 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0019_kaehmymessage_timestamp'),
|
("webapp", "0019_kaehmymessage_timestamp"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='kaehmyform',
|
model_name="kaehmyform",
|
||||||
name='custom_role_is_board',
|
name="custom_role_is_board",
|
||||||
field=models.BooleanField(default=False, verbose_name='Board member'),
|
field=models.BooleanField(default=False, verbose_name="Board member"),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='kaehmyform',
|
model_name="kaehmyform",
|
||||||
name='custom_role_name',
|
name="custom_role_name",
|
||||||
field=models.CharField(default='', max_length=255, verbose_name='Custom role name'),
|
field=models.CharField(
|
||||||
|
default="", max_length=255, verbose_name="Custom role name"
|
||||||
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,14 +9,16 @@ import phonenumber_field.modelfields
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('webapp', '0019_kaehmymessage_timestamp'),
|
("webapp", "0019_kaehmymessage_timestamp"),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='kaehmyform',
|
model_name="kaehmyform",
|
||||||
name='phone_number',
|
name="phone_number",
|
||||||
field=phonenumber_field.modelfields.PhoneNumberField(default='', max_length=128, verbose_name='Phone number'),
|
field=phonenumber_field.modelfields.PhoneNumberField(
|
||||||
|
default="", max_length=128, verbose_name="Phone number"
|
||||||
|
),
|
||||||
preserve_default=False,
|
preserve_default=False,
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user