diff --git a/.env.dev b/.env.dev index a7b70f0..92c89ca 100644 --- a/.env.dev +++ b/.env.dev @@ -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= diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6956703..462a221 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -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 diff --git a/kaehmy/templates/kaehmy.html b/kaehmy/templates/kaehmy.html index 947bc6d..ac6d697 100644 --- a/kaehmy/templates/kaehmy.html +++ b/kaehmy/templates/kaehmy.html @@ -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 kaehmyopasta + Jos sinulla on kysyttävää mistä tahansa virasta, kannattaa konsultoida kaehmyopasta tai olla yhteydessä kyseistä virkaa tänä vuonna toimittavaan henkilöön.{% endblocktrans %}

diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index 9fd5df8..6ccda0d 100644 Binary files a/locale/en/LC_MESSAGES/django.mo and b/locale/en/LC_MESSAGES/django.mo differ diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index aa7d329..73d3ea9 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: 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 kaehmyopasta\n" +"konsultoida kaehmyopasta\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 "" diff --git a/locale/fi/LC_MESSAGES/django.mo b/locale/fi/LC_MESSAGES/django.mo index cb5b255..219335d 100644 Binary files a/locale/fi/LC_MESSAGES/django.mo and b/locale/fi/LC_MESSAGES/django.mo differ diff --git a/locale/fi/LC_MESSAGES/django.po b/locale/fi/LC_MESSAGES/django.po index 9e1468a..9a184d2 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: 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 kaehmyopasta\n" +"konsultoida kaehmyopasta\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 kaehmyopasta \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" diff --git a/sikweb/settings.py b/sikweb/settings.py index e3e1778..a845434 100644 --- a/sikweb/settings.py +++ b/sikweb/settings.py @@ -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 = ["*"] diff --git a/stack-compose-dev.yml b/stack-compose-dev.yml index d178e5c..b02e055 100644 --- a/stack-compose-dev.yml +++ b/stack-compose-dev.yml @@ -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 diff --git a/stack-compose.yml b/stack-compose.yml index 595eda2..ca2e14b 100644 --- a/stack-compose.yml +++ b/stack-compose.yml @@ -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 diff --git a/webapp/migrations/0075_auto_20210114_2155.py b/webapp/migrations/0075_auto_20210114_2155.py new file mode 100644 index 0000000..ce68abd --- /dev/null +++ b/webapp/migrations/0075_auto_20210114_2155.py @@ -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), + ), + ] diff --git a/webapp/models.py b/webapp/models.py index 36be46f..e856e23 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -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) diff --git a/webapp/tests/test_event.py b/webapp/tests/test_event.py index d00cb98..f3b4f9d 100644 --- a/webapp/tests/test_event.py +++ b/webapp/tests/test_event.py @@ -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) diff --git a/webapp/tests/test_feed.py b/webapp/tests/test_feed.py index c329e22..82490ca 100644 --- a/webapp/tests/test_feed.py +++ b/webapp/tests/test_feed.py @@ -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) diff --git a/webapp/views.py b/webapp/views.py index 52cfda7..b98920b 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -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"])