Skip to content

Commit db4814c

Browse files
committed
package as reusable app
1 parent 4b65c9d commit db4814c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+378
-51
lines changed

.env

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
SCHEME_EXTERNAL=http
2-
HOST_EXTERNAL=172.20.0.1
2+
#HOST_EXTERNAL=172.20.0.1
3+
HOST_EXTERNAL=localhost
34
POSTGRES_PORT_EXTERNAL=5435
45
WEBAPP_PORT_EXTERNAL=9889
56
POSTGRES_SERVER_EXTERNAL=${HOST_EXTERNAL}:${POSTGRES_PORT_EXTERNAL}

MANIFEST.in

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
include LICENSE
2+
include README.md
3+
recursive-include djakart/static *
4+
recursive-include djakart/templates *
5+
recursive-include djakart/migrations *
6+
recursive-include djakart/static *
7+
recursive-include doc *
8+
recursive-exclude build_qgis *
9+
recursive-exclude build_webapp *
10+
recursive-exclude data *
11+
recursive-exclude djakart_admin *
12+
recursive-exclude djakart_admin *
13+
recursive-exclude main_app *
14+
include djakart/admin.py
15+
include djakart/aggiorna_privilegi_pg.py
16+
include djakart/apps.py
17+
include djakart/importa_template.py
18+
include djakart/kart_api.py
19+
include djakart/__init__.py
20+
include djakart/prototipo.gpkg
21+
include djakart/QGS_project_macro.py
22+
include djakart/models.py
23+
include djakart/tests.py
24+
include djakart/urls.py
25+
include djakart/views.py

dist/djakart-0.1-py3-none-any.whl

59.7 KB
Binary file not shown.

dist/djakart-0.1.tar.gz

3.92 MB
Binary file not shown.

djakart.egg-info/PKG-INFO

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
Metadata-Version: 2.2
2+
Name: djakart
3+
Version: 0.1
4+
Summary: A django wrapper to kart geospatial versioning tool
5+
Author-email: Enrico Ferreguti <[email protected]>
6+
Project-URL: Homepage, https://github.com/enricofer/djakart
7+
Classifier: Environment :: Web Environment
8+
Classifier: Framework :: Django
9+
Classifier: Framework :: Django :: 4.0
10+
Classifier: Intended Audience :: Developers
11+
Classifier: License :: OSI Approved :: GPL2 License
12+
Classifier: Operating System :: OS Independent
13+
Classifier: Programming Language :: Python
14+
Classifier: Programming Language :: Python :: 3
15+
Classifier: Programming Language :: Python :: 3 :: Only
16+
Classifier: Programming Language :: Python :: 3.8
17+
Classifier: Programming Language :: Python :: 3.9
18+
Classifier: Programming Language :: Python :: 3.10
19+
Classifier: Topic :: Internet :: WWW/HTTP
20+
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
21+
Requires-Python: >=3.8
22+
Description-Content-Type: text/markdown
23+
License-File: LICENSE
24+
Requires-Dist: django>=4.0
25+
Requires-Dist: asgiref
26+
Requires-Dist: certifi
27+
Requires-Dist: charset-normalizer
28+
Requires-Dist: django-object-actions
29+
Requires-Dist: GDAL>=3.4.3
30+
Requires-Dist: idna
31+
Requires-Dist: numpy
32+
Requires-Dist: psycopg2-binary
33+
Requires-Dist: requests
34+
Requires-Dist: sqlparse
35+
Requires-Dist: urllib3
36+
37+
# Djakart
38+
39+
A django app for multiuser [kart versioning](https://kartproject.org/) in QGIS
40+
41+
## Deployment
42+
43+
1. clone the repository and enter djakart folder
44+
45+
```
46+
$ git clone [email protected]:enricofer/djakart.git
47+
$ cd djakart
48+
```
49+
50+
2. build the images
51+
52+
```
53+
$ docker build -t enricofer/qgis-server:latest ./build_qgis
54+
$ docker build --build-context webapp_root=./webapp -t enricofer/djakart:latest ./build_webapp
55+
```
56+
57+
3. start the containers
58+
59+
```
60+
$ docker compose up -d
61+
```
62+
63+
3. collect necessary static files
64+
65+
```
66+
$ docker compose exec webapp_djakart /usr/bin/python3 manage.py collectstatic --no-input
67+
```
68+
69+
4. create the superuser
70+
71+
```
72+
$ docker compose exec webapp_djakart /usr/bin/python3 manage.py createsuperuser --no-input
73+
```
74+
75+
5. for custom deployment .env environment file should be edited
76+
77+
6. login to [http://localhost:9889/admin](http://localhost:9889/admin)
78+
79+
```
80+
login: djakart-admin
81+
password: letmein
82+
```
83+
84+
![](doc/screenshot01.png)
85+
86+
Now you you can create a new Kart repository adding a new version
87+
88+
![](doc/screenshot02.png)
89+
90+
7. A sample dataset can be downloaded and installed overwriting data folder to quickly test the application (stop docker containers before install)
91+
92+
```
93+
$ docker compose down
94+
$ wget https://github.com/enricofer/djakart/releases/download/0.2/test_data02.tar.gz
95+
$ sudo tar --same-owner -xvf test_data01.tar.gz data/
96+
$ docker compose up -d
97+
```
98+
99+
Now you should have 4 new test repositories:
100+
101+
![](doc/screenshot03.png)
102+
103+
- REPO_TEST is the base kart repository
104+
- ADD_TWO AND ADD_THREE are edited clone branches of REPO_TEST
105+
- ADD_FOUR is an edited clone of ADD_THREE repository
106+
107+
the repositories are store in data/kart_versions folder:
108+
109+
```
110+
$ ll data/kart_versions
111+
drwxrwxr-x 6 enrico enrico 4096 giu 24 20:47 ./
112+
drwxrwxr-x 7 root enrico 4096 giu 24 18:37 ../
113+
drwxr-xr-x 3 root root 4096 giu 24 20:11 ADD_FOUR/
114+
-rw-r--r-- 1 root root 2599 giu 24 20:47 ADD_FOUR.json
115+
-rw-r--r-- 1 root root 124315 giu 24 20:47 ADD_FOUR.qgs
116+
drwxr-xr-x 3 root root 4096 giu 24 20:04 ADD_THREE/
117+
-rw-r--r-- 1 root root 2157 giu 24 20:11 ADD_THREE.json
118+
-rw-r--r-- 1 root root 124322 giu 24 20:05 ADD_THREE.qgs
119+
drwxr-xr-x 3 root root 4096 giu 24 19:21 ADD_TWO/
120+
-rw-r--r-- 1 root root 2051 giu 24 20:02 ADD_TWO.json
121+
-rw-r--r-- 1 root root 124308 giu 24 19:50 ADD_TWO.qgs
122+
drwxr-xr-x 3 root root 4096 giu 24 18:43 REPO_TEST/
123+
-rw-r--r-- 1 root root 1604 giu 24 19:50 REPO_TEST.json
124+
-rw-r--r-- 1 root root 115007 giu 24 19:50 REPO_TEST_pub.qgs
125+
```
126+
127+
Each kart version has a control form where can be configured custom features and user permissions (based on django user model), can be performed repository operation such commits, merge, etc.., and can be visually tracked edits on map ad on commit log
128+
129+
![](doc/screenshot04.png)
130+
131+
In the Version form can be downloaded a custom QGIS project preloaded with internal postgis kart working copy of the repository.
132+
133+
The default connection to postgis kart working copy are performed as `kart-user` a simple predefined user allowed only to read data fron db. To allow edits QGIS macros have to be allowed (project macros can be always allowed in Settings/options/General/Enable macros slot) When macros are allowed a credential form appears and can be inserted the read and write default user (from .env file):
134+
135+
```
136+
login: kart-admin
137+
password: ch1appalaCH!APPAL4
138+
```
139+
140+
![](doc/screenshot05.png)
141+
142+
All edits will be visible in djakart application as a custom kart diff window clicking on log items
143+
144+
![](doc/screenshot06.png)
145+
146+
now to fully test the application:
147+
148+
- commit the pending edits on the version "ADD_TWO"
149+
150+
![](doc/screenshot07.png)
151+
152+
- merge the version "ADD_TWO" on "REPO_TEST"
153+
154+
- merge the version "ADD_FOUR" on "ADD_THREE"
155+
156+
- and now merge the version "ADD_THREE" on "REPO_TEST"
157+
158+
at this point the last merge results conflicting with the main repo and the conflicts have to be reconciled with "RECONCILE CONFLICTS"action
159+
160+
![](doc/screenshot08.png)
161+
162+
for each conflict you have now to choice the winning edit from ours and theirs concurrent merging versions
163+
164+
![](doc/screenshot09.png)

djakart.egg-info/SOURCES.txt

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
LICENSE
2+
MANIFEST.in
3+
README.md
4+
pyproject.toml
5+
djakart/QGS_project_macro.py
6+
djakart/__init__.py
7+
djakart/admin.py
8+
djakart/aggiorna_privilegi_pg.py
9+
djakart/apps.py
10+
djakart/importa_template.py
11+
djakart/kart_api.py
12+
djakart/models.py
13+
djakart/prototipo.gpkg
14+
djakart/tests.py
15+
djakart/urls.py
16+
djakart/views.py
17+
djakart.egg-info/PKG-INFO
18+
djakart.egg-info/SOURCES.txt
19+
djakart.egg-info/dependency_links.txt
20+
djakart.egg-info/requires.txt
21+
djakart.egg-info/top_level.txt
22+
djakart/migrations/0001_initial.py
23+
djakart/migrations/0002_basemap.py
24+
djakart/migrations/0003_basemap_depth_basemap_srid.py
25+
djakart/migrations/0004_alter_modelli_options_version_extent_and_more.py
26+
djakart/migrations/0005_version_crs_alter_basemap_request_params_and_more.py
27+
djakart/migrations/0006_version_reserved_ids_alter_version_crs_and_more.py
28+
djakart/migrations/__init__.py
29+
djakart/static/favicon.ico
30+
djakart/static/djakart/generate_diff.js
31+
djakart/static/djakart/versioni_finestramappa.css
32+
djakart/static/djakart/versioni_finestramappa.js
33+
djakart/templates/diff-view.html
34+
djakart/templates/log.html
35+
djakart/templates/tutte_le_versioni.js
36+
djakart/templates/admin/action_confirmation.html
37+
djakart/templates/admin/action_file.html
38+
djakart/templates/admin/action_parameter.html
39+
djakart/templates/admin/resolve_conflicts.html
40+
djakart/templates/admin/djakart/change_form.html
41+
doc/screenshot01.png
42+
doc/screenshot02.png
43+
doc/screenshot03.png
44+
doc/screenshot04.png
45+
doc/screenshot05.png
46+
doc/screenshot06.png
47+
doc/screenshot07.png
48+
doc/screenshot08.png
49+
doc/screenshot09.png

djakart.egg-info/dependency_links.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

djakart.egg-info/requires.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
django>=4.0
2+
asgiref
3+
certifi
4+
charset-normalizer
5+
django-object-actions
6+
GDAL>=3.4.3
7+
idna
8+
numpy
9+
psycopg2-binary
10+
requests
11+
sqlparse
12+
urllib3

djakart.egg-info/top_level.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
djakart
File renamed without changes.
File renamed without changes.

webapp/djakart/admin.py renamed to djakart/admin.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,8 @@
3636
pull_versione,
3737
kart_cmd
3838
)
39-
#SRID = os.environ.get("REPO_CRS")
40-
#SRID_CODE = SRID.split(":")[1]
4139

42-
SITE_SUBPATH = os.environ.get("SITE_SUBPATH","")
40+
SITE_SUBPATH = settings.DJAKART_SITE_SUBPATH
4341

4442
class importForm(forms.Form):
4543
nuovo_dataset = forms.FileField()
@@ -184,7 +182,7 @@ def wrapper(modeladmin, request, obj, **kwargs):
184182
"conflicts": json.dumps(conflicts),
185183
"crs": obj.crs,
186184
"crscode": obj.crs.split(":")[-1],
187-
"root_wms":os.environ.get("QGIS_SERVER_EXTERNAL","qgis_server_external") + '?MAP=/kart_versions/',
185+
"root_wms":settings.DJAKART_QGIS_SERVER_EXTERNAL + '?MAP=/kart_versions/',
188186
"base_name":obj.nome,
189187
"version_name":version_name,
190188
"version_id": obj.pk,
File renamed without changes.
File renamed without changes.
File renamed without changes.

webapp/djakart/kart_api.py renamed to djakart/kart_api.py

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,36 @@
1111
import sys
1212
import psycopg2
1313

14-
KART_EXE = "/opt/kart/kart_cli"
14+
KART_EXE = settings.DJAKART_KART_EXE
1515

16-
PG_SU = os.environ.get("POSTGRES_USER", "blabla")
17-
PG_PWD = os.environ.get("POSTGRES_PASSWORD", "blabla")
16+
PG_HOST = settings.DJAKART_POSTGRES_SERVER
17+
PG_PORT = settings.DJAKART_POSTGRES_PORT
18+
PG_DB = settings.DJAKART_VERSION_DB
19+
PG_SU = settings.DJAKART_POSTGRES_USER
20+
PG_PWD = settings.DJAKART_POSTGRES_PASSWORD
1821

19-
KART_SU = os.environ.get("VERSION_ADMIN", "blabla")
20-
KART_SU_PWD = os.environ.get("VERSION_ADMIN_PASSWORD", "blabla")
22+
KART_SU = settings.DJAKART_VERSION_ADMIN
23+
KART_SU_PWD = settings.DJAKART_VERSION_ADMIN_PASSWORD
2124

22-
KART_PGUSER = os.environ.get("VERSION_VIEWER", "blabla")
23-
KART_PGUSER_PWD = os.environ.get("VERSION_VIEWER_PASSWORD", "blabla")
25+
KART_PGUSER = settings.DJAKART_VERSION_VIEWER
26+
KART_PGUSER_PWD = settings.DJAKART_VERSION_VIEWER_PASSWORD
2427

25-
SITE_SUBPATH = os.environ.get("SITE_SUBPATH", "")
28+
SITE_SUBPATH = settings.DJAKART_SITE_SUBPATH
2629

27-
SRID = os.environ.get("REPO_CRS")
30+
SRID = settings.DJAKART_SRID
2831
SRID_CODE = SRID.split(":")[1]
2932

3033

3134
def get_pg_versions_connection():
3235
connection = psycopg2.connect(
33-
database=os.environ.get("VERSION_DB", "blabla"),
34-
user=os.environ.get("POSTGRES_USER", "blabla"),
35-
password=os.environ.get("POSTGRES_PASSWORD", "blabla"),
36-
host=os.environ.get("POSTGRES_SERVER", "blabla"),
37-
port=os.environ.get("POSTGRES_PORT", "blabla")
36+
database = settings.DJAKART_VERSION_DB,
37+
user = PG_SU,
38+
password = PG_PWD,
39+
host = settings.DJAKART_POSTGRES_SERVER,
40+
port = settings.DJAKART_POSTGRES_PORT,
3841
)
3942
return connection
4043

41-
4244
class KartException(Exception):
4345
pass
4446

@@ -225,9 +227,9 @@ def crea_nuovo_repository(repo_name,bare=True,readonly_workingcopy=None):
225227
cmds.append("postgresql://{user}:{password}@{host}:{port}/{db}/{schema}".format(
226228
user=PG_SU,
227229
password=PG_PWD,
228-
host=os.environ.get("POSTGRES_SERVER",'pgserver'),
229-
port=os.environ.get("POSTGRES_PORT",'pgport'),
230-
db=os.environ.get("VERSION_DB",'pgdb'),
230+
host=PG_HOST,
231+
port=PG_PORT,
232+
db=PG_DB,
231233
schema=readonly_workingcopy
232234
))
233235
if bare:
@@ -268,9 +270,9 @@ def get_pg_uri(v):
268270
return "postgresql://{user}:{password}@{host}:{port}/{db}/{schema}".format(
269271
user=PG_SU,
270272
password=PG_PWD,
271-
host=os.environ.get("POSTGRES_SERVER",'pgserver'),
272-
port=os.environ.get("POSTGRES_PORT",'pgport'),
273-
db=os.environ.get("VERSION_DB",'pgdb'),
273+
host=PG_HOST,
274+
port=PG_PORT,
275+
db=PG_DB,
274276
schema=v
275277
)
276278

0 commit comments

Comments
 (0)