diff --git a/kaehmy/admin.py b/kaehmy/admin.py
index a6f11cf..f730ca5 100644
--- a/kaehmy/admin.py
+++ b/kaehmy/admin.py
@@ -1,10 +1,9 @@
from django.contrib import admin
from modeltranslation.admin import TranslationAdmin
-from kaehmy.models import Application, Comment, CustomRole, PresetRole, TelegramChannel
+from kaehmy.models import Application, Comment, CustomRole, PresetRole
admin.site.register(Application)
admin.site.register(Comment)
admin.site.register(CustomRole)
admin.site.register(PresetRole, TranslationAdmin)
-admin.site.register(TelegramChannel)
diff --git a/kaehmy/migrations/0006_delete_telegramchannel.py b/kaehmy/migrations/0006_delete_telegramchannel.py
new file mode 100644
index 0000000..4d963c0
--- /dev/null
+++ b/kaehmy/migrations/0006_delete_telegramchannel.py
@@ -0,0 +1,16 @@
+# Generated by Django 2.2.26 on 2022-01-12 20:38
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('kaehmy', '0005_auto_20190312_1458'),
+ ]
+
+ operations = [
+ migrations.DeleteModel(
+ name='TelegramChannel',
+ ),
+ ]
diff --git a/kaehmy/models.py b/kaehmy/models.py
index f47374f..2133378 100644
--- a/kaehmy/models.py
+++ b/kaehmy/models.py
@@ -148,18 +148,3 @@ class Application(CommentParent):
def has_any_board_role(self):
return self.preset_roles.filter(is_board=True).exists() or self.custom_roles.filter(is_board=True)
-
-
-# Telegram channel entry for Kaehmys
-class TelegramChannel(models.Model):
- """Model containing the channel id of a Telegram chat"""
-
- class Meta:
- verbose_name = _('Telegram channel')
- verbose_name_plural = _('Telegram channels')
-
- name = models.CharField(max_length=255)
- channel_id = models.CharField(max_length=255, unique=True)
-
- def __str__(self):
- return 'Telegram channel: "{}"'.format(self.name)
diff --git a/kaehmy/tgbot.py b/kaehmy/tgbot.py
deleted file mode 100644
index 248f7eb..0000000
--- a/kaehmy/tgbot.py
+++ /dev/null
@@ -1,38 +0,0 @@
-'''
-A telegram bot api for whatever purposes.
-TODO: kaehmy app is definitely not correct place for this
-'''
-import logging
-import requests
-from django.conf import settings
-from kaehmy.models import TelegramChannel
-
-
-class TelegramBot:
- '''
- A telegram bot api for whatever purposes
- Currently only able to broadcast stuff to all registered
- channels using broadcast method.
- '''
-
- def __init__(self, api_token=None):
-
- self.api_token = api_token or settings.TELEGRAM_BOT_TOKEN
- self.send_message_url = "https://api.telegram.org/bot{}/sendMessage".format(self.api_token)
-
- def broadcast(self, message):
- channels_ids = TelegramChannel.objects.values_list("channel_id", flat=True)
- for id_ in channels_ids:
- self.send_message(id_, message)
-
- def send_message(self, channel_id, message):
- '''
- Send message to a chat with given channel_id
- '''
- data = {
- 'chat_id': channel_id,
- 'text': message,
- 'parse_mode': 'Markdown'
- }
- resp = requests.post(self.send_message_url, json=data)
- logging.debug(resp.content)
diff --git a/kaehmy/views.py b/kaehmy/views.py
index 8e7ab29..8f839f2 100644
--- a/kaehmy/views.py
+++ b/kaehmy/views.py
@@ -13,10 +13,11 @@ from dealer.git import git
from sikweb.settings import URL
from members.views.utils import *
-from kaehmy.models import Application, CustomRole, PresetRole, TelegramChannel
+from kaehmy.models import Application, CustomRole, PresetRole
from kaehmy.forms import ApplicationForm, CommentForm
from kaehmy.tables import ExportTable
from webapp.utils import send_email
+from webapp.webhook import processHooks
@ensure_csrf_cookie
@@ -135,17 +136,7 @@ def submit(request, *args, **kwargs):
send_email(email, subject, body)
logging.debug('Sent kaehmy email to recipient <{}>'.format(email))
- CHAT_IDS = [channel.channel_id for channel in TelegramChannel.objects.all()]
- for chat_id in CHAT_IDS:
- tg_string = 'https://api.telegram.org/bot{}/sendMessage?chat_id={}&text={}'.format(
- settings.TELEGRAM_BOT_TOKEN,
- chat_id,
- 'Uusi New kaehmy! {} -> {}'.format(name, url)
- )
- response = requests.get(tg_string).json()
- logging.debug('Telegram API response:\n{}'.format(response))
- logging.debug('Sent kaehmy announcement to {} channels.'.format(len(CHAT_IDS)))
-
+ processHooks(message=f'Uusi New kaehmy! {name} -> {url}', eventType="kaehmy")
else:
context = {
'error': form.errors
diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po
index 7b1289e..603910b 100644
--- a/locale/en/LC_MESSAGES/django.po
+++ b/locale/en/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-01-18 21:36+0200\n"
+"POT-Creation-Date: 2022-01-12 23:55+0200\n"
"PO-Revision-Date: 2017-11-02 23:09+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -37,7 +37,7 @@ msgstr "Sössö articles"
msgid "Today's lunch"
msgstr ""
-#: infoscreen/models.py:212 webapp/models.py:70
+#: infoscreen/models.py:212 webapp/models.py:73
msgid "Events"
msgstr "Events"
@@ -112,8 +112,8 @@ msgstr "Preview"
msgid "Delete"
msgstr "Delete"
-#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:62
-#: kaehmy/templates/list.html:36 webapp/models.py:144 webapp/models.py:173
+#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:57
+#: kaehmy/templates/list.html:36 webapp/models.py:147 webapp/models.py:176
msgid "Name"
msgstr "Name"
@@ -189,7 +189,7 @@ msgstr "Phone number (not public)"
msgid "Custom roles"
msgstr "Custom roles"
-#: kaehmy/forms.py:49 kaehmy/templates/kaehmy.html:43
+#: kaehmy/forms.py:49 kaehmy/templates/kaehmy.html:42
msgid "Preset roles"
msgstr "Preset roles"
@@ -201,156 +201,148 @@ msgstr "Invalid phone number"
msgid "Custom role with the same name already exists."
msgstr "Custom role with the same name already exists."
-#: kaehmy/models.py:18
+#: kaehmy/models.py:13
msgid "Kaehmy"
msgstr "Kaehmy"
-#: kaehmy/models.py:25
+#: kaehmy/models.py:20
msgid "Corporate affairs"
msgstr "Corporate affairs"
-#: kaehmy/models.py:26 webapp/templates/freshmen.html:10
+#: kaehmy/models.py:21 webapp/templates/freshmen.html:10
#: webapp/templates/navigation.html:8
msgid "Freshmen"
msgstr "Freshmen"
-#: kaehmy/models.py:27 webapp/templates/international.html:10
+#: kaehmy/models.py:22 webapp/templates/international.html:10
#: webapp/templates/navigation.html:14
msgid "International"
msgstr "International"
-#: kaehmy/models.py:28
+#: kaehmy/models.py:23
msgid "External affairs"
msgstr "External affairs"
-#: kaehmy/models.py:29
+#: kaehmy/models.py:24
msgid "Media"
msgstr ""
-#: kaehmy/models.py:30
+#: kaehmy/models.py:25
msgid "Technology"
msgstr ""
-#: kaehmy/models.py:31
+#: kaehmy/models.py:26
msgid "Wellbeing"
msgstr ""
-#: kaehmy/models.py:32
+#: kaehmy/models.py:27
msgid "Elepaja"
msgstr ""
-#: kaehmy/models.py:33
+#: kaehmy/models.py:28
msgid "Ceremonies"
msgstr ""
-#: kaehmy/models.py:34
+#: kaehmy/models.py:29
msgid "Studies"
msgstr ""
-#: kaehmy/models.py:35
+#: kaehmy/models.py:30
msgid "Sössö magazine"
msgstr "Sössö magazine"
-#: kaehmy/models.py:36
+#: kaehmy/models.py:31
msgid "Alumni relations"
msgstr "Alumni relations"
-#: kaehmy/models.py:37
+#: kaehmy/models.py:32
msgid "Others"
msgstr ""
-#: kaehmy/models.py:39
+#: kaehmy/models.py:34
msgid "Category"
msgstr ""
-#: kaehmy/models.py:45
+#: kaehmy/models.py:40
msgid "Description"
msgstr "Description"
-#: kaehmy/models.py:48
+#: kaehmy/models.py:43
msgid "Preset kaehmy role"
msgstr "Preset kaehmy role"
-#: kaehmy/models.py:49
+#: kaehmy/models.py:44
msgid "Preset kaehmy roles"
msgstr "Preset kaehmy roles"
-#: kaehmy/models.py:56
+#: kaehmy/models.py:51
msgid "Custom kaehmy role"
msgstr "Custom kaehmy role"
-#: kaehmy/models.py:57
+#: kaehmy/models.py:52
msgid "Custom kaehmy roles"
msgstr "Custom kaehmy roles"
-#: kaehmy/models.py:63 kaehmy/templates/list.html:40 members/models.py:14
+#: kaehmy/models.py:58 kaehmy/templates/list.html:40 members/models.py:14
msgid "Email"
msgstr "Email"
-#: kaehmy/models.py:64
+#: kaehmy/models.py:59
msgid "Timestamp"
msgstr ""
-#: kaehmy/models.py:78
+#: kaehmy/models.py:73
msgid "Kaehmykommentti"
msgstr "Kaehmy comment"
-#: kaehmy/models.py:79
+#: kaehmy/models.py:74
msgid "Kaehmykommentit"
msgstr "Kaehmy comments"
-#: kaehmy/models.py:81 ohlhafv/models.py:36
+#: kaehmy/models.py:76 ohlhafv/models.py:36
msgid "Message"
msgstr ""
-#: kaehmy/models.py:100 kaehmy/templates/kaehmy.html:12
+#: kaehmy/models.py:95 kaehmy/templates/kaehmy.html:12
msgid "Kaehmylomake"
msgstr "Kaehmy application"
-#: kaehmy/models.py:101
+#: kaehmy/models.py:96
msgid "Kaehmylomakkeet"
msgstr "Kaehmy applications"
-#: kaehmy/models.py:104
+#: kaehmy/models.py:99
msgid "Phone number"
msgstr ""
-#: kaehmy/models.py:105
+#: kaehmy/models.py:100
msgid "Year"
msgstr ""
-#: kaehmy/models.py:106
+#: kaehmy/models.py:101
msgid "Text"
msgstr ""
-#: kaehmy/models.py:108
+#: kaehmy/models.py:103
msgid "Custom role name"
msgstr ""
-#: kaehmy/models.py:110 webapp/models.py:174
+#: kaehmy/models.py:105 webapp/models.py:177
msgid "Board member"
msgstr "Board member"
-#: kaehmy/models.py:118
+#: kaehmy/models.py:113
msgid "Kaehmy application: {}"
msgstr "Kaehmy application: {}"
-#: kaehmy/models.py:140
+#: kaehmy/models.py:135
msgid "Board: {}"
msgstr ""
-#: kaehmy/models.py:146
+#: kaehmy/models.py:141
msgid "Official: {}"
msgstr ""
-#: kaehmy/models.py:163
-msgid "Telegram channel"
-msgstr ""
-
-#: kaehmy/models.py:164
-msgid "Telegram channels"
-msgstr ""
-
#: kaehmy/tables.py:13
msgid "Roles"
msgstr ""
@@ -427,31 +419,36 @@ msgid "Päivämääriä & deadlineja"
msgstr "Dates and deadlines"
#: kaehmy/templates/kaehmy.html:31
-msgid "Hallitustyrkkypaneeli"
-msgstr "Panel for board applicants"
+#, fuzzy
+#| msgid "Vaalikokous, osa 1 (puheenjohtajan valinta)"
+msgid "Vaalikokous, osa 1 (puheenjohtajan valinta) ja hallitustyrkkypaneeli"
+msgstr "Election meeting, part 1 (chairman election)"
#: kaehmy/templates/kaehmy.html:32
-msgid "Vaalikokous, osa 1 (puheenjohtajan valinta)"
-msgstr "Election meeting, part 1 (chairman election)"
+msgid "Vaalikokous, osa 2 (hallituksen valinta)"
+msgstr "Election meeting, part 2 (board election)"
#: kaehmy/templates/kaehmy.html:33
msgid "Toimikunta-appro"
msgstr "Guild committee crawl"
#: kaehmy/templates/kaehmy.html:34
-msgid "Vaalikokous, osa 2 (hallituksen valinta)"
-msgstr "Election meeting, part 2 (board election)"
-
-#: kaehmy/templates/kaehmy.html:35
msgid "Vaalikokous, osa 3 (toimarien valinta)"
msgstr "Election meeting, part 3 (non-board election)"
-#: kaehmy/templates/kaehmy.html:78
-#, python-format
+#: kaehmy/templates/kaehmy.html:77
+#, fuzzy, python-format
+#| msgid ""
+#| "\n"
+#| " Hyväksyn tietosuojaselosteen ja "
+#| "tietojeni tallentamisen.\n"
+#| " "
msgid ""
"\n"
-" Hyväksyn tietosuojaselosteen ja tietojeni "
"tallentamisen.\n"
" "
@@ -463,7 +460,7 @@ msgstr ""
"of personal data.\n"
" "
-#: kaehmy/templates/kaehmy.html:84 members/templates/settings.html:23
+#: kaehmy/templates/kaehmy.html:83 members/templates/settings.html:23
msgid "Submit"
msgstr "Submit"
@@ -639,12 +636,16 @@ msgid "Hienoa! Jäsenhakemuksesi on nyt lähetetty."
msgstr "Amazing! Your membership application has been sent."
#: members/templates/application_success.html:9
+#, fuzzy
+#| msgid ""
+#| "Vahvistusviesti on lähetetty sähköpostiisi. Ota yhteyttä "
+#| "admin@sahkoinsinoorikilta.fi.fi jos viestiä ei näy."
msgid ""
-"Vahvistusviesti on lähetetty sähköpostiisi. Ota yhteyttä admin@sahkoinsinoorikilta.fi."
-"fi jos viestiä ei näy."
+"Vahvistusviesti on lähetetty sähköpostiisi. Ota yhteyttä "
+"admin@sahkoinsinoorikilta.fi jos viestiä ei näy."
msgstr ""
-"Confirmation email is sent to given email address. Contact admin@sahkoinsinoorikilta.fi."
-"fi if you didn't receive it."
+"Confirmation email is sent to given email address. Contact "
+"admin@sahkoinsinoorikilta.fi.fi if you didn't receive it."
#: members/templates/application_success.html:10
msgid "Takaisin Sähköinsinöörikillan web-sivuille"
@@ -914,11 +915,11 @@ msgstr "Payments in register:"
msgid "Language"
msgstr "Language"
-#: members/templates/settings.html:20 sikweb/base.py:217
+#: members/templates/settings.html:20 sikweb/base.py:216
msgid "Finnish"
msgstr "Finnish"
-#: members/templates/settings.html:21 sikweb/base.py:218
+#: members/templates/settings.html:21 sikweb/base.py:217
msgid "English"
msgstr "English"
@@ -1100,7 +1101,9 @@ msgid "Challenge"
msgstr "Challenge"
#: ohlhafv/views.py:44
-msgid "Sinut on haastettu Øhlhäfviin!"
+#, fuzzy
+#| msgid "Sinut on haastettu Øhlhäfviin!"
+msgid "Sinut on haastettu Ohlhäfviin!"
msgstr "You have been challenged at Ohlhafv!"
#: templates/admin/base_site.html:44
@@ -1112,91 +1115,135 @@ msgstr "Go"
msgid "Aalto-yliopiston Sähköinsinöörikilta ry"
msgstr "Aalto-yliopiston Sähköinsinöörikilta ry"
-#: webapp/models.py:18
+#: webapp/models.py:21
msgid "Webapp"
msgstr "Webapp"
-#: webapp/models.py:26
+#: webapp/models.py:29
msgid "Tag"
msgstr "Tag"
-#: webapp/models.py:27
+#: webapp/models.py:30
msgid "Tags"
msgstr "Tags"
-#: webapp/models.py:34
+#: webapp/models.py:37
msgid "Tag: {}"
msgstr "Tag: {}"
-#: webapp/models.py:52
+#: webapp/models.py:55
msgid "Feed"
msgstr ""
-#: webapp/models.py:53
+#: webapp/models.py:56
msgid "Feeds"
msgstr ""
-#: webapp/models.py:61 webapp/models.py:80 webapp/models.py:119
-#: webapp/models.py:152 webapp/models.py:198
+#: webapp/models.py:64 webapp/models.py:83 webapp/models.py:122
+#: webapp/models.py:155 webapp/models.py:201
msgid "Deleted: "
msgstr "Deleted: "
-#: webapp/models.py:62
+#: webapp/models.py:65
msgid "{}Feed: {}"
msgstr ""
-#: webapp/models.py:69
+#: webapp/models.py:72
msgid "Event"
msgstr ""
-#: webapp/models.py:81
+#: webapp/models.py:84
msgid "{}Event: {}"
msgstr ""
-#: webapp/models.py:91
+#: webapp/models.py:93
msgid "Template question"
msgstr ""
-#: webapp/models.py:92
+#: webapp/models.py:94
msgid "Template questions"
msgstr ""
-#: webapp/models.py:98
+#: webapp/models.py:101
msgid "Template questions: {}"
msgstr ""
-#: webapp/models.py:105
+#: webapp/models.py:108
msgid "Signup form"
msgstr ""
-#: webapp/models.py:106
+#: webapp/models.py:109
msgid "Signup forms"
msgstr ""
-#: webapp/models.py:120
+#: webapp/models.py:123
msgid "#{} {}{}"
msgstr ""
-#: webapp/models.py:138
+#: webapp/models.py:141
msgid "Sign-up"
msgstr ""
-#: webapp/models.py:139
+#: webapp/models.py:142
msgid "Sign-ups"
msgstr ""
-#: webapp/models.py:178
+#: webapp/models.py:181
msgid "board member"
msgstr "board member"
-#: webapp/models.py:185
+#: webapp/models.py:188
msgid "JobAd"
msgstr ""
-#: webapp/models.py:186
+#: webapp/models.py:189
msgid "JobAds"
msgstr ""
+#: webapp/models.py:211
+#, fuzzy
+#| msgid "Kaehmy"
+msgid "Hook Kaehmys"
+msgstr "Kaehmy"
+
+#: webapp/models.py:212
+#, fuzzy
+#| msgid "Total challenges:"
+msgid "Hook Ohlhafv challenges"
+msgstr "Total challenges:"
+
+#: webapp/models.py:213
+msgid "Hook published news"
+msgstr ""
+
+#: webapp/models.py:214
+msgid "Hook published Job Ads"
+msgstr ""
+
+#: webapp/models.py:215
+msgid "Hook published events"
+msgstr ""
+
+#: webapp/models.py:216
+msgid "Hook opened signups"
+msgstr ""
+
+#: webapp/models.py:241
+msgid "Webhook"
+msgstr ""
+
+#: webapp/models.py:242
+msgid "Webhooks"
+msgstr ""
+
+#: webapp/models.py:256
+msgid "Telegram channel"
+msgstr ""
+
+#: webapp/models.py:257
+msgid "Telegram channels"
+msgstr ""
+
#: webapp/templates/contact.html:9 webapp/templates/navigation.html:20
msgid "Contact"
msgstr "Contact"
@@ -1240,3 +1287,6 @@ msgstr "Sössö"
#: webapp/templates/navigation.html:24
msgid "Corporate"
msgstr "Corporate"
+
+#~ msgid "Hallitustyrkkypaneeli"
+#~ msgstr "Panel for board applicants"
diff --git a/locale/fi/LC_MESSAGES/django.po b/locale/fi/LC_MESSAGES/django.po
index cf602f6..480a23c 100644
--- a/locale/fi/LC_MESSAGES/django.po
+++ b/locale/fi/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-01-18 21:36+0200\n"
+"POT-Creation-Date: 2022-01-12 23:55+0200\n"
"PO-Revision-Date: 2017-11-02 23:04+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -38,7 +38,7 @@ msgstr "Sössön artikkelit"
msgid "Today's lunch"
msgstr "Päivän lounas"
-#: infoscreen/models.py:212 webapp/models.py:70
+#: infoscreen/models.py:212 webapp/models.py:73
msgid "Events"
msgstr "Tapahtumat"
@@ -113,8 +113,8 @@ msgstr "Esikatsele"
msgid "Delete"
msgstr "Poista"
-#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:62
-#: kaehmy/templates/list.html:36 webapp/models.py:144 webapp/models.py:173
+#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:57
+#: kaehmy/templates/list.html:36 webapp/models.py:147 webapp/models.py:176
msgid "Name"
msgstr "Nimi"
@@ -190,7 +190,7 @@ msgstr "Puhelinnumero (ei julkinen)"
msgid "Custom roles"
msgstr "Uudet virat"
-#: kaehmy/forms.py:49 kaehmy/templates/kaehmy.html:43
+#: kaehmy/forms.py:49 kaehmy/templates/kaehmy.html:42
msgid "Preset roles"
msgstr "Kaehmyvirat"
@@ -202,156 +202,148 @@ msgstr "Virheellinen puhelinnumero"
msgid "Custom role with the same name already exists."
msgstr "Samanniminen virka on jo olemassa."
-#: kaehmy/models.py:18
+#: kaehmy/models.py:13
msgid "Kaehmy"
msgstr "Kaehmy"
-#: kaehmy/models.py:25
+#: kaehmy/models.py:20
msgid "Corporate affairs"
msgstr "Yrityssuhteet"
-#: kaehmy/models.py:26 webapp/templates/freshmen.html:10
+#: kaehmy/models.py:21 webapp/templates/freshmen.html:10
#: webapp/templates/navigation.html:8
msgid "Freshmen"
msgstr "Fuksit"
-#: kaehmy/models.py:27 webapp/templates/international.html:10
+#: kaehmy/models.py:22 webapp/templates/international.html:10
#: webapp/templates/navigation.html:14
msgid "International"
msgstr "International"
-#: kaehmy/models.py:28
+#: kaehmy/models.py:23
msgid "External affairs"
msgstr "Ulkosuhteet"
-#: kaehmy/models.py:29
+#: kaehmy/models.py:24
msgid "Media"
msgstr "Media"
-#: kaehmy/models.py:30
+#: kaehmy/models.py:25
msgid "Technology"
msgstr "Teknologia"
-#: kaehmy/models.py:31
+#: kaehmy/models.py:26
msgid "Wellbeing"
msgstr "Hyvinvointi"
-#: kaehmy/models.py:32
+#: kaehmy/models.py:27
msgid "Elepaja"
msgstr "Elepaja"
-#: kaehmy/models.py:33
+#: kaehmy/models.py:28
msgid "Ceremonies"
msgstr "Hupitapahtumat"
-#: kaehmy/models.py:34
+#: kaehmy/models.py:29
msgid "Studies"
msgstr "Opinnot"
-#: kaehmy/models.py:35
+#: kaehmy/models.py:30
msgid "Sössö magazine"
msgstr "Kiltalehti Sössö"
-#: kaehmy/models.py:36
+#: kaehmy/models.py:31
msgid "Alumni relations"
msgstr "Alumnisuhteet"
-#: kaehmy/models.py:37
+#: kaehmy/models.py:32
msgid "Others"
msgstr "Muut"
-#: kaehmy/models.py:39
+#: kaehmy/models.py:34
msgid "Category"
msgstr "Kategoria"
-#: kaehmy/models.py:45
+#: kaehmy/models.py:40
msgid "Description"
msgstr "Kuvaus"
-#: kaehmy/models.py:48
+#: kaehmy/models.py:43
msgid "Preset kaehmy role"
msgstr "Kaehmyvirka"
-#: kaehmy/models.py:49
+#: kaehmy/models.py:44
msgid "Preset kaehmy roles"
msgstr "Kaehmyvirat"
-#: kaehmy/models.py:56
+#: kaehmy/models.py:51
msgid "Custom kaehmy role"
msgstr "Uusi virka"
-#: kaehmy/models.py:57
+#: kaehmy/models.py:52
msgid "Custom kaehmy roles"
msgstr "Uudet kaehmyvirat"
-#: kaehmy/models.py:63 kaehmy/templates/list.html:40 members/models.py:14
+#: kaehmy/models.py:58 kaehmy/templates/list.html:40 members/models.py:14
msgid "Email"
msgstr "Sähköposti"
-#: kaehmy/models.py:64
+#: kaehmy/models.py:59
msgid "Timestamp"
msgstr "Aikaleima"
-#: kaehmy/models.py:78
+#: kaehmy/models.py:73
msgid "Kaehmykommentti"
msgstr "Kaehmykommentti"
-#: kaehmy/models.py:79
+#: kaehmy/models.py:74
msgid "Kaehmykommentit"
msgstr "Kaehmykommentit"
-#: kaehmy/models.py:81 ohlhafv/models.py:36
+#: kaehmy/models.py:76 ohlhafv/models.py:36
msgid "Message"
msgstr "Viesti"
-#: kaehmy/models.py:100 kaehmy/templates/kaehmy.html:12
+#: kaehmy/models.py:95 kaehmy/templates/kaehmy.html:12
msgid "Kaehmylomake"
msgstr "Kaehmylomake"
-#: kaehmy/models.py:101
+#: kaehmy/models.py:96
msgid "Kaehmylomakkeet"
msgstr "Kaehmylomakkeet"
-#: kaehmy/models.py:104
+#: kaehmy/models.py:99
msgid "Phone number"
msgstr "Puhelinnumero"
-#: kaehmy/models.py:105
+#: kaehmy/models.py:100
msgid "Year"
msgstr "Vuosi"
-#: kaehmy/models.py:106
+#: kaehmy/models.py:101
msgid "Text"
msgstr "Teksti"
-#: kaehmy/models.py:108
+#: kaehmy/models.py:103
msgid "Custom role name"
msgstr "Uusi virka"
-#: kaehmy/models.py:110 webapp/models.py:174
+#: kaehmy/models.py:105 webapp/models.py:177
msgid "Board member"
msgstr "Hallituksen jäsen"
-#: kaehmy/models.py:118
+#: kaehmy/models.py:113
msgid "Kaehmy application: {}"
msgstr "Kaehmy: {}"
-#: kaehmy/models.py:140
+#: kaehmy/models.py:135
msgid "Board: {}"
msgstr "Hallitus: {}"
-#: kaehmy/models.py:146
+#: kaehmy/models.py:141
msgid "Official: {}"
msgstr "Toimari: {}"
-#: kaehmy/models.py:163
-msgid "Telegram channel"
-msgstr "Telegram-kanava"
-
-#: kaehmy/models.py:164
-msgid "Telegram channels"
-msgstr "Telegram-kanavat"
-
#: kaehmy/tables.py:13
msgid "Roles"
msgstr "Roolit"
@@ -404,8 +396,8 @@ msgstr ""
" Koska lista ei ole koskaan täydellinen, voit myös ehdottaa ihan "
"uutta toimenkuvaa.\n"
" Jos sinulla on kysyttävää mistä tahansa virasta, kannattaa "
-"konsultoida kaehmyopasta \n"
+"konsultoida kaehmyopasta \n"
" tai olla yhteydessä kyseistä virkaa tänä vuonna toimittavaan "
"henkilöön."
@@ -430,37 +422,33 @@ msgid "Päivämääriä & deadlineja"
msgstr "Päivämääriä & deadlineja"
#: kaehmy/templates/kaehmy.html:31
-msgid "Hallitustyrkkypaneeli"
-msgstr ""
+msgid "Vaalikokous, osa 1 (puheenjohtajan valinta) ja hallitustyrkkypaneeli"
+msgstr "Vaalikokous, osa 1 (puheenjohtajan valinta)"
#: kaehmy/templates/kaehmy.html:32
-msgid "Vaalikokous, osa 1 (puheenjohtajan valinta)"
-msgstr "Vaalikokous, osa 1 (puheenjohtajan valinta)"
+msgid "Vaalikokous, osa 2 (hallituksen valinta)"
+msgstr "Vaalikokous, osa 2 (hallituksen valinta)"
#: kaehmy/templates/kaehmy.html:33
msgid "Toimikunta-appro"
msgstr ""
#: kaehmy/templates/kaehmy.html:34
-msgid "Vaalikokous, osa 2 (hallituksen valinta)"
-msgstr "Vaalikokous, osa 2 (hallituksen valinta)"
-
-#: kaehmy/templates/kaehmy.html:35
msgid "Vaalikokous, osa 3 (toimarien valinta)"
msgstr "Vaalikokous, osa 3 (toimarien valinta)"
-#: kaehmy/templates/kaehmy.html:78
+#: kaehmy/templates/kaehmy.html:77
#, python-format
msgid ""
"\n"
-" Hyväksyn tietosuojaselosteen ja tietojeni "
+" Hyväksyn tietosuojaselosteen ja tietojeni "
"tallentamisen.\n"
" "
msgstr ""
-#: kaehmy/templates/kaehmy.html:84 members/templates/settings.html:23
+#: kaehmy/templates/kaehmy.html:83 members/templates/settings.html:23
msgid "Submit"
msgstr "Lisää"
@@ -637,8 +625,8 @@ msgstr "Hienoa! Jäsenhakemuksesi on nyt lähetetty."
#: members/templates/application_success.html:9
msgid ""
-"Vahvistusviesti on lähetetty sähköpostiisi. Ota yhteyttä admin@sahkoinsinoorikilta.fi."
-"fi jos viestiä ei näy."
+"Vahvistusviesti on lähetetty sähköpostiisi. Ota yhteyttä "
+"admin@sahkoinsinoorikilta.fi jos viestiä ei näy."
msgstr ""
#: members/templates/application_success.html:10
@@ -905,11 +893,11 @@ msgstr "Maksutapahtumia:"
msgid "Language"
msgstr "Kieli"
-#: members/templates/settings.html:20 sikweb/base.py:217
+#: members/templates/settings.html:20 sikweb/base.py:216
msgid "Finnish"
msgstr "suomi"
-#: members/templates/settings.html:21 sikweb/base.py:218
+#: members/templates/settings.html:21 sikweb/base.py:217
msgid "English"
msgstr "englanti"
@@ -1018,11 +1006,11 @@ msgstr "Øhlhäfv"
#: ohlhafv/models.py:22
msgid "Ohlhafv challenge"
-msgstr "Ohlhafv haaste"
+msgstr "Øhlhäfv-haaste"
#: ohlhafv/models.py:23
msgid "Ohlhafv challenges"
-msgstr "Ohlhafv haasteet"
+msgstr "Øhlhäfv-haasteet"
#: ohlhafv/models.py:29
msgid "Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0 L)"
@@ -1046,7 +1034,7 @@ msgstr "Sarja"
#: ohlhafv/models.py:40
msgid "Ohlhafv challenge: {} vs. {}"
-msgstr "Ohlhafv-haaste: {} vs. {}"
+msgstr "Øhlhäfv-haaste: {} vs. {}"
#: ohlhafv/templates/email.html:4
msgid "on haastanut sinut oluenjuontimittelöön"
@@ -1101,91 +1089,131 @@ msgstr "Vaihda"
msgid "Aalto-yliopiston Sähköinsinöörikilta ry"
msgstr "Aalto-yliopiston Sähköinsinöörikilta ry"
-#: webapp/models.py:18
+#: webapp/models.py:21
msgid "Webapp"
msgstr "Nettisivut"
-#: webapp/models.py:26
+#: webapp/models.py:29
msgid "Tag"
msgstr "Tunniste"
-#: webapp/models.py:27
+#: webapp/models.py:30
msgid "Tags"
msgstr "Tunnisteet"
-#: webapp/models.py:34
+#: webapp/models.py:37
msgid "Tag: {}"
msgstr "Tunniste: {}"
-#: webapp/models.py:52
+#: webapp/models.py:55
msgid "Feed"
msgstr "Uutinen"
-#: webapp/models.py:53
+#: webapp/models.py:56
msgid "Feeds"
msgstr "Uutiset"
-#: webapp/models.py:61 webapp/models.py:80 webapp/models.py:119
-#: webapp/models.py:152 webapp/models.py:198
+#: webapp/models.py:64 webapp/models.py:83 webapp/models.py:122
+#: webapp/models.py:155 webapp/models.py:201
msgid "Deleted: "
msgstr "Poistettu: "
-#: webapp/models.py:62
+#: webapp/models.py:65
msgid "{}Feed: {}"
msgstr "{}Uutinen: {}"
-#: webapp/models.py:69
+#: webapp/models.py:72
msgid "Event"
msgstr "Tapahtuma"
-#: webapp/models.py:81
+#: webapp/models.py:84
msgid "{}Event: {}"
msgstr "{}Tapahtuma: {}"
-#: webapp/models.py:91
+#: webapp/models.py:93
msgid "Template question"
msgstr "Vakiokysymys"
-#: webapp/models.py:92
+#: webapp/models.py:94
msgid "Template questions"
msgstr "Vakiokysymykset"
-#: webapp/models.py:98
+#: webapp/models.py:101
msgid "Template questions: {}"
msgstr "Vakiokysymykset: {}"
-#: webapp/models.py:105
+#: webapp/models.py:108
msgid "Signup form"
msgstr "Ilmoittautumislomake"
-#: webapp/models.py:106
+#: webapp/models.py:109
msgid "Signup forms"
msgstr "Ilmoittautumislomakkeet"
-#: webapp/models.py:120
+#: webapp/models.py:123
msgid "#{} {}{}"
msgstr ""
-#: webapp/models.py:138
+#: webapp/models.py:141
msgid "Sign-up"
msgstr "Ilmoittautuminen"
-#: webapp/models.py:139
+#: webapp/models.py:142
msgid "Sign-ups"
msgstr "Ilmoittautumiset"
-#: webapp/models.py:178
+#: webapp/models.py:181
msgid "board member"
msgstr "hallituksen jäsen"
-#: webapp/models.py:185
+#: webapp/models.py:188
msgid "JobAd"
msgstr "Työpaikkailmoitus"
-#: webapp/models.py:186
+#: webapp/models.py:189
msgid "JobAds"
msgstr "Työpaikkailmoitukset"
+#: webapp/models.py:211
+msgid "Hook Kaehmys"
+msgstr "Lähetä Kähmyt"
+
+#: webapp/models.py:212
+msgid "Hook Ohlhafv challenges"
+msgstr "Lähetä Øhlhäfv-haasteet"
+
+#: webapp/models.py:213
+msgid "Hook published news"
+msgstr "Lähetä julkaistut uutiset"
+
+#: webapp/models.py:214
+msgid "Hook published Job Ads"
+msgstr "Lähetä työpaikkailmoitukset"
+
+#: webapp/models.py:215
+msgid "Hook published events"
+msgstr "Lähetä julkaistut tapahtumat"
+
+#: webapp/models.py:216
+msgid "Hook opened signups"
+msgstr "Lähetä auenneet ilmot"
+
+#: webapp/models.py:241
+msgid "Webhook"
+msgstr "Webhook"
+
+#: webapp/models.py:242
+msgid "Webhooks"
+msgstr "Webhookit"
+
+#: webapp/models.py:256
+msgid "Telegram channel"
+msgstr "Telegram-kanava"
+
+#: webapp/models.py:257
+msgid "Telegram channels"
+msgstr "Telegram-kanavat"
+
#: webapp/templates/contact.html:9 webapp/templates/navigation.html:20
msgid "Contact"
msgstr "Yhteystiedot"
diff --git a/ohlhafv/views.py b/ohlhafv/views.py
index 76067e0..b62eaf0 100644
--- a/ohlhafv/views.py
+++ b/ohlhafv/views.py
@@ -20,7 +20,7 @@ from ohlhafv.models import OhlhafvChallenge
from ohlhafv.forms import OhlhafvForm
from ohlhafv.tables import OhlhafvTable
from webapp.utils import send_email
-from kaehmy.tgbot import TelegramBot
+from webapp.webhook import processHooks
@require_http_methods(["GET"])
@@ -43,22 +43,21 @@ def ohlhafv_submit(request, *args, **kwargs):
url = f'https://{URL}/ohlhafv/list'
subject = _('Sinut on haastettu Ohlhäfviin!')
- message = render_to_string(
+ email_body = render_to_string(
'ohlhafv:email.html', {
'challenge': challenge,
'url': url,
}
)
- send_email(email, subject, message)
+ send_email(email, subject, email_body)
try:
- tg_message = render_to_string(
+ webhook_message = render_to_string(
'ohlhafv:tgmsg.tpl', {
'challenge': challenge,
'url': url})
- bot = TelegramBot()
- bot.broadcast(tg_message)
- except Exception: # tg spam is not critical. Ignore on failure
+ processHooks(message=webhook_message, eventType="ohlhafv")
+ except Exception:
pass
logging.debug(
diff --git a/poetry.lock b/poetry.lock
index 15b2654..8b9b07f 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -243,6 +243,17 @@ phonenumbers = {version = ">=7.0.2", optional = true, markers = "extra == \"phon
phonenumbers = ["phonenumbers (>=7.0.2)"]
phonenumberslite = ["phonenumberslite (>=7.0.2)"]
+[[package]]
+name = "django-polymorphic"
+version = "3.1.0"
+description = "Seamless polymorphic inheritance for Django models"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+Django = ">=2.1"
+
[[package]]
name = "django-suit"
version = "0.2.28"
@@ -763,7 +774,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-
[metadata]
lock-version = "1.1"
python-versions = "^3.9"
-content-hash = "755a353d6f70eab1933125429b38d1e7249f57a9a61769507a3ef624f2d3cddb"
+content-hash = "9d958b16dbad0528e51f6e4a2022cb13fbd5c210ef5e4d9d898afdae373ad470"
[metadata.files]
attrs = [
@@ -900,6 +911,10 @@ django-phonenumber-field = [
{file = "django-phonenumber-field-4.0.0.tar.gz", hash = "sha256:d4580cc3352f4433962825f9927e6669852c1b40ec484fcb5a74064dabc1201a"},
{file = "django_phonenumber_field-4.0.0-py3-none-any.whl", hash = "sha256:2ca3bb0ada0ebc164bd903a981a34f1202a4294006e520b0da961bd7ce9f20a4"},
]
+django-polymorphic = [
+ {file = "django-polymorphic-3.1.0.tar.gz", hash = "sha256:d6955b5308bf6e41dcb22ba7c96f00b51dfa497a8a5ab1e9c06c7951bf417bf8"},
+ {file = "django_polymorphic-3.1.0-py3-none-any.whl", hash = "sha256:08bc4f4f4a773a19b2deced5a56deddd1ef56ebd15207bf4052e2901c25ef57e"},
+]
django-suit = [
{file = "django-suit-0.2.28.tar.gz", hash = "sha256:bacd8a079fcc08deb6efd0d7f60241e3c319526939ae1abe8ccfbc1b03e97104"},
{file = "django_suit-0.2.28-py2.py3-none-any.whl", hash = "sha256:256412597ac8e9461780542eebb12b37f65ff702bf23de23d07d245510c64ff2"},
diff --git a/pyproject.toml b/pyproject.toml
index 41d3e64..1556927 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -37,6 +37,7 @@ gunicorn = "^20.1.0"
Pillow = "^8.4.0"
sendgrid = "^6.7.0"
sentry-sdk = "^1.4.3"
+django-polymorphic = "^3.1.0"
[tool.poetry.dev-dependencies]
coverage = "^5.5"
diff --git a/webapp/admin.py b/webapp/admin.py
index 32d910a..7ab6571 100644
--- a/webapp/admin.py
+++ b/webapp/admin.py
@@ -1,7 +1,7 @@
"""File containing webapp app admin registers."""
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, BaseWebhook, GenericWebhook, TelegramHook
from modeltranslation.admin import TranslationAdmin
from django.contrib.auth.models import Permission
# this is needed so that the models get registered for translation
@@ -16,3 +16,5 @@ admin.site.register(SignupForm, TranslationAdmin)
admin.site.register(Signup, TranslationAdmin)
admin.site.register(TemplateQuestion, TranslationAdmin)
admin.site.register(JobAd, TranslationAdmin)
+admin.site.register(GenericWebhook, TranslationAdmin)
+admin.site.register(TelegramHook, TranslationAdmin)
diff --git a/webapp/migrations/0078_basewebhook_genericwebhook_telegramhook.py b/webapp/migrations/0078_basewebhook_genericwebhook_telegramhook.py
new file mode 100644
index 0000000..a48ae4c
--- /dev/null
+++ b/webapp/migrations/0078_basewebhook_genericwebhook_telegramhook.py
@@ -0,0 +1,59 @@
+# Generated by Django 2.2.26 on 2022-01-12 21:32
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('contenttypes', '0002_remove_content_type_name'),
+ ('webapp', '0077_templatequestion_deleted'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='BaseWebhook',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=255)),
+ ('url', models.URLField()),
+ ('kaehmy_submit', models.BooleanField(default=False)),
+ ('ohlhafv_submit', models.BooleanField(default=False)),
+ ('feed_published', models.BooleanField(default=False)),
+ ('jobad_published', models.BooleanField(default=False)),
+ ('event_published', models.BooleanField(default=False)),
+ ('signup_opened', models.BooleanField(default=False)),
+ ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_webapp.basewebhook_set+', to='contenttypes.ContentType')),
+ ],
+ options={
+ 'abstract': False,
+ 'base_manager_name': 'objects',
+ },
+ ),
+ migrations.CreateModel(
+ name='TelegramHook',
+ fields=[
+ ('basewebhook_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseWebhook')),
+ ('channel_id', models.CharField(max_length=255, unique=True)),
+ ],
+ options={
+ 'verbose_name': 'Telegram channel',
+ 'verbose_name_plural': 'Telegram channels',
+ },
+ bases=('webapp.basewebhook',),
+ ),
+ migrations.CreateModel(
+ name='GenericWebhook',
+ fields=[
+ ],
+ options={
+ 'verbose_name': 'Webhook',
+ 'verbose_name_plural': 'Webhooks',
+ 'proxy': True,
+ 'indexes': [],
+ 'constraints': [],
+ },
+ bases=('webapp.basewebhook',),
+ ),
+ ]
diff --git a/webapp/models.py b/webapp/models.py
index a1276e8..e7c697b 100644
--- a/webapp/models.py
+++ b/webapp/models.py
@@ -2,16 +2,19 @@
from django.conf import settings
from django.db import models
+from django.db.models.fields import CharField
from django.utils import timezone
# from datetime import timedelta
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
+import requests
from webapp.utils import month_from_now, send_signup_email
from django.utils.translation import ugettext_lazy as _
from auditlog.registry import auditlog
from phonenumber_field.modelfields import PhoneNumberField
from django.contrib.postgres.fields import JSONField
+from polymorphic.models import PolymorphicModel
from uuid import uuid4
import logging
@@ -199,9 +202,78 @@ class JobAd(models.Model):
return f'{delete_str}{self.title}'
+class BaseWebhook(PolymorphicModel):
+ """Webhook base class instance"""
+
+ name = models.CharField(max_length=255)
+ url = models.URLField() # URL where webhook message is broadcast. For example Telegram webhook API
+ # "Plugs"; which notifications are sent to this specific webhook instance
+ kaehmy_submit = models.BooleanField(_("Hook Kaehmys"), default=False)
+ ohlhafv_submit = models.BooleanField(_("Hook Ohlhafv challenges"),default=False)
+ feed_published = models.BooleanField(_("Hook published news"),default=False)
+ jobad_published = models.BooleanField(_("Hook published Job Ads"),default=False)
+ event_published = models.BooleanField(_("Hook published events"),default=False)
+ signup_opened = models.BooleanField(_("Hook opened signups"),default=False)
+
+ @property
+ def plugs(self):
+ return {
+ "kaehmy": self.kaehmy_submit,
+ "ohlhafv": self.ohlhafv_submit,
+ "feed": self.feed_published,
+ "jobad": self.jobad_published,
+ "event": self.event_published,
+ "signup":self.signup_opened,
+ }
+
+ def parseData(self):
+ pass
+
+ def broadcast(self, message):
+ resp = requests.post(self.url, json=self.parseData(message))
+ logging.debug(f'Webhook API response: HTTP{resp.status_code}')
+ logging.debug(resp.content)
+
+
+class GenericWebhook(BaseWebhook):
+ class Meta:
+ proxy = True
+ verbose_name = _('Webhook')
+ verbose_name_plural = _('Webhooks')
+
+ def __str__(self):
+ return 'Webhook "{}"'.format(self.name)
+
+ def parseData(self, message):
+ return {
+ "text": message
+ }
+
+class TelegramHook(BaseWebhook):
+ """Model containing the channel id of a Telegram chat"""
+
+ class Meta:
+ verbose_name = _('Telegram channel')
+ verbose_name_plural = _('Telegram channels')
+
+ channel_id = models.CharField(max_length=255, unique=True)
+
+ def __str__(self):
+ return 'Telegram channel: "{}"'.format(self.name)
+
+ def parseData(self, message):
+ return {
+ 'text': message,
+ 'chat_id': self.channel_id,
+ 'parse_mode': 'Markdown'
+ }
+
+
auditlog.register(Tag)
auditlog.register(Feed)
auditlog.register(Event)
auditlog.register(SignupForm)
auditlog.register(Signup)
auditlog.register(JobAd)
+auditlog.register(GenericWebhook)
+auditlog.register(TelegramHook)
diff --git a/webapp/translation.py b/webapp/translation.py
index c7e293b..42e69f0 100644
--- a/webapp/translation.py
+++ b/webapp/translation.py
@@ -42,3 +42,18 @@ class TemplateQuestionTranslationOptions(TranslationOptions):
@register(JobAd)
class JobAdTranslationOptions(TranslationOptions):
fields = ('title', 'description', 'content',)
+
+
+@register(BaseWebhook)
+class BaseWebhookOptions(TranslationOptions):
+ fields = ()
+
+
+@register(GenericWebhook)
+class GenericWebhookOptions(TranslationOptions):
+ fields = ()
+
+
+@register(TelegramHook)
+class TelegramHookTranslationOptions(TranslationOptions):
+ fields = ()
diff --git a/webapp/webhook.py b/webapp/webhook.py
new file mode 100644
index 0000000..0e06960
--- /dev/null
+++ b/webapp/webhook.py
@@ -0,0 +1,9 @@
+from webapp.models import BaseWebhook
+import logging
+
+def processHooks(message: str, eventType: str):
+ allHooks = BaseWebhook.objects.all()
+ for hook in list(allHooks):
+ logging.debug(hook)
+ if (hook.plugs[eventType] == True):
+ hook.broadcast(message)