Verkkosovellus keskusteluryhmien listaamiseen ja niiden liittymislinkkien säilytykseen
Sovellus on toteutettu Helsingin Yliopiston kurssilla Aineopintojen harjoitustyö: Tietokantasovellus (tsoha)
Sovelluksen käyttötarkoitus: keskusteluryhmien sekä niiden liittymislinkkien ja ylläpitäjien listaaminen.
Ensisijaisesti kohdennettu telegram-ryhmille, mutta toteutettavissa myös muiden palveluiden keskusteluiden listaamiseen.
1:
Sovelluksen lähdekoodi ladataan omalle tietokoneelle lataamalla se GitHub-repositoriosta pakattuna yhdeksi arkistoksi, joka puretaan haluttuun hakemistoon.
Vaihtoehtoisesti lataamisen voi tehdä komennolla git clone https://github.com/RedFoxFinn/ChatList.git
haluamaasi hakemistoon.
2:
Sovelluksen riippuvuudet asennetaan käyttämällä python3:n paketinhallintaa, pip3:a komentorivillä.
Mikäli python3 ei ole tietokoneellasi asennettuna, täytyy se asentaa ennen tämän vaiheen suorittamista.
Luodaan ensin python3:n virtuaaliympäristö:
python3 -m venv venv
ja käynnistetään se:
source venv/bin/activate
Tämän virtuaalisen ympäristön voi sulkea komennolla
deactivate
Virtuaaliympäristön ollessa aktiivisena (esimerkiksi riippuvuuksien asennuksen aikana) alkaa komentorivillä komentokehoite (rivi, jolle komennot kirjoitetaan) merkinnällä (venv)
.
Riippuvuuksien asentaminen tapahtuu komennolla
pip3 install -r requirements.txt
Tämän komennon suorittamisessa voi mennä pieni hetki, kun paketinhallinta asentaa tarvittavat paketit ja pakettiversiot.
3:
Kun komento on suoritettu loppuun, määritetään sovelluksen ympäristömuuttujat uuteen tiedostoon, jonka nimeksi määritetään .env
(piste alkuun).
Tuohon tiedostoon kirjoitetaan ensimmäiselle riville DATABASE_URL=postgresql+psycopg2:///
, jonka perään ilman väliä tai muita merkkejä kirjoitetaan oma käyttäjätunnus (löytyy komentokehoitteen riviltä (venv)
jälkeen ja ennen @
-merkkiä)
Toiselle riville kirjoitetaan USER_REGISTRATION_CODE=
, jonka perään kirjoitetaan haluttu merkkijono. Tämä merkkijono vaaditaan sovellukseen rekisteröidyttäessä ja ensimmäisen rekisteröityjän tunnuksesta tulee automaattisesti ylläpitäjä sovellukseen erityisillä oikeuksilla (superuser).
Kolmannelle riville kirjoitetaan SECRET_KEY=
, jonka perään kirjoitetaan tai liitetään haluttu merkkijono. Tämä merkkijono toimii sovelluksen istuntotoimintojen avaimena ja ilman sitä, ei toiminto toimi lainkaan.
Neljännelle riville voi halutessaan syöttää vapaavalintaisen nimen, joka tulee sovelluksen käyttöliittymässä näytettäväksi nimeksi. Tämä on hyvä keino yksilöidä sovellus tietylle käyttäjäryhmälle, kuten harrasteporukalle. Kirjoita tällöin CUSTOM_APP_NAME=
ja haluamasi nimi sovellukselle. Mikäli merkkijono on tyhjä tai se puuttuu, tulee sovelluksen nimeksi oletusarvoinen ChatList
.
Viimeisenä .env
-tiedostoon lisätään salasanan nollaustoimintoa varten rivi PW_RESET_PLACEHOLDER_VALUE=
, jonka perään kirjoitetaan omavalintainen merkkijono. Tämä arvo syötetään käyttäjän salatun salasanan tilalle, jos käyttäjä on pyytänyt pääkäyttäjää nollaamaan salasanansa.
Kirjautuessaan uusiksi sovellukseen käyttäjä syöttää salasanakenttään merkkijonoksi RESET_MY_PASSWORD
, jolloin hänet ohjataan uuden salasanan luontiin.
4:
Lopuksi ennen käynnistämistä virtuaaliympäristössä määritetään vielä sovelluksen tietokannan rakenne ja tarvittavat taulut komennolla
psql < schema.sql
5:
Nyt kaikki on valmista ja sovellus voidaan käynnistää komennolla
flask run
Sovellus toimii nyt tietokoneella, oletuksena verkkoselaimen osoitteessa http://localhost:5000/
Kun sovellus otetaan käyttöön ja sillä ei ole vielä määritettyjä käyttäjiä, ohjautuu se ensimmäiseksi osoitteeseen http://localhost:5000/init_site
.
Klikkaamalla painiketta 'Aloita määritys' sovellus ohjautuu käyttäjä rekisteröitymissivulle http://localhost:5000/register
.
Ensimmäisenä rekisteröityvästä käyttäjästä tulee automaattisesti pääkäyttäjä (Admin), jolla on lisäksi superuser-status. Tämä status vaaditaan mm. ylläpitäjien muokkaukseen ja muokkauspyyntöjen hyväksyntään.
Rekisteröitymisen jälkeen näytetään viesti rekisteröitymisen onnistumisesta ja käyttäjä ohjataan kirjautumissivulle http://localhost:5000/login
.
Kirjautumisen onnistumisesta näytetään käyttäjälle viesti ja hänet ohjataan etusivulle.
Pääkäyttäjille sovelluksessa on mahdollisuus käyttää hallintatyökaluja, joihin kuuluvat ryhmien (toimialueen kaltainen ominaisuus), keskusteluryhmien ja ylläpitäjien hallinta.
Ryhmien hallinnassa pääkäyttäjät voivat luoda uusia ryhmiä tai siirtyä muokkaamaan olemassaolevan ryhmän ominaisuuksia (nimi, rajoitustaso).
Keskusteluryhmien hallinnassa käyttäjä pystyy lisäämään keskusteluryhmiä. Lisääjästä tulee automaattisesti moderaattori keskustelulle.
Keskusteluryhmien listaus näytetään myös näkymässä, mutta etusivusta poiketen laajemmilla tiedoilla ja mahdollisuudella siirtyä keskusteluryhmän tietojen muokkaukseen. Keskusteluryhmää voi muokata ainoastaan sille moderaattoriksi merkitty käyttäjä tai pääkäyttäjä(t).
Sovelluksessa on myös kaikille näkyvä osio, statistiikka. Se nimensä mukaisesti esittää tilastotietoja sovelluksesta.
Kaikille eivät samat tiedot näy, esimerkiksi kirjautumattomille näytetään vain keskusteluryhmien kokonaismäärä ja aiheiden kokonaismäärä.
Sovelluksessa on lisäksi näkymä salasanan vaihtamiseen.
Sovellus käyttää PostgreSQL-tietokantaa tiedon pysyväissäilytykseen.
Tietokannassa käytettävät taulut
sovelluksen käyttäjät sisältävä tietokantataulu
- id SERIAL PRIMARY KEY
- uname TEXT NOT NULL UNIQUE, käyttäjänimi
- pw_hash TEXT, käyttäjän salasana (kryptattuna),
- dm_link TEXT NOT NULL UNIQUE, linkki käyttäjän yksityisviestikeskusteluun
sovelluksen ylläpitäjät sisältävä tietokantataulu
pitää listaa sovelluksen käyttäjistä, joilla on ylläpitäjän oikeudet
- id SERIAL PRIMARY KEY
- user_id INTEGER NOT NULL REFERENCES Users (id)
sovelluksen ryhmät sisältävä tietokantataulu
ryhmällä tarkoitetaan joukkoa keskusteluryhmiä, joilla on yhteisiä ominaisuuksia
- id SERIAL PRIMARY KEY
- gname TEXT NOT NULL UNIQUE, ryhmän nimi
- restriction TEXT NOT NULL DEFAULT "NONE"
- "NONE" osoittaa kyseisen ryhmän olevan julkisesti näytettävä
- "LOGIN" osoittaa kyseisen ryhmän olevan kirjautumisen jälkeen näytettävä
- "AGE" osoittaa kyseisen ryhmän olevan ikärajallinen, tällöin sen linkki näytetään vain ylläpitäjille
- "SEC" osoittaa kyseisen ryhmän olevan rajoitettu, tällöin se näytetään listassa vain ylläpitäjille
- admin_id INTEGER NOT NULL REFERENCES Admins (id), kyseisen ryhmän merkitty ylläpitäjä
sovelluksen keskusteluryhmien aiheet sisältävä tietokantataulu
- id SERIAL PRIMARY KEY
- topic TEXT NOT NULL UNIQUE
sovelluksen keskusteluryhmät sisältävä tietokantataulu
- id SERIAL PRIMARY KEY
- cname TEXT NOT NULL
- topic_id INTEGER REFERENCES Topics (id)
- group_id INTEGER REFERENCES Groups (id)
- link TEXT NOT NULL
- moderator_id INTEGER REFERENCES Users (id), viittaukset käyttäjiin
sovelluksen lokien säilytykseen osoitettu tietokantataulu (toiminnallisuus rakenteilla)
- id SERIAL PRIMARY KEY
- action TEXT NOT NULL, tapahtuman kuvaus
- user_id INTEGER NOT NULL REFERENCES Users (id), tapahtuman suorittaneen käyttäjän id
- action_time TIMESTAMP NOT NULL, tapahtuman aikaleima
Sovelluksen toiminta on suhteellisen yksinkertainen ulkopuolisesti, mutta pinnan alla varsin monimutkainen.
Front endin eli käyttäjälle näkyvän osan toiminnot voidaan listata seuraavasti:
- listausnäkymä
- julkinen versio
- kirjautumista vaativa versio
- kirjautumisrajoitetut keskustelut (näytetään listauksessa kirjautuneille)
- ikärajoitetut keskustelut (näytetään listauksessa kirjautuneille, linkki näytetään ylläpitäjille)
- rajoitetut keskustelut (näytetään listauksessa vain ylläpitäjille)
- kirjautumisnäkymä
- hallintanäkymä
- keskusteluryhmän lisäys
- keskusteluryhmän linkin päivittäminen (moderaattori/admin)
- keskusteluryhmän nimen päivittäminen (moderaattori/admin)
- keskusteluryhmän ryhmän vaihtaminen (moderaattori/admin)
- keskusteluryhmän poistaminen (moderaattori/admin)
- ryhmän lisääminen (admin)
- ryhmän poistaminen (admin)
- ylläpitäjästatuksien muuttaminen (admin)
- sovelluksen tilastotiedot
- salasanan vaihtamisen näkymä
Listausnäkymässä esitetään listamuodossa sovellukseen talletettuja keskusteluryhmiä ja niiden tietoja.
Listauksen esittämisessä käytetään rajoitustasoja, jotka vaikuttavat näytettävän tiedon määrään ja tarkkuuteen.
Listauksessa korostetaan mahdollista keskusteluryhmän rajoitustasoa kirjautuneiden listausnäkymässä.
Ei rajoituksia, tiedot esitetään julkisena.
Nimensä mukaisesti tason rajoitus perustuu käyttäjän kirjautumiseen ja ilman kirjautumista tämän tason rajoituksella merkittyä keskustelua ei esitetä listassa.
Rajoitustason tiedot esitetään kirjautuneelle käyttäjälle, mutta keskusteluryhmän linkkiä ei esitetä ilman ylläpitäjä-statusta.
Rajoitustason tiedot eivät tavalliselle käyttäjälle näy kirjautuneenakaan. Ylläpitäjille tiedot näkyvät listauksessa.
Sovelluksella on kirjautumisnäkymä, jossa käyttäjä syöttää tunnuksensa ja salasanansa päästäkseen käyttämään rajoitetumpaa versiota palvelusta.
Kirjautumistiedoista salasanan vaihtaminen on olennainen toiminnallisuus ja se on toteutettuna sovelluksessa.
Uuden salasanan asettamisen näkymä salasanan nollauksen jälkeisen kirjautumisen yhteydessä esitettäväksi.
Näkymästä käsin voidaan lisätä, päivittää ja poistaa keskusteluryhmiä, lisätä ja poistaa ryhmiä sekä muuttaa ylläpitäjästatuksia.
Näkymässä esitetään kirjautuneille tilastotietoa sovelluksesta. Tietojen määrä ja tarkkuus riippuu osittain käyttäjän statuksesta l. onko tämä käyttäjä vai pääkäyttäjä.
Sovelluksen lähdekoodissa on käytetty pythonin versiota 3 ja se ei siten ole yhteensopiva pythonin versioiden 1 ja 2 kanssa. Suosittelemme käyttämään viimeisintä versiota ja pitämään päivitykset ajantasaisina.
Sovelluksen lähdekoodissa on lisäksi käytetty kirjastoja, joilla on toteutettu mm. sovelluksen palvelintoiminnallisuudet.
Käytetyt kirjastot
Ympäristömuuttujat
- python-dotenv
Palvelintoiminnot
- flask
Tietokantatoiminnot
- flask-sqlalchemy
- sqlalchemy
- psycopg2
Tietoturva
- Werkzeug (salasanojen kryptaus/dekryptaus)
Verkkosivut
- jinja2