Skip to content

Commit f104a89

Browse files
authored
Merge pull request #18 from GeographicaGS/dev_raul_managing
Dev raul managing
2 parents 1ac232e + 71aece2 commit f104a89

File tree

133 files changed

+6476
-575
lines changed

Some content is hidden

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

133 files changed

+6476
-575
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ venv/
66
api/model/base/PostgreSQL/config.py
77
tempimages/
88
images/
9+
www/cdn/tmp/
10+
www/src/node_modules/

api/.gitignore

100755100644
File mode changed.

api/README.md

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
## API usage
2+
3+
- Create virtual environment:
4+
```
5+
$ pip install virtualenv
6+
$ cd projectname/api
7+
$ virtualenv venv
8+
$ . venv/bin/activate
9+
$ pip install requirements.txt
10+
$ deactivate
11+
```
12+
13+
- Run API:
14+
```
15+
$ . venv/bin/activate
16+
$ python run.py
17+
```
18+
19+
- Exit from virtual environment:
20+
```
21+
$ deactivate
22+
```

api/api/__init__.py

100755100644
+5-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
from flask import Flask, jsonify
22

3-
app = Flask(__name__)
3+
import os
4+
tmpl_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
5+
6+
app = Flask(__name__, template_folder=tmpl_dir)
47

58
import config
69
import trans
710
import home
811
import proxy
912

10-
@app.route('/', methods = ['GET'])
13+
@app.route('/', methods = ['GET'])
1114
def alive():
1215
return jsonify( { "status" : "running"})

api/api/authutil.py

+90-16
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# coding=UTF8
22

33
from api import app
4-
from flask import request,abort
4+
from flask import request, abort, render_template
55
from model.usermodel import UserModel
66
import md5
77
import datetime
@@ -26,7 +26,7 @@ def decorator(*args, **kwargs): #1
2626
m = md5.new()
2727
m.update(suma)
2828
hashsum = m.hexdigest()
29-
29+
3030
if(hashsum != request.headers['hash']):
3131
abort(401)
3232
else:
@@ -38,44 +38,118 @@ def decorator(*args, **kwargs): #1
3838
return func(*args, **kwargs)
3939
return decorator
4040

41+
def authAdmin(func):
42+
@wraps(func)
43+
def decorator(*args, **kwargs): #1
44+
if (request.headers['hash'] is not None and request.headers['timestamp'] is not None and request.headers['username'] is not None):
45+
# Control timestamp
46+
usertimestamp = datetime.datetime.fromtimestamp(int(request.headers['timestamp'])/1000)
47+
maxtime = usertimestamp + datetime.timedelta(minutes=app.config["loginMaxTime"])
48+
diftime = datetime.datetime.now() - maxtime
49+
if (diftime <= datetime.timedelta(seconds=0)):
50+
51+
# Control credentials
52+
usermodel = UserModel()
53+
user = usermodel.getUserByUsername(request.headers['username'])
54+
if user is not None and user['admin']:
55+
password = usermodel.getPasswordByUsername(request.headers['username'])
56+
57+
if(password != ''):
58+
suma = request.headers['username'] + password + request.headers['timestamp']
59+
m = md5.new()
60+
m.update(suma)
61+
hashsum = m.hexdigest()
62+
63+
if(hashsum != request.headers['hash']):
64+
abort(401)
65+
else:
66+
abort(401)
67+
else:
68+
abort(401)
69+
else:
70+
abort(401)
71+
else:
72+
abort(401)
73+
return func(*args, **kwargs)
74+
return decorator
75+
4176
def sendEmail(toAddresses,subject,body):
4277
# Import smtplib for the actual sending function
4378
import smtplib
44-
79+
4580
from email.MIMEMultipart import MIMEMultipart
4681
from email.MIMEText import MIMEText
4782
from email.header import Header
48-
83+
4984
server = smtplib.SMTP(host=app.config["smtpServer"], port=app.config["smtpPort"], timeout=10)
5085

51-
if app.config["smtpTLS"]:
86+
if app.config["smtpTLS"]:
5287
server.starttls()
53-
88+
5489
server.ehlo()
5590

56-
if app.config["smtpAuth"]:
91+
if app.config["smtpAuth"]:
5792
server.login(app.config["smtpUser"], app.config["smtpPassword"])
5893

5994
fromAddr = app.config["smtpFromAddr"]
60-
95+
6196
msg = MIMEMultipart('alternative')
6297
msg['From'] = '"%s"<%s>' % (app.config["smtpFromAddrName"], app.config["smtpFromAddr"])
6398
msg['To'] = ",".join(toAddresses)
6499
msg['Subject'] = Header(subject,'utf-8')
65-
100+
66101
msg.attach(MIMEText(body.encode("utf-8"), 'html','utf-8'))
67-
102+
68103
text = msg.as_string()
69104

70105
try:
71106
server.sendmail(fromAddr, toAddresses, text)
72107
finally:
73108
server.quit()
74109

75-
def getConfirmationEmailBody(user,code,lang="es"):
76-
link = "<a href='"+ app.config["baseURL"] +"/" + lang + "/user/" + user + "/" + code + "' target='_blank'>"+app.trans['EMAIL_MSG_LINK'][lang]+"</a>"
77-
m = "<h2>"+app.trans['EMAIL_TITLE'][lang]+"</h2>"
78-
m += "<h2>"+app.trans['EMAIL_MSG_CONFIRM'][lang]+"</h2>"
79-
m += "<p>" + app.trans['EMAIL_MSG_PRELINK'][lang] + link + app.trans['EMAIL_MSG_POSTLINK'][lang] +"</p>"
110+
def sendAccountConfirmationEmail(username, userrealname, code, email, lang="es"):
111+
link = app.config["baseURL"] +"/" + lang + "/user/" + username + "/" + code
112+
body = render_template('email_accountconfirmation_%s.html' % lang, confirmationurl=link, userrealname=userrealname)
113+
sendEmail([email], app.trans['EMAIL_ACCOUNTCONFIRMATION_SUBJECT'][lang], body);
114+
115+
def sendNewHistoryNotification(user, history):
116+
history['url'] = app.config["baseURL"] + "/" + user['lang'] + "/join/history/" + str(history['id_history'])
117+
if user['admin']:
118+
body = render_template('email_newhistory_admin_%s.html' % (user['lang']), history=history)
119+
else:
120+
body = render_template('email_newhistory_author_%s.html' % (user['lang']), history=history)
121+
sendEmail([user['email']], app.trans['EMAIL_NEWHISTORY_SUBJECT'][user['lang']], body);
122+
123+
def sendEditedHistoryNotification(user, history):
124+
history['url'] = app.config["baseURL"] + "/" + user['lang'] + "/join/history/" + str(history['id_history'])
125+
if user['admin']:
126+
body = render_template('email_editedhistory_admin_%s.html' % (user['lang']), history=history)
127+
else:
128+
body = render_template('email_editedhistory_author_%s.html' % (user['lang']), history=history)
129+
sendEmail([user['email']], app.trans['EMAIL_EDITEDHISTORY_SUBJECT'][user['lang']], body);
130+
131+
def sendPublishedHistoryNotification(user, history):
132+
history['url'] = app.config["baseURL"] + "/" + user['lang'] + "/join/history/" + str(history['id_history'])
133+
if user['admin']:
134+
if history['status'] == 1:
135+
subject = app.trans['EMAIL_PUBLISHEDHISTORY_SUBJECT'][user['lang']]
136+
body = render_template('email_publishedhistory_admin_%s.html' % (user['lang']), history=history)
137+
else:
138+
subject = app.trans['EMAIL_UNPUBLISHEDHISTORY_SUBJECT'][user['lang']]
139+
body = render_template('email_unpublishedhistory_admin_%s.html' % (user['lang']), history=history)
140+
else:
141+
if history['status'] == 1:
142+
subject = app.trans['EMAIL_PUBLISHEDHISTORY_SUBJECT'][user['lang']]
143+
body = render_template('email_publishedhistory_author_%s.html' % (user['lang']), history=history)
144+
else:
145+
subject = app.trans['EMAIL_UNPUBLISHEDHISTORY_SUBJECT'][user['lang']]
146+
body = render_template('email_unpublishedhistory_author_%s.html' % (user['lang']), history=history)
147+
sendEmail([user['email']], subject, body);
80148

81-
return m;
149+
def sendDeletedHistoryNotification(user, history):
150+
history['url'] = app.config["baseURL"] + "/" + user['lang'] + "/join/history/" + str(history['id_history'])
151+
if user['admin']:
152+
body = render_template('email_deletedhistory_admin_%s.html' % (user['lang']), history=history)
153+
else:
154+
body = render_template('email_deletedhistory_author_%s.html' % (user['lang']), history=history)
155+
sendEmail([user['email']], app.trans['EMAIL_DELETEDHISTORY_SUBJECT'][user['lang']], body);

api/api/config_changes.py

100755100644
+29-19
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,34 @@
77
cdnPath = baseRootPath + "/www/cdn"
88

99
app.config.update(
10-
DEBUG=False,
11-
SECRET_KEY="XXXX",
12-
baseURL = "",
13-
smtpServer="localhost",
14-
smtpPort=25,
15-
smtpUser="",
16-
smtpPassword="",
17-
smtpFromAddr="",
18-
smtpFromAddrName="DEV alboran",
19-
smtpTLS = False,
20-
smtpAuth = False,
21-
convertBin = "convert",
22-
UPLOAD_TEMP_FOLDER= baseRootPath +"/tempimages/",
23-
IMAGES_FOLDER= cdnPath +"/images/",
24-
ALLOWED_EXTENSIONS=set(["jpg","jpeg","png"]),
10+
baseURL='http://xxxxxxxxxxx',
11+
DEBUG=True,
12+
SECRET_KEY='xxxxxxxxxx',
13+
smtpServer='xxxxxxxxxxx',
14+
smtpPort=587,
15+
smtpUser='xxxxxxxxxxxxx',
16+
smtpPassword='xxxxxxxxxxxxxxxxxxxx',
17+
smtpTLS=True,
18+
smtpAuth=True,
19+
smtpFromAddr='xxxxxxxxxxxxxxxxxxxxxxxxxx',
20+
smtpFromAddrName='Geoportal Alboran',
21+
UPLOAD_TEMP_FOLDER= cdnPath + '/tmp/',
22+
IMAGES_FOLDER= cdnPath + "/images/",
23+
ALLOWED_EXTENSIONS=set(['jpg','jpeg','png']),
2524
MAX_CONTENT_LENGTH=16 * 1024 * 1024,
26-
historyFirstPagSize=,
27-
historyPagSize=,
28-
#time in minutes
29-
loginMaxTime=20
25+
convertBin='convert',
26+
historyFirstPagSize=16,
27+
historyPagSize=16,
28+
loginMaxTime=20,
29+
30+
consumer_key= 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
31+
consumer_secret= 'xxxxxxxxxxxxxxxxxxxx',
32+
access_token= 'xxxxxxxxx',
33+
access_token_secret= 'xxxxxxxxxxxxxxxxx',
34+
hashtag = '#prueba',
35+
36+
geoserver_apirest='http://xxxxxxxxxxxxx/geoserver/rest',
37+
geoserver_user='xxxxxxxxxxxx',
38+
geoserver_psswd='xxxxxxxxxxxxxxxxxxx',
39+
geoserver_ws='xxxx'
3040
)

api/api/cons.py

100755100644
File mode changed.

api/api/geoserverlayers.py

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from geoserver.catalog import Catalog
4+
5+
6+
7+
class GeoserverLayers(object):
8+
9+
def __init__(self, gs_apirest, username, password):
10+
try:
11+
self.__catalog = Catalog(gs_apirest, username=username, password=password)
12+
13+
except Exception as err:
14+
print("Geoserver API Rest Error: {0}".format(err))
15+
16+
def __createSldStyle(self, sldpath, stylename, ovwrt=False):
17+
try:
18+
styles_list = [st.name for st in self.__catalog.get_styles()]
19+
if ovwrt or not stylename in styles_list:
20+
with open(sldpath) as f:
21+
self.__catalog.create_style(stylename, f.read(), overwrite=ovwrt)
22+
else:
23+
print("This style already exists...")
24+
25+
except Exception as err:
26+
print("Geoserver API Rest Error creating new style: {0}".format(err))
27+
28+
def __rmvResources(self, rsrc):
29+
"""
30+
Removing resources
31+
"""
32+
self.__catalog.delete(rsrc)
33+
self.__catalog.reload()
34+
35+
def rmvStyle(self, stylename):
36+
"""
37+
Remove style
38+
"""
39+
try:
40+
41+
style = self.__catalog.get_style(stylename)
42+
self.__rmvResources(style)
43+
44+
except Exception as err:
45+
print("Geoserver API Rest Error removing style: {0}".format(err))
46+
47+
def rmvDataStore(self, ds_store):
48+
"""
49+
Remove DataStore (with his layer)
50+
"""
51+
try:
52+
53+
lay_rm = self.__catalog.get_layer(ds_store)
54+
self.__rmvResources(lay_rm)
55+
56+
str_rm = self.__catalog.get_store(ds_store)
57+
self.__rmvResources(str_rm)
58+
59+
except Exception as err:
60+
print("Geoserver API Rest Error removing data store: {0}".format(err))
61+
62+
def createGeoserverWMSLayer(self, data, ws_name, ds_name, stylename, sldpath, debug=False):
63+
"""
64+
Create Geoserver WMS layer
65+
66+
Status codes:
67+
2 : "Geoserver layer successfully created"
68+
-1 : "Workspace does not exist"
69+
-2 : "Datastore already exists"
70+
-3 : "Error creating Geoserver layer"
71+
-4 : "File missing"
72+
"""
73+
try:
74+
75+
if not self.__catalog.get_workspace(ws_name):
76+
print("Workspace does not exist")
77+
return -1
78+
79+
ds_list = [i.name for i in self.__catalog.get_stores()]
80+
if ds_name in ds_list:
81+
print("Datastore already exists")
82+
return -2
83+
84+
ds = self.__catalog.create_datastore(ds_name, ws_name)
85+
ft = self.__catalog.create_featurestore(ds_name, workspace=ws_name,data=data)
86+
87+
print("Geoserver layer successfully created...")
88+
89+
self.__createSldStyle(sldpath, stylename)
90+
lyr = self.__catalog.get_layer(ds_name)
91+
lyr.enabled = True
92+
lyr.default_style = stylename
93+
self.__catalog.save(lyr)
94+
95+
if debug:
96+
rsrc = self.__catalog.get_resource(ds_name, workspace=ws_name)
97+
print("Data Store XML: {}".format(rsrc.href))
98+
99+
return 2
100+
101+
except Exception as err:
102+
print("Geoserver API Rest Error creating new layer: {0}".format(err))
103+
return -3

0 commit comments

Comments
 (0)