Skip to content

Commit

Permalink
Merge pull request #161 from cartologic/stand_alone
Browse files Browse the repository at this point in the history
cartoview stand-alone
  • Loading branch information
Hisham waleed karam committed Aug 2, 2018
2 parents 7053c96 + 24ce794 commit ea778c6
Show file tree
Hide file tree
Showing 28 changed files with 1,307 additions and 134 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -238,4 +238,6 @@ cartoview_project/cartoview_project/local_settings.py
cartoview.egg-info/
node_modules
dist/

vendor
static/
uploaded
47 changes: 47 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
up:
# bring up the services
docker-compose up -d

sync: up
# set up the database tablea
docker-compose exec cartoview python manage.py migrate
docker-compose exec cartoview python manage.py loaddata sample_admin.json
docker-compose exec cartoview python manage.py loaddata scripts/json/default_oauth_apps.json
docker-compose exec cartoview python manage.py loaddata app_stores.json
docker-compose exec cartoview python manage.py loaddata initial_data.json


prepare_manager: up
#make migration for app_manager
docker-compose exec cartoview python manage.py makemigrations app_manager
migrate_account: up
docker-compose exec cartoview python manage.py migrate account
migrate:
docker-compose exec cartoview python manage.py migrate --noinput
wait:
sleep 5
logs:
docker-compose logs --follow
logs_tail:
docker-compose logs --follow --tail 100
logs_tail_cartoview:
docker-compose logs --follow --tail 100 cartoview
logs_tail_geoserver:
docker-compose logs --follow --tail 100 geoserver
down:
docker-compose down
bower:
docker-compose exec cartoview bower install --allow-root
reset: down up wait sync

collect_static: up
docker-compose exec cartoview python manage.py collectstatic --noinput
run: up wait prepare_manager sync collect_static

static_db: up sync wait bower collect_static

update:
docker-compose exec cartoview pip install cartoview --no-cache-dir -U
docker-compose restart cartoview
new_app: collect_static
docker-compose restart cartoview
52 changes: 52 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,58 @@
- CartoView is a GIS Web Mapping Application Market.
- Cartoview extends the popular [GeoNode](http://geonode.org/) SDI to provide the ability to create, share, and visualize GIS Web Mapping Applications very easily and very quickly from the browser without programming.

## Docker Installation:
- install [docker](https://docs.docker.com/v17.12/install/#server) and [docker-compose](https://docs.docker.com/compose/install/#prerequisites)
- clone cartoview and navigate to cartoview folder
- on linux based OS use this command `make run` to setup and start cartoview in docker for the first time
- on windows run the following commands to setup and start cartoview in docker for the first time:
```sh
$ docker-compose up
$ docker-compose exec cartoview python manage.py makemigrations
$ docker-compose exec cartoview python manage.py migrate
$ docker-compose exec cartoview python manage.py loaddata sample_admin.json
$ docker-compose exec cartoview python manage.py loaddata scripts/json/default_oauth_apps.json
$ docker-compose exec cartoview python manage.py loaddata app_stores.json
$ docker-compose exec cartoview python manage.py loaddata initial_data.json
```
- open your browser and type the following address `10.5.0.4`
- default user credentials `admin/admin` for cartoview and `admin/geoserver` for geoserver
- you can stop containers with `make down` or `docker-compose down`
- you can get logs for each service in `docker-compose.yml` unsing the following command:
- `docker-compose logs --follow --tail=100 <service_name>`
- start the containers with `docker-compose up -d` or `make up`
- stop the containers with `docker-compose down` or `make down`

## How To Add Cartoview To Existing Geonode:
- install cartoview with pip:
- `pip install cartoview --no-cache-dir`
- open geonode `settings.py` and add the following lines at the end of the file:
```python

from cartoview import settings as cartoview_settings


INSTALLED_APPS = cartoview_settings.INSTALLED_APPS
ROOT_URLCONF = cartoview_settings.ROOT_URLCONF


APPS_DIR = os.path.abspath(os.path.join(PROJECT_ROOT, "apps"))
PENDING_APPS = os.path.join(PROJECT_ROOT, "pendingOperation.yml")


APPS_MENU = False

TEMPLATES[0]["DIRS"] = CARTOVIEW_TEMPLATE_DIRS
TEMPLATES[0]["OPTIONS"]['context_processors'] += cartoview_settings.CARTOVIEW_CONTEXT_PROCESSORS


STATICFILES_DIRS += cartoview_settings.CARTOVIEW_STATIC_DIRS


from cartoview.app_manager.settings import load_apps
INSTALLED_APPS += load_apps()
```
- restart your server
## Docs:
- [How to use and install](http://cartologic.github.io)
4 changes: 3 additions & 1 deletion cartoview/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
__version__ = (1, 8, 1, 'final', 0)
from .celery import app

__version__ = (1, 8, 2, 'rc', 0)
__compatible_with__ = []


Expand Down
64 changes: 33 additions & 31 deletions cartoview/app_manager/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,34 +17,36 @@
standard_library.install_aliases()

# BASE_DIR must be defined in project.settings
APPS_DIR = os.path.abspath(os.path.join(BASE_DIR, "apps"))
if not os.path.exists(APPS_DIR):
create_direcotry(APPS_DIR)
if not os.access(APPS_DIR, os.W_OK):
change_path_permission(APPS_DIR)
if APPS_DIR not in sys.path:
sys.path.append(APPS_DIR)

apps_file_path = os.path.join(APPS_DIR, "apps.yml")
PENDING_APPS = os.path.join(APPS_DIR, "pendingOperation.yml")
apps_config = AppsConfig(apps_file_path)
CARTOVIEW_APPS = ()
for app_config in apps_config:
if app_config.active:
try:
# ensure that the folder is python module
app_module = importlib.import_module(app_config.name)
app_dir = os.path.dirname(app_module.__file__)
app_settings_file = os.path.join(app_dir, 'settings.py')
if os.path.exists(app_settings_file):
# By doing this instead of import, app/settings.py can refer to
# local variables from settings.py without circular imports.
execfile(app_settings_file)
if app_config.name not in CARTOVIEW_APPS:
# app_config.name.__str__() because Django don't like unicode_literals
CARTOVIEW_APPS += (app_config.name.__str__(),)
except Exception as e:
logger.error(e.message)

INSTALLED_APPS = INSTALLED_APPS + CARTOVIEW_APPS
INSTALLED_APPS += ("cartoview.apps_handler.apps.AppsHandlerConfig",)


def load_apps():
from django.conf import settings
if not os.path.exists(settings.APPS_DIR):
create_direcotry(settings.APPS_DIR)
if not os.access(settings.APPS_DIR, os.W_OK):
change_path_permission(settings.APPS_DIR)
if settings.APPS_DIR not in sys.path:
sys.path.append(settings.APPS_DIR)

apps_file_path = os.path.join(settings.APPS_DIR, "apps.yml")
apps_config = AppsConfig(apps_file_path)
CARTOVIEW_APPS = ()
for app_config in apps_config:
if app_config.active:
try:
# ensure that the folder is python module
app_module = importlib.import_module(app_config.name)
app_dir = os.path.dirname(app_module.__file__)
app_settings_file = os.path.join(app_dir, 'settings.py')
if os.path.exists(app_settings_file):
# By doing this instead of import, app/settings.py can refer to
# local variables from settings.py without circular imports.
execfile(app_settings_file)
if app_config.name not in CARTOVIEW_APPS:
# app_config.name.__str__() because Django don't like unicode_literals
CARTOVIEW_APPS += (app_config.name.__str__(),)
except Exception as e:
print(e.message)
logger.error(e.message)

return CARTOVIEW_APPS
2 changes: 1 addition & 1 deletion cartoview/app_manager/static/app_manager/js/manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@
var backward_version_check = -1
for (var j = 0; j < versionInfo.backward_versions.length; j++) {
const v = versionInfo.backward_versions[j]

if (compareVersions(version, v) == 0) {
backward_version_check = 0
break
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/**
* angular-drag-and-drop-lists v2.1.0
*
* Copyright (c) 2014 Marcel Juenemann marcel@juenemann.cc
* Copyright (c) 2014-2017 Google Inc.
* https://github.com/marceljuenemann/angular-drag-and-drop-lists
*
* License: MIT
*/
!function(e){function n(e,n){return"all"==n?e:e.filter(function(e){return-1!=n.toLowerCase().indexOf(e)})}var a="application/x-dnd",r="application/json",t="Text",d=["move","copy","link"]
e.directive("dndDraggable",["$parse","$timeout",function(e,i){return function(l,f,c){f.attr("draggable","true"),c.dndDisableIf&&l.$watch(c.dndDisableIf,function(e){f.attr("draggable",!e)}),f.on("dragstart",function(s){if(s=s.originalEvent||s,"false"==f.attr("draggable"))return!0
o.isDragging=!0,o.itemType=c.dndType&&l.$eval(c.dndType).toLowerCase(),o.dropEffect="none",o.effectAllowed=c.dndEffectAllowed||d[0],s.dataTransfer.effectAllowed=o.effectAllowed
var g=l.$eval(c.dndDraggable),u=a+(o.itemType?"-"+o.itemType:"")
try{s.dataTransfer.setData(u,angular.toJson(g))}catch(p){var v=angular.toJson({item:g,type:o.itemType})
try{s.dataTransfer.setData(r,v)}catch(p){var D=n(d,o.effectAllowed)
s.dataTransfer.effectAllowed=D[0],s.dataTransfer.setData(t,v)}}if(f.addClass("dndDragging"),i(function(){f.addClass("dndDraggingSource")},0),s._dndHandle&&s.dataTransfer.setDragImage&&s.dataTransfer.setDragImage(f[0],0,0),e(c.dndDragstart)(l,{event:s}),c.dndCallback){var y=e(c.dndCallback)
o.callback=function(e){return y(l,e||{})}}s.stopPropagation()}),f.on("dragend",function(n){n=n.originalEvent||n,l.$apply(function(){var a=o.dropEffect,r={copy:"dndCopied",link:"dndLinked",move:"dndMoved",none:"dndCanceled"}
e(c[r[a]])(l,{event:n}),e(c.dndDragend)(l,{event:n,dropEffect:a})}),o.isDragging=!1,o.callback=void 0,f.removeClass("dndDragging"),f.removeClass("dndDraggingSource"),n.stopPropagation(),i(function(){f.removeClass("dndDraggingSource")},0)}),f.on("click",function(n){c.dndSelected&&(n=n.originalEvent||n,l.$apply(function(){e(c.dndSelected)(l,{event:n})}),n.stopPropagation())}),f.on("selectstart",function(){this.dragDrop&&this.dragDrop()})}}]),e.directive("dndList",["$parse",function(e){return function(i,l,f){function c(e){if(!e)return t
for(var n=0;n<e.length;n++)if(e[n]==t||e[n]==r||e[n].substr(0,a.length)==a)return e[n]
return null}function s(e){return o.isDragging?o.itemType||void 0:e==t||e==r?null:e&&e.substr(a.length+1)||void 0}function g(e){return E.disabled?!1:E.externalSources||o.isDragging?E.allowedTypes&&null!==e?e&&-1!=E.allowedTypes.indexOf(e):!0:!1}function u(e,a){var r=d
return a||(r=n(r,e.dataTransfer.effectAllowed)),o.isDragging&&(r=n(r,o.effectAllowed)),f.dndEffectAllowed&&(r=n(r,f.dndEffectAllowed)),r.length?e.ctrlKey&&-1!=r.indexOf("copy")?"copy":e.altKey&&-1!=r.indexOf("link")?"link":r[0]:"none"}function p(){return T.remove(),l.removeClass("dndDragover"),!0}function v(n,a,r,t,d,l){return e(n)(i,{callback:o.callback,dropEffect:r,event:a,external:!o.isDragging,index:void 0!==d?d:D(),item:l||void 0,type:t})}function D(){return Array.prototype.indexOf.call(m.children,h)}function y(){var e
return angular.forEach(l.children(),function(n){var a=angular.element(n)
a.hasClass("dndPlaceholder")&&(e=a)}),e||angular.element("<li class='dndPlaceholder'></li>")}var T=y()
T.remove()
var h=T[0],m=l[0],E={}
l.on("dragenter",function(e){e=e.originalEvent||e
var n=f.dndAllowedTypes&&i.$eval(f.dndAllowedTypes)
E={allowedTypes:angular.isArray(n)&&n.join("|").toLowerCase().split("|"),disabled:f.dndDisableIf&&i.$eval(f.dndDisableIf),externalSources:f.dndExternalSources&&i.$eval(f.dndExternalSources),horizontal:f.dndHorizontalList&&i.$eval(f.dndHorizontalList)}
var a=c(e.dataTransfer.types)
return a&&g(s(a))?void e.preventDefault():!0}),l.on("dragover",function(e){e=e.originalEvent||e
var n=c(e.dataTransfer.types),a=s(n)
if(!n||!g(a))return!0
if(h.parentNode!=m&&l.append(T),e.target!=m){for(var r=e.target;r.parentNode!=m&&r.parentNode;)r=r.parentNode
if(r.parentNode==m&&r!=h){var d=r.getBoundingClientRect()
if(E.horizontal)var o=e.clientX<d.left+d.width/2
else var o=e.clientY<d.top+d.height/2
m.insertBefore(h,o?r:r.nextSibling)}}var i=n==t,D=u(e,i)
return"none"==D?p():f.dndDragover&&!v(f.dndDragover,e,D,a)?p():(e.preventDefault(),i||(e.dataTransfer.dropEffect=D),l.addClass("dndDragover"),e.stopPropagation(),!1)}),l.on("drop",function(e){e=e.originalEvent||e
var n=c(e.dataTransfer.types),a=s(n)
if(!n||!g(a))return!0
e.preventDefault()
try{var d=JSON.parse(e.dataTransfer.getData(n))}catch(l){return p()}if((n==t||n==r)&&(a=d.type||void 0,d=d.item,!g(a)))return p()
var y=n==t,T=u(e,y)
if("none"==T)return p()
var h=D()
return f.dndDrop&&(d=v(f.dndDrop,e,T,a,h,d),!d)?p():(o.dropEffect=T,y||(e.dataTransfer.dropEffect=T),d!==!0&&i.$apply(function(){i.$eval(f.dndList).splice(h,0,d)}),v(f.dndInserted,e,T,a,h,d),p(),e.stopPropagation(),!1)}),l.on("dragleave",function(e){e=e.originalEvent||e
var n=document.elementFromPoint(e.clientX,e.clientY)
m.contains(n)&&!e._dndPhShown?e._dndPhShown=!0:p()})}}]),e.directive("dndNodrag",function(){return function(e,n,a){n.attr("draggable","true"),n.on("dragstart",function(e){e=e.originalEvent||e,e._dndHandle||(e.dataTransfer.types&&e.dataTransfer.types.length||e.preventDefault(),e.stopPropagation())}),n.on("dragend",function(e){e=e.originalEvent||e,e._dndHandle||e.stopPropagation()})}}),e.directive("dndHandle",function(){return function(e,n,a){n.attr("draggable","true"),n.on("dragstart dragend",function(e){e=e.originalEvent||e,e._dndHandle=!0})}})
var o={}}(angular.module("dndLists",[]));

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit ea778c6

Please sign in to comment.