Witam w dokumentacji watchdog-kj-kultura!

Cele

Serwis jest elementem projektu Mapa Kultury 2015 realizowanego przez Klub Jagieloński przy wsparciu Ministerstwa Kultury i Dziedzictwa Narodowego w ramach organizowanego przez Narodowe Centrum Kultury priorytetu “Obserwatorium Kultury”. Jego celem jest przedstawienie efektów badań nad budżetami i stanem zatrudnienia w finansowanych ze środków publicznych instytucji kultury.

Oprogramowanie aplikacji zostało zaprojektowane i zrealizowane przez Stowarzyszenie Sieć Obywatelska - Watchdog Polska

Serwis służyć ma:

  • możliwości prezentacji, zapoznania się z listą oraz wyszukiwania istniejących w Polsce publicznych instytucji i ośrodków kultury finansowanych z środków publicznych,
  • prezentacji zebranych w ramach projektu danych adresowych i kontaktowych do ok. 9000 instytucji kultury w Polsce
  • prezentacji danych dotyczących finansowania i zatrudnienia pozyskanych w ramach projektu dotąd od kilkuset podmiotów,
  • składaniu wniosków o informację publiczną i petycji za pomocą prostego generatora,
  • możliwości proponowania przez użytkowników (obywateli lub pracowników placówek) aktualnych lub brakujących danych,
  • prezentacji raportu analitycznego powstałego w oparciu o pozyskane z innych źródeł poprzez podstrona ze streszczeniem, raportem w wersji do pobrania, możliwością przejrzenia raportu on-line w technologii typu issuu.com,
  • prezentacji mapy wydatków na kulturę 2015 poprzez podstronę z opisem, możliwością podglądu mapy w przeglądarce oraz pobrania plików .pdf i pliku graficznego z mapą,
  • prezentacji mapy zatrudnienia w kulturze 2015 (j.w.).

Szata graficzna bazuje na dotychczasowym strony internetowej Klubu Jagielońskiego - kj.org.pl.

Architektura

Aplikacja została wykonana zaimplentowana w języku Python 3.5 z wsparciem frameworku Django 1.10. Została zaprojektowania do wykorzystania bazy danych PostgreSQL 9.5 z modułem PostGIS i silnika pełnotekstowej wyszukiwarki Elasticsearch 2.4.3

Zestawienie bibliotek Python wykorzystanych w projekcie:

# Wheel 0.25+ needed to install certain packages on CPython 3.5+
# like Pillow and psycopg2
# See http://bitly.com/wheel-building-fails-CPython-35
# Verified bug on Python 3.5.1
wheel==0.29.0

# Bleeding edge Django
django==1.10.5

# Configuration
django-environ==0.4.1

# Forms
django-braces==1.10.0
django-crispy-forms==1.6.1

# Templates
django-bootstrap-pagination==1.6.2

# Models
django-model-utils==2.6.1

# Admin
django-grappelli==2.9.1
geopy==1.11.0
django-import-export==0.5.1
django-tinymce==2.4.0

# Images
Pillow==4.0.0

# For user registration, either via email or social
# Well-built with regular release cycles!
django-allauth==0.30.0

# Search
elasticsearch==2.4.1 # pyup: <5.0.0
django-haystack==2.6.0
django-haystack-elasticsearch==0.1.0
django-haystack-panel==0.2.1

# Python-PostgreSQL Database Adapter
psycopg2==2.6.2

# Unicode slugification
awesome-slugify==1.6.5

# Time zones support
pytz==2016.10

# Redis support
django-redis==4.7.0
redis>=2.10.5

# Data source
django-teryt-tree==0.11.1
django-autofixture==0.12.1

# Pretty e-mail
djmail==1.0.0

# GeoMaps
django-leaflet==0.19.0
jsonfield==1.0.3
https://github.com/balazs-endresz/django-geojson/archive/a2b05b4c644e54a127a482c41d3617897c2a86cd.zip # See https://github.com/makinacorpus/django-geojson/issues/82 and https://github.com/makinacorpus/django-geojson/pull/81

# Utils
django-atom==0.12.7
python-dateutil==2.6.0

Ponadto podczas pracy deweloperskiej są wykorzystane następujące biblioteki:

# Local development dependencies go here
-r base.txt
-r test.txt
Sphinx==1.5.1
django-extensions==1.7.5
Werkzeug==0.11.15
django-test-plus==1.0.16
factory-boy==2.8.1

django-debug-toolbar==1.6

# improved REPL
ipdb==0.10.1

Panel administracyjny

Dostęp do panelu administracyjnego, na których odbywać się będzie zarządzanie wszystkimi zasobami portalu jest tylko możliwy po autoryzacji i wyłącznie dla konkretnych osób. Tworzenie kont administracyjnych jest możliwe wyłącznie z poziomu administracyjnego, to znaczy, że konto administracyjne może założyć osoba zalogowana do panelu. Oprogramowanie portalu zapewnia rejestrowaną i skuteczną kontrolę dostępu. Ilekroć mowa jest o karcie tworzenia i edycji to należy rozumieć tworzenie i edycję treści portalu na panelu administracyjnym, do którego dostęp mają wyłącznie autoryzowane osoby zarządzające portalem.

Instalacja

Niniejsza aplikacja przedstawia uruchomienie aplikacji w środowisku deweloperskim. Nie obejmuje wdrożenia, co zostało przedstawione w sekcji Wdrożenie .

W niniejszej procedurze zostaną zainstalowane następujące komponenty: - serwer baz danych - PostgreSQL 9.5 - serwer wyszukiwarki - Elasticsearch >= 2.4.3<5 - aplikacja

W niniejszej instrukcji został wykorzystany następujący Vagrantfile:

Vagrant.configure("2") do |config|
  config.vm.box = "bento/xenial64"
  config.vm.hostname = "myprecise.box"
  config.vm.network :private_network, ip: "192.123.0.97"
  config.vm.network "forwarded_port", guest: 2000, host: 8080
end

W pierwszej kolejności została uruchomie oficjalne repozytorium PostgreSQL zgodnie z właściwa dokumentacją oprogramowania :

$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt-get install update

Następnie dokonano instalacji poprawnych wersji oprogramowania:

$ sudo apt-get install postgresql-9.5-postgis-2.2 postgresql-9.5 postgresql-server-dev-9.5

Została zainstalowana odpowiednia środowiska Python:

$ sudo apt-get install python3.5-dev python3.5-dev python-pip virtualenv

Kod został pobrawny i wypakowany:

$ wget https://github.com/watchdogpolska/watchdog-kj-kultura/archive/master.tar.gz
$ tar xvzf master.tar.gz
$ cd watchdog-kj-kultura-master

Zostało skonfigurowane wirtualne środowisko i zostały zainstalowane zależności:

watchdog-kj-kultura-master$ virtualenv -p python3.5 env
watchdog-kj-kultura-master$ source env/bin/activate;
watchdog-kj-kultura-master$ pip install -r requirements/dev.txt;

Następnie została skonfigurowana baza danych odpowiednio:

$ sudo -u postgres psql -c "create user $USER;"
$ sudo -u postgres psql -c "create database watchdog_kj_kultura;"
$ sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE watchdog_kj_kultura to $USER;"
$ sudo -u postgres psql watchdog_kj_kultura -c "CREATE EXTENSION postgis;"
watchdog-kj-kultura-master$ python manage.py migrate

Następnie należy zainstalować silnik wyszukiwarki:

$ echo 'deb http://packages.elastic.co/elasticsearch/2.x/debian stable main' | sudo tee /etc/apt/sources.list.d/elasticsearch-2.x.list
$ sudo apt-get update
$ sudo apt-get install elasticsearch=2.4.3

Ostatecznie możliwe jest uruchomienie serwera WWW:

watchdog-kj-kultura-master$ python manage.py 0.0.0.0:2000

Jest on dostępny po wywołaniu localhost:8080 w przeglądarce.

Wdrożenie

Heroku

Jedną z akceptowalnych form wdrożenia jest wykorzystanie Heroku. Wymaga to kilku prostych kroków, które są szczegółowo przedstawione poniżej.

1. Utworzenie aplikacji

Po pierwsze należy utworzyć aplikacje i ustalić wartość podstawowych zmiennych:

$ heroku create app_name
$ heroku config:set DJANGO_SETTINGS_MODULE=config.settings.production
$ heroku config:set DJANGO_SECRET_KEY=$(random_pass)
$ heroku config:set DJANGO_ADMIN_URL=admin/
$ heroku config:set BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git

2. API plików statycznych

Następnie należy określić miejsce przechowywania plików statycznych (załączników itd.). Rekomenduje w tym zakresie wykorzystanie usługi e24files od e24cloud , co pozwala na efektywne cenowe przechowywanie danych w Polsce:

$ heroku config:set DJANGO_AWS_ACCESS_KEY_ID=**CUT**
$ heroku config:set AWS_S3_ENDPOINT_URL="https://e24files.com/""
$ heroku config:set AWS_S3_SIGNATURE_VERSION="s3"
$ heroku config:set AWS_S3_CUSTOM_DOMAIN="**CUT**.e24files.com"
$ heroku config:set DJANGO_AWS_SECRET_ACCESS_KEY=**CUT**
$ heroku config:set DJANGO_AWS_STORAGE_BUCKET_NAME=watchdog-kj-kultura

Możliwe jest także wykorzystanie zwyczajnego Amazon S3 z wykorzystaniem ustawień

$ heroku config:set DJANGO_AWS_ACCESS_KEY_ID=**CUT**
$ heroku config:set AWS_S3_CUSTOM_DOMAIN="**CUT**.s3.eu-central-1.amazonaws.com"
$ heroku config:set AWS_S3_ENDPOINT_URL=http://s3.amazonaws.com
$ heroku config:set AWS_S3_REGION_NAME=eu-central-1
$ heroku config:set AWS_S3_SIGNATURE_VERSION="s3v4"
$ heroku config:set DJANGO_AWS_SECRET_ACCESS_KEY=**CUT**
$ heroku config:set DJANGO_AWS_STORAGE_BUCKET_NAME=watchdog-kj-kultura

3. API wiadomości e-mail

W kolejnym kroku należy wskazać dane operatora wiadomości e-mail. Wstępnie aplikacja jest skonfigurowana do obsługi Mailgun, zważywszy na swoją popularność:

$ heroku config:set DJANGO_MAILGUN_API_KEY=key-xxxx
$ heroku config:set MAILGUN_SENDER_DOMAIN=sandboxxx.mailgun.org

4. API monitorowania wyjątków

Wymagane jest również, aby wskazać dane dostępowe DSN do instancji Sentry:

$ heroku config:set DJANGO_SENTRY_DSN=http://...:...@sentry.jawne.info.pl/16

5. Publikacja kodu

W tym miejscu dopiero warto umieścić kod źródłowy aplikacji na serwerze:

$ git push heroku master

6. Baza danych

Potem należy stworzyć bazę danych i wprowadzić schemat bazy danych:

$ heroku addons:create heroku-postgresql:hobby-dev
$ heroku run python manage.py migrate

7. Cache

Należy także aktywować cache:

$ heroku addons:create rediscloud:30

8. Adres WWW

Jeżeli uruchamisz apliacje pod adresem innym niż kultura.kj.org.pl konieczne jest także zaakceptowanie domeny:

$ heroku config:set DJANGO_ALLOWED_HOSTS="watchdog-kj-kultura.herokuapp.com"

9. Wyszukiwarka

Aby uruchomić wyszukiwarkę należy wywołać:

$ heroku addons:create searchbox:starter
$ heroku run python manage.py rebuild_index

10. Administrator aplikacji

Warto także utworzyć pierwszego użytkownika administracyjnego:

$ heroku run python manage.py createsuperuser

Planista

Niektóre komponenty powinny być uruchamiane cyklicznie niezależnie od interakcji użytkownika. W przypadku Heroku należy w takiej sytuacji wykorzystać:

$ heroku addons:create scheduler:standard

W systemach Unix można wykorzystać program cron odpowiednio. Pamiętać należy jednak o ustawieniu odpowiednich zmiennych środowiskowych.

Powiadomienia

W celu zapewnienia powiadomień z komponentu System zapytań do instytucji konieczne jest skonfigurowanie cyklicznego wywołania polecenia Polecenia zarządzania. Wystarczające winno być powiadomienie raz dziennie.

W Heroku wywołać:

$ heroku addons:open scheduler

W nowo otwartym oknie wprowadzić następujące ustawienia:

_images/heroku_scheduler.png

Wyszukiwarka

W celu zapewnienia sprawnego wyszukiwania konieczne jest skonfigurowanie cyklicznej aktualizacji indeksu wyszukiwarki. Wystarczające powinno być indeksowanie co godzinę.

W przypadku Heroku należy wykorzystać Planista z poleceniem python manage.py update_index --age=1 wywoływanym co godzinę. Patrz także na szczegółową instrukcje dla :ref:`Powiadomienia.

Dane testowe

W celu szybkiego rozruchu aplikacji możliwe jest wygenerowanie lub wczytanie pewnych danych początkowych. Szczegółowe instrukcje zostały przedstawione w modułach właściwych modułów.

Użytkownicy

Dla bazy możliwe jest w środowisku deweloperskim dynamicznie wygenerowanych danych na temat użytkowników:

$ python manage.py loadtestdata users.User:25

Warto także zwrócić uwagę na utworzenie konta administratora opisane w Wdrożenie.

Rozwój

W tym dokumencie opisujemy opis procesu rozwoju aplkacji. Ma on postać FAQ, aby utrzymywać dokument prostym.

Jak zgłosić usterkę?

Po prostu przejdź na https://github.com/watchdogpolska/watchdog-kj-kultura/issues i utworz zgłoszenie.

Jak diagnozować funkcjonowanie poczty elektronicznej?

W środowisku deweloperskim wiadomości e-mail są domyślnie wypisywane na konsole w oknie serwera WWW. Jeżeli chcesz zweryfikować np. formatowanie wiadomości zaleca się wykorzystanie maildump, który możliwy jest do zainstalowania i uruchomienia poprzez:

$ pip install maildump
$ maildump

Następnie należy ponownie uruchomić serwer WWW w następujący sposób EMAIL_URL=smtp://localhost:1025/ python manage.py runserver. Wiadomości będą dostępne przez interfejs WWW pod adresem http://localhost:1080.

Jak uruchomić automatyczne testy?

Do prawidłowego uruchomienia automatycznych testów bezwzględnie wymagane jest zainstalowanie wszystkich deweloperskich pakietów. Można to osiągnąc poprzez:

$ pip install -r requirements/dev.txt;

Następnie należy wywołać:

$ python manage.py test

Warto wyróznić kilka przełączników, które mogą zapewnić sprawniejsze wykorzystanie testów:

  • -v2 oznacza, że będą na bieżąco wypisywane nazwy wszystkich testów wraz z ich rezultatem,
  • --keepdb oznacza, że struktura bazy danych nie zostanie skasowana po wykonaniu testów, co pozwala oszczędzić jej tworzenie każdorazowo, co jednak uniemożliwi wykrycie testów np. w migracjach,
  • --parallel 4 oznacza, że testy będa wykonywane równolegle, a wcześniej zostaną utworzone 4 identyczne struktury bazy danych.

Ostrzeżenie

Warto zaznaczyć, że zrównoleglenie testów nie oznacza, że będą one wykonywane szybciej niż proces utworzenia dodatkowych baz danych może się wydłużyć o więcej niż sam proces wykonywania testów.

Jak wygenerować dokumentacje?

Do prawidłowego uruchomienia automatycznych testów bezwzględnie wymagane jest zainstalowanie wszystkich deweloperskich pakietów. Można to osiągnąc poprzez:

$ pip install -r requirements/dev.txt;

Nastepnie należy przejść do katalogu docs i wywołać:

$ make html

Warto zaznaczyć, że aktualna dokumentacja jest budowana automatycznie i publikowana na Read the Docs.

Jak analizować działanie Elasticsearch?

W celu analizowania poprawności komunikacji aplikacji z serwerem wyszukiwarki Elasticsearch zaleca się wykorzystanie opcji “Reverse proxy” narzędzia mitmproxy.

Należy przykładowo wywołać:

.. code-block:: bash

Następnie wykorzystać utworzony serwer proxy do połączenia:

.. code-block:: bash
$ SEARCH_URL=”elasticsearch://127.0.0.1:8080” python manage.py rebuild_index

Moduł podstawowy

Założenia

Moduł stanowi zbiór zróżnicowanych podstawowych komponentów. Zapewnia zarówno integracje dedykowanych komponentów z zewnętrznych, jak również bazę dla komponentów wbudowanych. Moduł zapewnia również możliwośc ustalenia ustawień dla stron działających z wykorzystaniem aplikacji.

Dostępna jest karta edycji ustawień, która określa ustawienia danej strony działającej z wykorzystaniem aplikacji.

Dla każdej nowego obiektu ustawień dostępne są obecnie pola:

  • Treść strony głównej - Duże pole tekstowe, które określa tekst powitalny występujący w nagłówku strony głównej.

Architektura

Model

class watchdog_kj_kultura.main.models.Settings(id, created, modified, site, home_content)[źródło]
Parametry:
  • id (AutoField) – Id
  • created (AutoCreatedField) – Utworzono
  • modified (AutoLastModifiedField) – Zmodyfikowane
  • site_id (OneToOneField to django.contrib.sites.models.Site) – Strona
  • home_content (HTMLField) – Treść strony głównej

Widoki

Panel administracyjny

class watchdog_kj_kultura.main.admin.SettingsAdmin(model, admin_site)[źródło]

Admin View for Settings

Procesorzy kontekstu

watchdog_kj_kultura.main.context_processors.settings(request)[źródło]

A context processor which provide current site Settings in settings template variable

Parametry:request (HttpRequest) – A django standard request object

Moduł podstron statycznych

Założenia

Ten moduł ma możliwość dodawania/edycje statycznych stron na portalu z poziomu panelu administracyjnego, a także wyświetlanie stron przez użytkownika. Wprowadzony mechanizm ma służyć prezentacji podstawowych informacji o projekcie, a także infografik i raportów.

Karta edycji podstron edycji zawiera nastepujące pola:

  • Nazwa - Krótkie pole tekstowe, które określa tytuł strony
  • Użytkownik - Pole wyboru, które określa użytkownika odpowiedzialnego za stronę.
  • Rodzic - Opcjonalne pole wyboru, które określa stronę nadrzędną do edytowanej np. na potrzeby breadcrumbs,
  • Treść - Duże pole tekstowe do wpisywania treści strony z edytorem WYSIWYG, a także obsługą mapy.
  • Publiczna widoczność - Pole jednokrotnego zaznaczenia, które stwarza możliwość tymczasowego ukrycia stron.

Mechanizm podstron statycznych zapewnia:

  • edycje wszystkich pól bazy ośrodka zgodnie z Karta tworzenia/edycji strony
  • przycisk usunięcia podstrony z bazy
  • możliwość tymczasowego ukrycia strony

Każdorazowo i automatycznie jest zapisywana data utworzenia i modyfikacja strony.

Dane testowe

Dla systemu stron statycznych możliwe jest w środowisku deweloperskim dynamicznie generowanych danych testowych. Wymagane jest wcześniejsze utworzenie użytkowników (zob. Użytkownicy ). Następnie należy wywołać:

$ python manage.py loadtestdata staticpages.Page:25

Architektura

Model

class watchdog_kj_kultura.staticpages.models.Attachment(id, created, modified, file)[źródło]
Parametry:
  • id (AutoField) – Id
  • created (AutoCreatedField) – Utworzono
  • modified (AutoLastModifiedField) – Zmodyfikowane
  • file (FileField) – Plik
class watchdog_kj_kultura.staticpages.models.Page(id, name, slug, user, parent, content, visible, created, modified)[źródło]
Parametry:
  • id (AutoField) – Id
  • name (CharField) – Nazwa
  • slug (AutoSlugField) – Identyfikator redakcyjny
  • user_id (ForeignKey to watchdog_kj_kultura.users.models.User) – User
  • parent_id (TreeForeignKey to watchdog_kj_kultura.staticpages.models.Page) – Rodzic
  • content (HTMLField) – Treść
  • visible (BooleanField) – Zaznacz, aby oznaczyć stronę jako widoczną publicznie
  • created (AutoCreatedField) – Utworzono
  • modified (AutoLastModifiedField) – Zmodyfikowane
  • lft (PositiveIntegerField) – Lft
  • rght (PositiveIntegerField) – Rght
  • tree_id (PositiveIntegerField) – Tree id
  • level (PositiveIntegerField) – Level

Znaczniki szablonów

watchdog_kj_kultura.staticpages.templatetags.staticpages_tags.render_page_with_shortcode(context, value, safe=False)[źródło]

The function to essential render text of static pages with shortcodes.

Replace occurences of [map]x[/map] to HTML code. Decorated with register.simple_tag.

Parametry:
  • context (dict) – context of template
  • value (a string to render) – A string to render
  • safe (bool, optional) – Treat input as safe
Zwraca:

Typ zwracany:

str – rendered

Widoki

Panel administracyjny

class watchdog_kj_kultura.staticpages.admin.AttachmentAdmin(model, admin_site)[źródło]

Admin View for Attachment

class watchdog_kj_kultura.staticpages.admin.PageAdmin(model, admin_site)[źródło]

Admin View for Page

Baza instytucji kultury

Założenia

Moduł stanowi bazę grupująca ośrodki kultury. Zapewnia możliwości prezentacji, zapoznania się z listą oraz wyszukiwania istniejących w Polsce publicznych instytucji i ośrodków kultury finansowanych z środków publicznych, jak również danych adresowych i kontaktowych do ok. 9000 instytucji kultury w Polsce, danych dotyczących finansowania i zatrudnienia pozyskanych w ramach projektu dotąd od kilkuset podmiotów.

Moduł stanowi także źródło danych dla System zapytań do instytucji.

Dostępne są karty edycji dla:

  • organizacji, która określa instytucje kultury, która będzie prezentowana na stronie,
  • metakategorii, która definiuje rodzaj metadanych na temat organizacji,
  • kategorii, która umożliwia ustalenie kategorii, którymi mogą być opisane organizacje.

Należy wyjaśnić, że dla każdej nowej metakategorii dostępne są pola:

  • Nazwa - Określenie nazwy pola z metadanymi
  • Klucz - Określenie unikalnego klucza, który będzie wykorzystywany podczas odwołania do tych metadanch w aplikacji z wykorzystaniem np. {{object.meta.KLUCZ}}
  • Użytkownik - Osoba odpowiedzialna za kryterium

Dla każdej organizacji wymagane są przez aplikacje następujące pola:

  • Nazwa - Określenie nazwy organizacji
  • E-mail - Określenie adresu e-mail instytucji, który będzie wykorzystywany m. in. w System zapytań do instytucji
  • Jednostka podziału terytorialnego - Określenie jednostki podziału terytorialnego wykorzystanej w nawigacji według Podział terytorialny
  • Użytkownik - Osoba odpowiedzialna za organizacje

Każdorazowo i automatycznie jest zapisywana data utworzenia i modyfikacja wpisu.

Dla każdej organizacji możliwe jest ustalenie metadanych. Wymaga to pierw wprowadzenia obiektu typu watchdog_kj_kultura.organizations.models.MetaCategory, a wówczas podczas edycji organizacji pojawi się dodatkowe pole odpowiadające wartości metadanych.

W celu wykorzystania danych zgromadzonych w polu metadanych należy dokonać edcji szablonów w kodzie źródłowym aplikacji poprzez zmiany w pliku /watchdog_kj_kultura/organizations/templates/organizations/organization_detail.html. Podczas edycji odwołać się do metadanej wykorzystaniem np. {{object.meta.KLUCZ}}. Możesz wykorzystać w tym celu język szablonów Django - The Django template language.

Dane testowe

Dla bazy instytucji kultury możliwe jest w środowisku deweloperskim dynamicznie generowanych danych testowych. Wymagane jest wcześniejsze utworzenie użytkowników (zob. Użytkownicy ) i podziału terytorialnego (zob. Dane testowe). Następnie należy wywołać:

$ python manage.py loadtestdata organizations.Category:5 organizations.Organization:100

Należy odnotować, że tak utworzone dane pozbawione są informacji na temat obiektów watchdog_kj_kultura.organizations.models.MetaCategory, a zatem także pola meta w watchdog_kj_kultura.organizations.models.Organization. Organizacje są także prawdopodobnie ukryte.

Akcje w panelu administracyjnym

W panelu administracyjnym bazy instytucji kultury są dostępne pewne szczególne operacje, które warto wyróżnić.

Geokodowanie

W przypadku watchdog_kj_kultura.organizations.models.MetaCategory możliwe jest automatyczne uzupełnienie pola pozycji współrzędnych geograficznych. Operacja ta wykorzystuje zewnętrzne usługi, których konfiguracja została przedstawiona w Ustawienia. Ilość usług zależy od konfiguracji aplikacji. Pomijane są instytucje, które mają wypełnione informacje o pozycji.

Szczegółowo proces automatycznego uzupełniania pola pozycji został przedstawiony w następującym materiale:

Import i eksport

Możliwe jest wyeksportowanie i importowanie m. in. watchdog_kj_kultura.organizations.models.Organization. Stanowi to realizacje wymaganego w dokumentacji modułu importowania danych związanego z bazą ośrodków.

Podczas procesu importu należy ściśle przestrzegać nazw kolumn wskazanych przez aplikacje. Zaleca się w celu przygotowanie importu wykorzystanie dowolnego pliku eksportu jako szablonu do którego zostaną przeniesione dane. Pozwala to także na dokonanie selekcji danych, które mają być zaktualizowane (wypełniona kolumna ID), a które mają być zaktualizowane, aby uniknąć powtórzeń instytucji.

Największą pewność poprawności wczytania danych i kompatybilność zapewnia format CSV.

Ustawienia

Niniejszy moduł wykorzystuje szereg ustawień Django (zob. Designating the settings), które zapewniają klucze API na potrzeby mechanizmu Geokodowanie. Wprowadzenie ich nie jest obowiązkowe. Nie wprowadzenie danego klucza oznacza, że dany usługodawca nie będzie dostępny.

Dostępne ustawienia to:

GEOCODE_BAIDU_API_KEY
Klucz API dla Baidu Maps v2 API. Dokumentacja API jest dostępna na stronie http://developer.baidu.com/map/webservice-geocoding.htm . Klucze API są zarządzane przez konsolę (http://lbsyun.baidu.com/apiconsole/key)
GEOCODE_BING_API_KEY
Klucz API dla Bing Maps Locations API. Dokumentacja API jest dostępna na https://msdn.microsoft.com/en-us/library/ff701715.aspx .
GEOCODE_GOOGLE_API_KEY
Klucz API dla Google Maps v3 API. Dokumentacja API jest dostępna na https://developers.google.com/maps/documentation/geocoding/ . Zarządzanie kluczami odbywa się przez konsolę ( https://code.google.com/apis/console ).
GEOCODE_YANDEX_API_KEY
Klucz API dla Yandex. Dokumentacja API jest dostępna na http://api.yandex.com/maps/doc/geocoder/desc/concepts/input_params.xml . Zarządzanie kluczami odbywa się przez konsolę http://api.yandex.ru/maps/form.xml .

Architektura

Model

class watchdog_kj_kultura.organizations.models.Category(id, created, modified, name, slug)[źródło]
Parametry:
  • id (AutoField) – Id
  • created (AutoCreatedField) – Utworzono
  • modified (AutoLastModifiedField) – Zmodyfikowane
  • name (CharField) – Nazwa
  • slug (AutoSlugField) – Identyfikator redakcyjny
class watchdog_kj_kultura.organizations.models.MetaCategory(id, created, modified, name, key, user)[źródło]
Parametry:
  • id (AutoField) – Id
  • created (AutoCreatedField) – Utworzono
  • modified (AutoLastModifiedField) – Zmodyfikowane
  • name (CharField) – Nazwa
  • key (CharField) – Dopuszczalne są tylko znaki alfabetu łacińskiego i liczby.
  • user_id (ForeignKey to watchdog_kj_kultura.users.models.User) – User
class watchdog_kj_kultura.organizations.models.Organization(id, created, modified, name, slug, email, jst, user, pos, category, visible, meta)[źródło]
Parametry:
  • id (AutoField) – Id
  • created (AutoCreatedField) – Utworzono
  • modified (AutoLastModifiedField) – Zmodyfikowane
  • name (CharField) – Nazwa
  • slug (AutoSlugField) – Identyfikator redakcyjny
  • email (EmailField) – E-mail
  • jst_id (ForeignKey to teryt_tree.models.JednostkaAdministracyjna) – Jednostka podziału terytorialnego
  • user_id (ForeignKey to watchdog_kj_kultura.users.models.User) – User
  • pos (PointField) – Pozycja
  • category_id (ForeignKey to watchdog_kj_kultura.organizations.models.Category) – Kategoria
  • visible (BooleanField) – Zaznacz, aby oznaczyć organizacje jako widoczną publicznie
  • meta (JSONField) – Metadane

Formularze

class watchdog_kj_kultura.organizations.forms.OrganizationAdminForm(data=None, files=None, auto_id=u'id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None)[źródło]

Organization management form for usage in watchdog_kj_kultura.organizations.admin.OrganizationAdmin

class watchdog_kj_kultura.organizations.forms.OrganizationFixForm(*args, **kwargs)[źródło]

Report changes suggestion form for usage with watchdog_kj_kultura.organizations.models.Organization` instances.

Parametry:
  • name – Nazwa
  • email – E-mail
  • jst – Jednostka podziału terytorialnego
  • pos – Pozycja
  • category – Kategoria
  • sources – Źródło informacji
  • worker – Pracuje w tej instytucji
get_recipients()[źródło]

Return emails of recipients of notifications.

Widoki

Panel administracyjny

class watchdog_kj_kultura.organizations.admin.CategoryAdmin(model, admin_site)[źródło]

Admin View for Category

class watchdog_kj_kultura.organizations.admin.GeocoderActionsMixin[źródło]

Mixins with actions to geocode organizations.

get_geocode_actions_list()[źródło]

Returns dict of geocoders to appends

class watchdog_kj_kultura.organizations.admin.MetaCategoryAdmin(model, admin_site)[źródło]

Admin View for MetaCategory

class watchdog_kj_kultura.organizations.admin.OrganizationAdmin(model, admin_site)[źródło]

Admin View for Organization

form

alias klasy OrganizationAdminForm

Akcje panelu administracyjnego

watchdog_kj_kultura.organizations.admin_actions.get_geocoder_for_service(service)[źródło]

For the service provided, try to return a geocoder instance.

Parametry:service (string) – name of service
Zwraca:
instance of geocoder initialized with
appropriate API key
Typ zwracany:geopy.geocoders.geocoders.base.Geocoder

System zapytań do instytucji

Założenia

Moduł zapewnia możliwość składania wniosków o informację publiczną i petycji za pomocą prostego generatora. Jak również zapewnia automatyczne przypomnienia o złożonych zapytaniach, które zostały wysłane z pomocą systemu. System został dostosowany także do samodzielnego określenia nowej kategorii pism i algorytmu powiadomień.

Moduł wykorzystuje dane pochodzące z Baza instytucji kultury w celu zidentyfikowania organizacji, które mogą być adresatami petycji.

Dane testowe

Dla systemu zapytań do instytucji możliwe jest w środowisku deweloperskim dynamicznie generowanych danych testowych. Wymagane jest wcześniejsze utworzenie użytkowników (zob. Użytkownicy ), podziału terytorialnego (zob. Dane testowe), a także organizacji (zob. Dane testowe ). Następnie należy wywołać:

$ python manage.py loadtestdata organizations_requests.Template:5 organizations_requests.Request:50

Należy odnotować, że brak jest możliwości wygenerowania automatycznych danych dla powiadomień. Należy w tym zakresie wykorzystać panel administracyjny.

Administracja

Polecenia zarządzania

Dostępne jest polecenie zarządzania Django, które odpowiada za mechanizm automatycznego powiadomienia o sprawach, które są dostępne. Aby zapewnić prawidłowe wysyłanie powiadomień konieczne jego cykliczne wywołanie. Zaleca się wywołanie nie rzadziej niż raz dziennie.

Użytkowanie zostało przedstawione poniżej:

usage: manage.py send_requests_notifications [-h] [--version] [-v {0,1,2,3}]
                                             [--settings SETTINGS]
                                             [--pythonpath PYTHONPATH]
                                             [--traceback] [--no-color]

Command to create and send notification to remind user about the request.

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  -v {0,1,2,3}, --verbosity {0,1,2,3}
                        Verbosity level; 0=minimal output, 1=normal output,
                        2=verbose output, 3=very verbose output
  --settings SETTINGS   The Python path to a settings module, e.g.
                        "myproject.settings.main". If this isn't provided, the
                        DJANGO_SETTINGS_MODULE environment variable will be
                        used.
  --pythonpath PYTHONPATH
                        A directory to add to the Python path, e.g.
                        "/home/djangoprojects/myproject".
  --traceback           Raise on CommandError exceptions
  --no-color            Don't colorize the command output.

Architektura

Model

class watchdog_kj_kultura.organizations_requests.models.Event(id, created, modified, notification, request)[źródło]
Parametry:
class watchdog_kj_kultura.organizations_requests.models.Notification(id, created, modified, template, delta, subject, body)[źródło]
Parametry:
  • id (AutoField) – Id
  • created (AutoCreatedField) – Utworzono
  • modified (AutoLastModifiedField) – Zmodyfikowane
  • template_id (ForeignKey to watchdog_kj_kultura.organizations_requests.models.Template) – Szablon
  • delta (RelativeDeltaField) – Napisz po angielsku okres czasu.
  • subject (CharField) – Wspierane są pewne znaczniki. Zapoznaj się z dokumentacją.
  • body (TextField) – Wspierane są pewne znaczniki. Zapoznaj się z dokumentacją.
class watchdog_kj_kultura.organizations_requests.models.Request(id, created, modified, organization, template, subject, email, email_user, body)[źródło]
Parametry:
  • id (AutoField) – Id
  • created (AutoCreatedField) – Utworzono
  • modified (AutoLastModifiedField) – Zmodyfikowane
  • organization_id (ForeignKey to watchdog_kj_kultura.organizations.models.Organization) – Organizacja
  • template_id (ForeignKey to watchdog_kj_kultura.organizations_requests.models.Template) – Użyty szablon
  • subject (CharField) – Tytuł
  • email (EmailField) – Adres organizacji
  • email_user (EmailField) – Adres e-mail jest niezbędny w celach bezpieczeństwa, a także do powiadomień o stanie zapytania.
  • body (TextField) – Treść zapytania
class watchdog_kj_kultura.organizations_requests.models.Template(id, created, modified, name, slug, subject, body, description, introduction, email_required, visible)[źródło]
Parametry:
  • id (AutoField) – Id
  • created (AutoCreatedField) – Utworzono
  • modified (AutoLastModifiedField) – Zmodyfikowane
  • name (CharField) – Nazwa
  • slug (AutoSlugField) – Identyfikator redakcyjny
  • subject (CharField) – Tytuł
  • body (TextField) – Treść
  • description (TextField) – Krótki opis potencjału użycia szablonu.
  • introduction (TextField) – Wprowadzenie
  • email_required (BooleanField) – Zaznacz, aby wymagać adresu w treści zapytania.
  • visible (BooleanField) – Zaznacz, aby oznaczyć szablon jako publicznie widoczny

Formularze

Widoki

Panel administracyjny

class watchdog_kj_kultura.organizations_requests.admin.EventInline(parent_model, admin_site)[źródło]

Stacked Inline View for Event

model

alias klasy Event

class watchdog_kj_kultura.organizations_requests.admin.NotificationInline(parent_model, admin_site)[źródło]

Stacked Inline View for Notification

model

alias klasy Notification

class watchdog_kj_kultura.organizations_requests.admin.RequestAdmin(model, admin_site)[źródło]

Admin View for Request

class watchdog_kj_kultura.organizations_requests.admin.TemplateAdmin(model, admin_site)[źródło]

Admin View for Request

Moduły ekranu zarządzania

Dostępne są moduły kompatybilne z Dashboard API.

class watchdog_kj_kultura.organizations_requests.dashboardmodules.RecentRequest(title=None, limit=10, include_list=None, exclude_list=None, **kwargs)[źródło]

Module that lists the recent requests

children

QuerySet – It contains list of watchdog_kj_kultura.organizations.models.Organization to shows for user

limit

int – Number of objects return

template

str – Template name to render of module in dasbhard

title

str – Title of module in dashboard

Podział terytorialny

Dane testowe

Dostępna jest rządowa baza danych podziału terytorialnego. Aby ją wczytać należy - zgodnie z dokumentacją biblioteki django-teryt-tree - wywołać:

wget "http://www.stat.gov.pl/broker/access/prefile/downloadPreFile.jspa?id=1110" -O TERC.xml.zip
unzip TERC.xml.zip
pip install lxml
python manage.py load_teryt TERC.xml
rm TERC.xml*

Moduł menu

Założenia

Moduł stanowi komponent strony internetowej w postaci menu nawigacyjnego. Zapewnia możliwości stworzenia i zarządzania dwupoziomowym menu. Elementy zamieszczone w menu mogą odwoływać się do zarówno do elementów serwisu, jak również zewnętrznych. Zapewniona jest podstawowa weryfikacja odnośników wewnętrznych.

Dane testowe

Dla modułu menu nie możliwe jest w środowisku deweloperskim dynamicznie wygenerowanie generowanych danych testowych.

Architektura

Model

class watchdog_kj_kultura.menu.models.Element(id, created, modified, name, url, parent, visible, position)[źródło]
Parametry:
  • id (AutoField) – Id
  • created (AutoCreatedField) – Utworzono
  • modified (AutoLastModifiedField) – Zmodyfikowane
  • name (CharField) – Nazwa
  • url (CharField) – Url
  • parent_id (ForeignKey to watchdog_kj_kultura.menu.models.Element) – Rodzic
  • visible (BooleanField) – Zaznacz, aby oznaczyć szablon jako publicznie widoczny
  • position (SmallIntegerField) – Pozycja

Panel administracyjny

class watchdog_kj_kultura.menu.admin.ElementAdmin(model, admin_site)[źródło]

Admin View for Element

class watchdog_kj_kultura.menu.admin.ElementInline(parent_model, admin_site)[źródło]

Tabular Inline View for Element

model

alias klasy Element

Procesorzy kontekstu

watchdog_kj_kultura.menu.context_processors.menu(request)[źródło]

A context processor which provide menu in menu template variable.

Parametry:request (HttpRequest) – A django standard request object

Example

Menu render is very simple and effective. For example:

{% if menu %}
<ul>
    {% for el in menu %}
    <li>
        <a href="{{el.url}}">{{el}}</a>
        {% if el.children_set %}
        <ul>
        {% for child in el.children_set %}
            <li><a href="{{child.url}}">{{child}}</a>
        {% endfor %}
        </ul>
        {% endif %}
    </li>
    {% endfor %}
</ul>
{% endif %}

Changes

0.1.0 (2016-12-25)

  • The first version presented