Merge branch 'develop' into 'master'

Prod deploy

* Soft deletes

* sahkoinsinoorikilta.fi domain

See merge request sahkoinsinoorikilta/vtmk/web2.0-backend!34
This commit is contained in:
Aarni Halinen
2021-01-19 15:42:22 +00:00
15 changed files with 279 additions and 272 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
HOST=web.sik.party
HOST=api.dev.sahkoinsinoorikilta.fi
DEBUG=True
SECRET_KEY=7p$85^4ibb^p4-=vs44b7!y0e-zemugze18@a#30&71=a8)dp(
TG_BOT_TOKEN=
+2 -2
View File
@@ -78,7 +78,7 @@ deploy:dev:
- develop
environment:
name: dev
url: http://api.dev.sik.party
url: http://api.dev.sahkoinsinoorikilta.fi
variables:
DOCKER_HOST: $DEV_CI_DOCKER_HOST
DOCKER_TLS_VERIFY: 1
@@ -100,7 +100,7 @@ deploy:production:
- master
environment:
name: production
url: api.sika.sik.party
url: api.sahkoinsinoorikilta.fi
when: manual
variables:
DOCKER_HOST: $CI_DOCKER_HOST
+1 -1
View File
@@ -16,7 +16,7 @@
{% blocktrans %}Kaehmykoneella voit ilmaista kiinnostuksesi toimia killassa ensi vuonna.
Listassa on vastuualueittain sekä hallitus- että toimihenkilövirkoja.
Koska lista ei ole koskaan täydellinen, voit myös ehdottaa ihan uutta toimenkuvaa.
Jos sinulla on kysyttävää mistä tahansa virasta, kannattaa konsultoida <a href="https://static.sika.sik.party/uus_webi/kahmyopas.pdf">kaehmyopasta</a>
Jos sinulla on kysyttävää mistä tahansa virasta, kannattaa konsultoida <a href="https://static.sahkoinsinoorikilta.fi/uus_webi/kahmyopas.pdf">kaehmyopasta</a>
tai olla yhteydessä kyseistä virkaa tänä vuonna toimittavaan henkilöön.{% endblocktrans %}
</p>
<p>
Binary file not shown.
+72 -118
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-07 17:05+0200\n"
"POT-Creation-Date: 2021-01-18 21:36+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:68
#: infoscreen/models.py:212 webapp/models.py:70
msgid "Events"
msgstr "Events"
@@ -112,9 +112,8 @@ msgstr "Preview"
msgid "Delete"
msgstr "Delete"
#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:56
#: kaehmy/templates/list.html:36 webapp/models.py:138 webapp/models.py:166
#: webapp/models.py:192
#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:62
#: kaehmy/templates/list.html:36 webapp/models.py:144 webapp/models.py:173
msgid "Name"
msgstr "Name"
@@ -202,157 +201,157 @@ 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:13
#: kaehmy/models.py:18
msgid "Kaehmy"
msgstr "Kaehmy"
#: kaehmy/models.py:19
#: kaehmy/models.py:25
msgid "Corporate affairs"
msgstr "Corporate affairs"
#: kaehmy/models.py:20 webapp/templates/freshmen.html:10
#: kaehmy/models.py:26 webapp/templates/freshmen.html:10
#: webapp/templates/navigation.html:8
msgid "Freshmen"
msgstr "Freshmen"
#: kaehmy/models.py:21 webapp/templates/international.html:10
#: kaehmy/models.py:27 webapp/templates/international.html:10
#: webapp/templates/navigation.html:14
msgid "International"
msgstr "International"
#: kaehmy/models.py:22
#: kaehmy/models.py:28
msgid "External affairs"
msgstr "External affairs"
#: kaehmy/models.py:23
#: kaehmy/models.py:29
msgid "Media"
msgstr ""
#: kaehmy/models.py:24
#: kaehmy/models.py:30
msgid "Technology"
msgstr ""
#: kaehmy/models.py:25
#: kaehmy/models.py:31
msgid "Wellbeing"
msgstr ""
#: kaehmy/models.py:26
#: kaehmy/models.py:32
msgid "Elepaja"
msgstr ""
#: kaehmy/models.py:27
#: kaehmy/models.py:33
msgid "Ceremonies"
msgstr ""
#: kaehmy/models.py:28
#: kaehmy/models.py:34
msgid "Studies"
msgstr ""
#: kaehmy/models.py:29
#: kaehmy/models.py:35
msgid "Sössö magazine"
msgstr "Sössö magazine"
#: kaehmy/models.py:30
#: kaehmy/models.py:36
msgid "Alumni relations"
msgstr "Alumni relations"
#: kaehmy/models.py:31
#: kaehmy/models.py:37
msgid "Others"
msgstr ""
#: kaehmy/models.py:33
#: kaehmy/models.py:39
msgid "Category"
msgstr ""
#: kaehmy/models.py:39 webapp/models.py:176
#: kaehmy/models.py:45
msgid "Description"
msgstr "Description"
#: kaehmy/models.py:42
#: kaehmy/models.py:48
msgid "Preset kaehmy role"
msgstr "Preset kaehmy role"
#: kaehmy/models.py:43
#: kaehmy/models.py:49
msgid "Preset kaehmy roles"
msgstr "Preset kaehmy roles"
#: kaehmy/models.py:50
#: kaehmy/models.py:56
msgid "Custom kaehmy role"
msgstr "Custom kaehmy role"
#: kaehmy/models.py:51
#: kaehmy/models.py:57
msgid "Custom kaehmy roles"
msgstr "Custom kaehmy roles"
#: kaehmy/models.py:57 kaehmy/templates/list.html:40 members/models.py:14
#: kaehmy/models.py:63 kaehmy/templates/list.html:40 members/models.py:14
msgid "Email"
msgstr "Email"
#: kaehmy/models.py:58
#: kaehmy/models.py:64
msgid "Timestamp"
msgstr ""
#: kaehmy/models.py:72
#: kaehmy/models.py:78
msgid "Kaehmykommentti"
msgstr "Kaehmy comment"
#: kaehmy/models.py:73
#: kaehmy/models.py:79
msgid "Kaehmykommentit"
msgstr "Kaehmy comments"
#: kaehmy/models.py:75 ohlhafv/models.py:36
#: kaehmy/models.py:81 ohlhafv/models.py:36
msgid "Message"
msgstr ""
#: kaehmy/models.py:94 kaehmy/templates/kaehmy.html:12
#: kaehmy/models.py:100 kaehmy/templates/kaehmy.html:12
msgid "Kaehmylomake"
msgstr "Kaehmy application"
#: kaehmy/models.py:95
#: kaehmy/models.py:101
msgid "Kaehmylomakkeet"
msgstr "Kaehmy applications"
#: kaehmy/models.py:98 webapp/models.py:252
#: kaehmy/models.py:104
msgid "Phone number"
msgstr ""
#: kaehmy/models.py:99
#: kaehmy/models.py:105
msgid "Year"
msgstr ""
#: kaehmy/models.py:100
#: kaehmy/models.py:106
msgid "Text"
msgstr ""
#: kaehmy/models.py:102
#: kaehmy/models.py:108
msgid "Custom role name"
msgstr ""
#: kaehmy/models.py:104 webapp/models.py:167
#: kaehmy/models.py:110 webapp/models.py:174
msgid "Board member"
msgstr "Board member"
#: kaehmy/models.py:112
#: kaehmy/models.py:118
msgid "Kaehmy application: {}"
msgstr "Kaehmy application: {}"
#: kaehmy/models.py:134
#: kaehmy/models.py:140
msgid "Board: {}"
msgstr ""
#: kaehmy/models.py:140
#: kaehmy/models.py:146
msgid "Official: {}"
msgstr ""
#: kaehmy/models.py:157
#: kaehmy/models.py:163
msgid "Telegram channel"
msgstr ""
#: kaehmy/models.py:158
#: kaehmy/models.py:164
msgid "Telegram channels"
msgstr ""
#: kaehmy/tables.py:13 webapp/models.py:207
#: kaehmy/tables.py:13
msgid "Roles"
msgstr ""
@@ -393,8 +392,8 @@ msgid ""
" 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 <a href=\"https://static.sika.sik.party/uus_webi/kahmyopas.pdf"
"\">kaehmyopasta</a>\n"
"konsultoida <a href=\"https://static.sahkoinsinoorikilta.fi/uus_webi/"
"kahmyopas.pdf\">kaehmyopasta</a>\n"
" tai olla yhteydessä kyseistä virkaa tänä vuonna toimittavaan "
"henkilöön."
msgstr ""
@@ -410,7 +409,9 @@ msgstr ""
msgid ""
"(HUOM! Kaehmytekstin maksimipituus on 300 merkkiä. Tarvittaessa voit "
"kirjoittaa lisätietoja kommenteihin.)"
msgstr "(NOTE! The application text is limited to 300 characters. You can use the comment section for additional info.)"
msgstr ""
"(NOTE! The application text is limited to 300 characters. You can use the "
"comment section for additional info.)"
#: kaehmy/templates/kaehmy.html:26
msgid ""
@@ -528,11 +529,11 @@ msgstr "I'm a member of AYY"
msgid "I want to receive a weekly newsletter"
msgstr "I want to receive a weekly newsletter"
#: members/models.py:12 webapp/models.py:249
#: members/models.py:12
msgid "First name"
msgstr "First name"
#: members/models.py:13 webapp/models.py:250
#: members/models.py:13
msgid "Last name"
msgstr "Last name"
@@ -1135,111 +1136,64 @@ msgstr ""
msgid "Feeds"
msgstr ""
#: webapp/models.py:60
msgid "Feed: {}"
msgstr "Feed: {}"
#: webapp/models.py:61 webapp/models.py:80 webapp/models.py:119
#: webapp/models.py:152 webapp/models.py:198
msgid "Deleted: "
msgstr "Deleted: "
#: webapp/models.py:67
#: webapp/models.py:62
msgid "{}Feed: {}"
msgstr ""
#: webapp/models.py:69
msgid "Event"
msgstr ""
#: webapp/models.py:77
msgid "Event: {}"
#: webapp/models.py:81
msgid "{}Event: {}"
msgstr ""
#: webapp/models.py:87
#: webapp/models.py:91
msgid "Template question"
msgstr ""
#: webapp/models.py:88
#: webapp/models.py:92
msgid "Template questions"
msgstr ""
#: webapp/models.py:94
#: webapp/models.py:98
msgid "Template questions: {}"
msgstr ""
#: webapp/models.py:101
#: webapp/models.py:105
msgid "Signup form"
msgstr ""
#: webapp/models.py:102
#: webapp/models.py:106
msgid "Signup forms"
msgstr ""
#: webapp/models.py:114
msgid "#{} {}"
#: webapp/models.py:120
msgid "#{} {}{}"
msgstr ""
#: webapp/models.py:132
#: webapp/models.py:138
msgid "Sign-up"
msgstr ""
#: webapp/models.py:133
#: webapp/models.py:139
msgid "Sign-ups"
msgstr ""
#: webapp/models.py:171
#: webapp/models.py:178
msgid "board member"
msgstr "board member"
#: webapp/models.py:186
msgid "Committee"
msgstr ""
#: webapp/models.py:187
msgid "Committees"
msgstr ""
#: webapp/models.py:190
msgid "Committee: {}"
msgstr ""
#: webapp/models.py:206
msgid "Role"
msgstr ""
#: webapp/models.py:212
msgid "Yes"
msgstr ""
#: webapp/models.py:212
msgid "No"
msgstr ""
#: webapp/models.py:223
msgid "Occupation"
msgstr "Occupation"
#: webapp/models.py:224
msgid "Occupations"
msgstr "Occupations"
#: webapp/models.py:226
msgid "Start date"
msgstr ""
#: webapp/models.py:227
msgid "End date"
msgstr ""
#: webapp/models.py:244
msgid "Official"
msgstr ""
#: webapp/models.py:245
msgid "Officials"
msgstr ""
#: webapp/models.py:251
msgid "Email address"
msgstr ""
#: webapp/models.py:277
#: webapp/models.py:185
msgid "JobAd"
msgstr ""
#: webapp/models.py:278
#: webapp/models.py:186
msgid "JobAds"
msgstr ""
Binary file not shown.
+71 -119
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-07 17:05+0200\n"
"POT-Creation-Date: 2021-01-18 21:36+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:68
#: infoscreen/models.py:212 webapp/models.py:70
msgid "Events"
msgstr "Tapahtumat"
@@ -113,9 +113,8 @@ msgstr "Esikatsele"
msgid "Delete"
msgstr "Poista"
#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:56
#: kaehmy/templates/list.html:36 webapp/models.py:138 webapp/models.py:166
#: webapp/models.py:192
#: infoscreen/templates/tabs/add_remove.html:23 kaehmy/models.py:62
#: kaehmy/templates/list.html:36 webapp/models.py:144 webapp/models.py:173
msgid "Name"
msgstr "Nimi"
@@ -203,157 +202,157 @@ msgstr "Virheellinen puhelinnumero"
msgid "Custom role with the same name already exists."
msgstr "Samanniminen virka on jo olemassa."
#: kaehmy/models.py:13
#: kaehmy/models.py:18
msgid "Kaehmy"
msgstr "Kaehmy"
#: kaehmy/models.py:19
#: kaehmy/models.py:25
msgid "Corporate affairs"
msgstr "Yrityssuhteet"
#: kaehmy/models.py:20 webapp/templates/freshmen.html:10
#: kaehmy/models.py:26 webapp/templates/freshmen.html:10
#: webapp/templates/navigation.html:8
msgid "Freshmen"
msgstr "Fuksit"
#: kaehmy/models.py:21 webapp/templates/international.html:10
#: kaehmy/models.py:27 webapp/templates/international.html:10
#: webapp/templates/navigation.html:14
msgid "International"
msgstr "International"
#: kaehmy/models.py:22
#: kaehmy/models.py:28
msgid "External affairs"
msgstr "Ulkosuhteet"
#: kaehmy/models.py:23
#: kaehmy/models.py:29
msgid "Media"
msgstr "Media"
#: kaehmy/models.py:24
#: kaehmy/models.py:30
msgid "Technology"
msgstr "Teknologia"
#: kaehmy/models.py:25
#: kaehmy/models.py:31
msgid "Wellbeing"
msgstr "Hyvinvointi"
#: kaehmy/models.py:26
#: kaehmy/models.py:32
msgid "Elepaja"
msgstr "Elepaja"
#: kaehmy/models.py:27
#: kaehmy/models.py:33
msgid "Ceremonies"
msgstr "Hupitapahtumat"
#: kaehmy/models.py:28
#: kaehmy/models.py:34
msgid "Studies"
msgstr "Opinnot"
#: kaehmy/models.py:29
#: kaehmy/models.py:35
msgid "Sössö magazine"
msgstr "Kiltalehti Sössö"
#: kaehmy/models.py:30
#: kaehmy/models.py:36
msgid "Alumni relations"
msgstr "Alumnisuhteet"
#: kaehmy/models.py:31
#: kaehmy/models.py:37
msgid "Others"
msgstr "Muut"
#: kaehmy/models.py:33
#: kaehmy/models.py:39
msgid "Category"
msgstr "Kategoria"
#: kaehmy/models.py:39 webapp/models.py:176
#: kaehmy/models.py:45
msgid "Description"
msgstr "Kuvaus"
#: kaehmy/models.py:42
#: kaehmy/models.py:48
msgid "Preset kaehmy role"
msgstr "Kaehmyvirka"
#: kaehmy/models.py:43
#: kaehmy/models.py:49
msgid "Preset kaehmy roles"
msgstr "Kaehmyvirat"
#: kaehmy/models.py:50
#: kaehmy/models.py:56
msgid "Custom kaehmy role"
msgstr "Uusi virka"
#: kaehmy/models.py:51
#: kaehmy/models.py:57
msgid "Custom kaehmy roles"
msgstr "Uudet kaehmyvirat"
#: kaehmy/models.py:57 kaehmy/templates/list.html:40 members/models.py:14
#: kaehmy/models.py:63 kaehmy/templates/list.html:40 members/models.py:14
msgid "Email"
msgstr "Sähköposti"
#: kaehmy/models.py:58
#: kaehmy/models.py:64
msgid "Timestamp"
msgstr "Aikaleima"
#: kaehmy/models.py:72
#: kaehmy/models.py:78
msgid "Kaehmykommentti"
msgstr "Kaehmykommentti"
#: kaehmy/models.py:73
#: kaehmy/models.py:79
msgid "Kaehmykommentit"
msgstr "Kaehmykommentit"
#: kaehmy/models.py:75 ohlhafv/models.py:36
#: kaehmy/models.py:81 ohlhafv/models.py:36
msgid "Message"
msgstr "Viesti"
#: kaehmy/models.py:94 kaehmy/templates/kaehmy.html:12
#: kaehmy/models.py:100 kaehmy/templates/kaehmy.html:12
msgid "Kaehmylomake"
msgstr "Kaehmylomake"
#: kaehmy/models.py:95
#: kaehmy/models.py:101
msgid "Kaehmylomakkeet"
msgstr "Kaehmylomakkeet"
#: kaehmy/models.py:98 webapp/models.py:252
#: kaehmy/models.py:104
msgid "Phone number"
msgstr "Puhelinnumero"
#: kaehmy/models.py:99
#: kaehmy/models.py:105
msgid "Year"
msgstr "Vuosi"
#: kaehmy/models.py:100
#: kaehmy/models.py:106
msgid "Text"
msgstr "Teksti"
#: kaehmy/models.py:102
#: kaehmy/models.py:108
msgid "Custom role name"
msgstr "Uusi virka"
#: kaehmy/models.py:104 webapp/models.py:167
#: kaehmy/models.py:110 webapp/models.py:174
msgid "Board member"
msgstr "Hallituksen jäsen"
#: kaehmy/models.py:112
#: kaehmy/models.py:118
msgid "Kaehmy application: {}"
msgstr "Kaehmy: {}"
#: kaehmy/models.py:134
#: kaehmy/models.py:140
msgid "Board: {}"
msgstr "Hallitus: {}"
#: kaehmy/models.py:140
#: kaehmy/models.py:146
msgid "Official: {}"
msgstr "Toimari: {}"
#: kaehmy/models.py:157
#: kaehmy/models.py:163
msgid "Telegram channel"
msgstr "Telegram-kanava"
#: kaehmy/models.py:158
#: kaehmy/models.py:164
msgid "Telegram channels"
msgstr "Telegram-kanavat"
#: kaehmy/tables.py:13 webapp/models.py:207
#: kaehmy/tables.py:13
msgid "Roles"
msgstr "Roolit"
@@ -394,8 +393,8 @@ msgid ""
" 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 <a href=\"https://static.sika.sik.party/uus_webi/kahmyopas.pdf"
"\">kaehmyopasta</a>\n"
"konsultoida <a href=\"https://static.sahkoinsinoorikilta.fi/uus_webi/"
"kahmyopas.pdf\">kaehmyopasta</a>\n"
" tai olla yhteydessä kyseistä virkaa tänä vuonna toimittavaan "
"henkilöön."
msgstr ""
@@ -405,7 +404,7 @@ 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 <a href=\"https://static.sika.sik.party/uus_webi/kahmyopas.pdf"
"konsultoida <a href=\"https://static.sahkoinsinoorikilta.fi/uus_webi/kahmyopas.pdf"
"\">kaehmyopasta</a> \n"
" tai olla yhteydessä kyseistä virkaa tänä vuonna toimittavaan "
"henkilöön."
@@ -527,11 +526,11 @@ msgstr "Olen AYY:n jäsen"
msgid "I want to receive a weekly newsletter"
msgstr "Haluan saada viikottaisen jäsentiedotteen"
#: members/models.py:12 webapp/models.py:249
#: members/models.py:12
msgid "First name"
msgstr "Etunimi"
#: members/models.py:13 webapp/models.py:250
#: members/models.py:13
msgid "Last name"
msgstr "Sukunimi"
@@ -1126,111 +1125,64 @@ msgstr "Uutinen"
msgid "Feeds"
msgstr "Uutiset"
#: webapp/models.py:60
msgid "Feed: {}"
msgstr "Uutinen: {}"
#: webapp/models.py:61 webapp/models.py:80 webapp/models.py:119
#: webapp/models.py:152 webapp/models.py:198
msgid "Deleted: "
msgstr "Poistettu: "
#: webapp/models.py:67
#: webapp/models.py:62
msgid "{}Feed: {}"
msgstr "{}Uutinen: {}"
#: webapp/models.py:69
msgid "Event"
msgstr "Tapahtuma"
#: webapp/models.py:77
msgid "Event: {}"
msgstr "Tapahtuma: {}"
#: webapp/models.py:81
msgid "{}Event: {}"
msgstr "{}Tapahtuma: {}"
#: webapp/models.py:87
#: webapp/models.py:91
msgid "Template question"
msgstr "Vakiokysymys"
#: webapp/models.py:88
#: webapp/models.py:92
msgid "Template questions"
msgstr "Vakiokysymykset"
#: webapp/models.py:94
#: webapp/models.py:98
msgid "Template questions: {}"
msgstr "Vakiokysymykset: {}"
#: webapp/models.py:101
#: webapp/models.py:105
msgid "Signup form"
msgstr "Ilmoittautumislomake"
#: webapp/models.py:102
#: webapp/models.py:106
msgid "Signup forms"
msgstr "Ilmoittautumislomakkeet"
#: webapp/models.py:114
msgid "#{} {}"
#: webapp/models.py:120
msgid "#{} {}{}"
msgstr ""
#: webapp/models.py:132
#: webapp/models.py:138
msgid "Sign-up"
msgstr "Ilmoittautuminen"
#: webapp/models.py:133
#: webapp/models.py:139
msgid "Sign-ups"
msgstr "Ilmoittautumiset"
#: webapp/models.py:171
#: webapp/models.py:178
msgid "board member"
msgstr "hallituksen jäsen"
#: webapp/models.py:186
msgid "Committee"
msgstr "Toimikunta"
#: webapp/models.py:187
msgid "Committees"
msgstr "Toimikunnat"
#: webapp/models.py:190
msgid "Committee: {}"
msgstr "Toimikunta: {}"
#: webapp/models.py:206
msgid "Role"
msgstr "Rooli"
#: webapp/models.py:212
msgid "Yes"
msgstr "Kyllä"
#: webapp/models.py:212
msgid "No"
msgstr "Ei"
#: webapp/models.py:223
msgid "Occupation"
msgstr "Virka"
#: webapp/models.py:224
msgid "Occupations"
msgstr "Virat"
#: webapp/models.py:226
msgid "Start date"
msgstr "Alkupäivämäärä"
#: webapp/models.py:227
msgid "End date"
msgstr "Loppupäivämäärä"
#: webapp/models.py:244
msgid "Official"
msgstr "Toimihenkilö"
#: webapp/models.py:245
msgid "Officials"
msgstr "Toimihenkilöt"
#: webapp/models.py:251
msgid "Email address"
msgstr "Sähköposti"
#: webapp/models.py:277
#: webapp/models.py:185
msgid "JobAd"
msgstr "Työpaikkailmoitus"
#: webapp/models.py:278
#: webapp/models.py:186
msgid "JobAds"
msgstr "Työpaikkailmoitukset"
+2 -2
View File
@@ -16,8 +16,8 @@ from sikweb.base import *
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = os.getenv('DEBUG', False) == 'True'
URL = os.getenv("HOST", "api.sika.sik.party")
FRONTEND_URL = os.getenv("FRONTEND_URL", "sika.sik.party")
URL = os.getenv("HOST", "api.sahkoinsinoorikilta.fi")
FRONTEND_URL = os.getenv("FRONTEND_URL", "prod.sahkoinsinoorikilta.fi")
ALLOWED_HOSTS = ["localhost", "127.0.0.1", FRONTEND_URL, URL]
if DEBUG:
ALLOWED_HOSTS = ["*"]
+2 -2
View File
@@ -27,8 +27,8 @@ services:
- 8000:8000
environment:
- HOST=api.dev.sik.party
- FRONTEND_URL=dev.sik.party
- HOST=api.dev.sahkoinsinoorikilta.fi
- FRONTEND_URL=dev.sahkoinsinoorikilta.fi
- DEBUG=True
- EMAIL_API_KEY_FILE=/run/secrets/DJANGO_EMAIL_API_KEY
- EMAIL_API_SECRET_FILE=/run/secrets/DJANGO_EMAIL_API_SECRET
+2 -2
View File
@@ -46,8 +46,8 @@ services:
- TG_BOT_TOKEN_FILE=/run/secrets/BACKEND_TG_BOT_TOKEN
- DB_USER_FILE=/run/secrets/BACKEND_DB_USER
- DB_PASSWD_FILE=/run/secrets/BACKEND_DB_PASSWD
- HOST=api.sika.sik.party
- FRONTEND_URL=sika.sik.party
- HOST=api.sahkoinsinoorikilta.fi
- FRONTEND_URL=prod.sahkoinsinoorikilta.fi
- DB_HOST=db
- DB_PORT=5432
- EMAIL_API_KEY_FILE=/run/secrets/BACKEND_EMAIL_API_KEY
@@ -0,0 +1,33 @@
# Generated by Django 2.1.5 on 2021-01-14 19:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('webapp', '0074_signup_deleted'),
]
operations = [
migrations.AddField(
model_name='event',
name='deleted',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='feed',
name='deleted',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='jobad',
name='deleted',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='signupform',
name='deleted',
field=models.BooleanField(default=False),
),
]
+16 -4
View File
@@ -55,9 +55,11 @@ class Feed(BaseFeed):
publish_time = models.DateTimeField(default=timezone.now)
autohide = models.DateTimeField(default=month_from_now)
autohide_enabled = models.BooleanField(default=False)
deleted = models.BooleanField(default=False)
def __str__(self):
return _('Feed: {}').format(self.title)
delete_str = _("Deleted: ") if self.deleted else ""
return _('{}Feed: {}').format(delete_str, self.title)
class Event(BaseFeed):
@@ -72,9 +74,11 @@ class Event(BaseFeed):
signupForm = models.ManyToManyField(
'SignupForm', blank=True, related_name="event")
location = models.CharField(max_length=255, blank=True)
deleted = models.BooleanField(default=False)
def __str__(self):
return _('Event: {}').format(self.title)
delete_str = _("Deleted: ") if self.deleted else ""
return _('{}Event: {}').format(delete_str, self.title)
class TemplateQuestion(models.Model):
@@ -109,9 +113,11 @@ class SignupForm(models.Model):
visible = models.BooleanField(default=True)
quota = models.PositiveIntegerField(blank=True, null=True)
email_content = models.TextField(blank=True)
deleted = models.BooleanField(default=False)
def __str__(self):
return _('#{} {}').format(self.id, self.title)
delete_str = _("Deleted: ") if self.deleted else ""
return _('#{} {}{}').format(self.id, delete_str, self.title)
@property
def signups(self):
@@ -143,7 +149,8 @@ class Signup(models.Model):
deleted = models.BooleanField(default=False)
def __str__(self):
return f"{self.signupForm}: {self.list_name} ({self.pk})"
delete_str = _("Deleted: ") if self.deleted else ""
return f"{self.signupForm}: {delete_str}{self.list_name} ({self.pk})"
@receiver(post_save, sender=Signup)
@@ -185,6 +192,11 @@ class JobAd(models.Model):
created_at = models.DateTimeField(default=timezone.now)
autohide_at = models.DateTimeField(default=month_from_now)
autohide_enabled = models.BooleanField(default=False)
deleted = models.BooleanField(default=False)
def __str__(self):
delete_str = _("Deleted: ") if self.deleted else ""
return f'{delete_str}{self.title}'
auditlog.register(Tag)
+4 -2
View File
@@ -171,5 +171,7 @@ class EventTestCase(APITestCase):
# Authenticate
self.client.force_authenticate(user=self.authClient)
response = self.client.delete(f"{URL}{self.testEventId}/")
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
self.assertEqual(Event.objects.count(), 3)
# Soft delete
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(Event.objects.count(), 4)
self.assertEqual(Event.objects.get(id=self.testEventId).deleted, True)
+20 -3
View File
@@ -6,6 +6,8 @@ from webapp.models import Feed
from webapp.serializers import FeedSerializer
from webapp.tests.tag_fixture import tagBuilder
URL = "/api/feed/"
class FeedTestCase(APITestCase):
@@ -19,11 +21,13 @@ class FeedTestCase(APITestCase):
self.assertEqual(Feed.objects.count(), 1)
self.assertEqual(Feed.objects.all()[0].tags.count(), 2)
self.feedId = feed.id
username, password = "test_admin", "password123"
self.authClient = User.objects.create_superuser(username, "myemail@test.com", password)
def test_get_feed(self):
response = self.client.get("/api/feed/", format="json")
response = self.client.get(URL, format="json")
self.assertTrue(status.is_success(response.status_code))
feeds = Feed.objects.all()
@@ -47,15 +51,28 @@ class FeedTestCase(APITestCase):
"content_en": "lorem ipsum"
}
# Try post without authentication
response = self.client.post("/api/feed/", data, format="json")
response = self.client.post(URL, data, format="json")
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
self.assertEqual(Feed.objects.count(), 1)
# Authenticate
self.client.force_authenticate(user=self.authClient)
response = self.client.post("/api/feed/", data, format="json")
response = self.client.post(URL, data, format="json")
# Return success and check object was created
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Feed.objects.count(), 2)
created = Feed.objects.get(title_fi="testtitle")
self.assertEqual(created.tags.count(), 2)
def test_post_delete(self):
response = self.client.delete(f"{URL}{self.feedId}/",)
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
self.assertEqual(Feed.objects.count(), 1)
# Authenticate
self.client.force_authenticate(user=self.authClient)
response = self.client.delete(f"{URL}{self.feedId}/")
# Soft delete
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(Feed.objects.count(), 1)
self.assertEqual(Feed.objects.get(id=self.feedId).deleted, True)
+53 -16
View File
@@ -39,7 +39,7 @@ class RootView(routers.APIRootView):
class EventViewSet(ModelViewSet):
queryset = Event.objects.all()
queryset = Event.objects.filter(deleted=False)
ordering = ["start_time"]
serializer_class = EventSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
@@ -53,17 +53,17 @@ class EventViewSet(ModelViewSet):
if self.request.user.is_authenticated or \
self.request.method == 'POST' or \
self.request.method == 'PUT':
return Event.objects.all().prefetch_related(
Prefetch('signupForm', queryset=SignupForm.objects.all(), to_attr='filtered_signup_forms')
return Event.objects.filter(deleted=False).prefetch_related(
Prefetch('signupForm', queryset=SignupForm.objects.filter(deleted=False), to_attr='filtered_signup_forms')
)
since = self.request.query_params.get('since', None)
if since:
return Event.objects.filter(visible=True, end_time__gt=since).order_by('start_time').prefetch_related(
Prefetch('signupForm', queryset=SignupForm.objects.filter(visible=True), to_attr='filtered_signup_forms')
return Event.objects.filter(deleted=False, visible=True, end_time__gt=since).order_by('start_time').prefetch_related(
Prefetch('signupForm', queryset=SignupForm.objects.filter(deleted=False, visible=True), to_attr='filtered_signup_forms')
)
return Event.objects.filter(visible=True, end_time__gt=timezone.now()).order_by('start_time').prefetch_related(
Prefetch('signupForm', queryset=SignupForm.objects.filter(visible=True), to_attr='filtered_signup_forms')
return Event.objects.filter(deleted=False, visible=True, end_time__gt=timezone.now()).order_by('start_time').prefetch_related(
Prefetch('signupForm', queryset=SignupForm.objects.filter(deleted=False, visible=True), to_attr='filtered_signup_forms')
)
def create(self, request, *args, **kwargs):
@@ -84,9 +84,19 @@ class EventViewSet(ModelViewSet):
})
return super().update(request, *args, **kwargs)
def destroy(self, request, pk=None, *args, **kwargs):
try:
event = self.get_object()
event.deleted = True
event.save()
return JsonResponse(status=200, data={"message": "OK"})
except ObjectDoesNotExist:
return JsonResponse(status=404, data={"error": f"Event {pk} not found"})
class SignupFormViewSet(ModelViewSet):
queryset = SignupForm.objects.all()
queryset = SignupForm.objects.filter(deleted=False)
ordering = ["start_time"]
serializer_class = SignupFormSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
@@ -102,8 +112,17 @@ class SignupFormViewSet(ModelViewSet):
def get_queryset(self):
if self.request.user.is_authenticated:
return SignupForm.objects.all().order_by('start_time')
return SignupForm.objects.filter(visible=True, end_time__gt=timezone.now()).order_by('start_time')
return SignupForm.objects.filter(deleted=False).order_by('start_time')
return SignupForm.objects.filter(deleted=False, visible=True, end_time__gt=timezone.now()).order_by('start_time')
def destroy(self, request, pk=None, *args, **kwargs):
try:
form = self.get_object()
form.deleted = True
form.save()
return JsonResponse(status=200, data={"message": "OK"})
except ObjectDoesNotExist:
return JsonResponse(status=404, data={"error": f"SignupForm {pk} not found"})
@action(detail=True, methods=['post'], permission_classes=[IsAuthenticated])
def sendemail(self, request, pk=None, *args, **kwargs):
@@ -202,7 +221,7 @@ class SavedQuestionsViewSet(ModelViewSet):
class FeedViewSet(ModelViewSet):
queryset = Feed.objects.all()
queryset = Feed.objects.filter(deleted=False)
serializer_class = FeedSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
# filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter)
@@ -211,9 +230,9 @@ class FeedViewSet(ModelViewSet):
def get_queryset(self):
if self.request.user.is_authenticated:
return Feed.objects.all().order_by('publish_time')
return Feed.objects.filter(deleted=False).order_by('publish_time')
else:
objs = Feed.objects.filter(visible=True).order_by('publish_time')
objs = Feed.objects.filter(deleted=False, visible=True).order_by('publish_time')
# TODO: Bad filtering. Rewrite!
result_ids = []
@@ -226,6 +245,15 @@ class FeedViewSet(ModelViewSet):
return Feed.objects.filter(id__in=result_ids)
def destroy(self, request, pk=None, *args, **kwargs):
try:
post = self.get_object()
post.deleted = True
post.save()
return JsonResponse(status=200, data={"message": "OK"})
except ObjectDoesNotExist:
return JsonResponse(status=404, data={"error": f"Post {pk} not found"})
class TagsViewSet(ReadOnlyModelViewSet):
queryset = Tag.objects.all()
@@ -234,14 +262,23 @@ class TagsViewSet(ReadOnlyModelViewSet):
class JobAdViewSet(ModelViewSet):
queryset = JobAd.objects.all()
queryset = JobAd.objects.filter(deleted=False)
serializer_class = JobAdSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
def get_queryset(self):
if self.request.user.is_authenticated:
return JobAd.objects.all()
return JobAd.objects.filter(visible=True, autohide_at__gt=timezone.now())
return JobAd.objects.filter(deleted=False)
return JobAd.objects.filter(deleted=False, visible=True, autohide_at__gt=timezone.now())
def destroy(self, request, pk=None, *args, **kwargs):
try:
ad = self.get_object()
ad.deleted = True
ad.save()
return JsonResponse(status=200, data={"message": "OK"})
except ObjectDoesNotExist:
return JsonResponse(status=404, data={"error": f"Job Ad {pk} not found"})
@require_http_methods(["GET"])