Skip to content

Commit b99d07d

Browse files
committed
try to generalize deployment
1 parent 6dc6ff5 commit b99d07d

File tree

5 files changed

+66
-20
lines changed

5 files changed

+66
-20
lines changed

.flaskenv

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,4 @@ FN_AUTH_REDIRECT_URI=http://localhost:8080/google/auth
66
FN_BASE_URI=http://localhost:8080
77
GLOWSCRIPT_RUNNING_LOCALLY=true
88
DATASTORE_EMULATOR_HOST=localhost:8081
9-
GOOGLE_PROJECT_ID=glowscript-py38
109
CLIENT_SECRET_VERSION=1

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ bower_components
55
/venv
66
__pycache__/
77
*~
8-
/.vscode/setting.json
8+
/.vscode/
99
/ide/.vscode

ide/ide.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ $(function () {
33

44
var worker
55
var sourceLines
6-
var website = 'glowscriptdev.spvi.net' // normally glowscript
6+
var website = 'WEBSERVER_NAME_TEMPLATE' // normally glowscript
77
var sandbox_prefix = 'https://sandbox.' // https for production
88
var disable_writes = false // prevent all writes (edit, create/delete folder or program, copy/rename program)
99

ide/models.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,17 @@ class Program (ndb.Model):
2525
screenshot = ndb.BlobProperty()
2626
datetime = ndb.DateTimeProperty() # this is UTC date and time
2727

28+
class Setting(ndb.Model):
29+
"""A setting value"""
30+
# No parent
31+
# Key is the setting name
32+
value = ndb.StringProperty()
33+
34+
@staticmethod
35+
def get(name):
36+
NOT_SET_VALUE = "NOT SET"
37+
ndb_setting = ndb.Key("Setting",name).get()
38+
if not ndb_setting:
39+
ndb_setting = Setting(id=name, value=NOT_SET_VALUE)
40+
ndb_setting.put()
41+
return ndb_setting

ide/routes.py

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@
2929

3030
localport = '8080' # normally 8080
3131
website = 'glowscript' # normally glowscript
32-
weblocs = ["www."+website+".org", website+".org", "localhost:"+localport,"127.0.0.1:"+localport, "www.glowscriptdev.spvi.net","devbasherwo.uc.r.appspot.com"]
32+
33+
weblocs = ["www."+website+".org", website+".org", "localhost:"+localport,"127.0.0.1:"+localport,
34+
"www.glowscriptdev.spvi.net","devbasherwo.uc.r.appspot.com","www.devbasherwo.org"]
35+
3336
local_hosts = ['http://localhost','http://127.0.0.1']
3437

3538
import json
@@ -39,13 +42,14 @@
3942
import datetime
4043
import uuid
4144
import flask
45+
import traceback
4246

4347
from google.cloud import ndb
4448
from google.auth.transport import requests
4549
from google.cloud import ndb
4650
import google.oauth2.id_token
4751

48-
from .models import User, Program, Folder
52+
from .models import User, Program, Folder, Setting
4953

5054
import os, re, base64, logging # logging.info(string variable) prints to GAE launcher log, for debugging
5155
from datetime import datetime
@@ -98,13 +102,36 @@ def middleware(environ, start_response):
98102
# in production
99103
#
100104

105+
module_cache = {} # cache some things, like ide.js, so we don't need to keep reloading them
106+
107+
#
108+
# we need to replace WEBSERVER_NAME_TEMPLATE in ide.js with the correct
109+
# webserver name from the datastore.
110+
#
111+
112+
def load_idejs(webserver='devbasherwo.spvi.net'):
113+
try:
114+
ide_js = open('ide/ide.js').read()
115+
ide_js = ide_js.replace('WEBSERVER_NAME_TEMPLATE',webserver)
116+
module_cache['ide.js'] = ide_js
117+
except:
118+
ide_js='Ack! Cannot load ide.js'
119+
traceback.print_exc()
120+
121+
return ide_js
122+
101123
@app.route('/css/<path:filename>')
102124
def css_static(filename):
103125
return flask.send_from_directory('../css', filename)
104126

105127
@app.route('/ide.js')
106128
def idejs_static():
107-
return flask.send_from_directory('.', 'ide.js')
129+
ide_js = module_cache.get('ide_js')
130+
if not ide_js:
131+
web_setting = Setting.get('web_domain_name')
132+
ide_js = load_idejs(web_setting.value)
133+
134+
return ide_js,200
108135

109136
@app.route('/lib/<path:filename>')
110137
def lib_static(filename):
@@ -286,7 +313,8 @@ def ApiUser(username):
286313
try:
287314
names, ndb_user, email = parseUrlPath(r'/api/user/([^/]+)', 1)
288315
except ParseUrlPathException as pup:
289-
errorMsg, code = pup.args
316+
errorMsg = pup.args[0]
317+
code = pup.args[1]
290318
return flask.make_response(errorMsg, code)
291319

292320
user = names and names[0] or ''
@@ -334,7 +362,8 @@ def ApiUserFolders(username):
334362
try:
335363
names, folder_owner, logged_in_email = parseUrlPath(r'/api/user/([^/]+)/folder/', 1)
336364
except ParseUrlPathException as pup:
337-
errorMsg, code = pup.args
365+
errorMsg = pup.args[0]
366+
code = pup.args[1]
338367
return flask.make_response(errorMsg, code)
339368

340369
user = names and names[0] or ''
@@ -356,9 +385,10 @@ def ApiUserFolders(username):
356385
def ApiUserFolder(username, foldername):
357386

358387
try:
359-
names, ndb_user, email = parseUrlPath(r'/api/user/([^/]+)/folder/([^/]+)', 2)
388+
names, ndb_user, _ = parseUrlPath(r'/api/user/([^/]+)/folder/([^/]+)', 2)
360389
except ParseUrlPathException as pup:
361-
errorMsg, code = pup.args
390+
errorMsg = pup.args[0]
391+
code = pup.args[1]
362392
return flask.make_response(errorMsg, code)
363393

364394
user = names and names[0] or ''
@@ -384,13 +414,13 @@ def ApiUserFolder(username, foldername):
384414

385415
ndb_folder = ndb.Key("User", user, "Folder", folder).get()
386416
if not ndb_folder:
387-
return self.error(404)
417+
return flask.make_response("Not found", 403)
388418
program_count = 0
389-
for p in Program.query(ancestor=ndb.Key("User",user,"Folder",folder)):
419+
for _ in Program.query(ancestor=ndb.Key("User",user,"Folder",folder)):
390420
program_count += 1
391421

392422
if program_count > 0:
393-
return self.error(409)
423+
return flask.make_response("There are programs here", 409)
394424
ndb_folder.key.delete()
395425
return {}
396426

@@ -402,7 +432,8 @@ def ApiUserFolderPrograms(username, foldername):
402432
try:
403433
names, ndb_user, email = parseUrlPath(r'/api/user/([^/]+)/folder/([^/]+)/program/', 2)
404434
except ParseUrlPathException as pup:
405-
errorMsg, code = pup.args
435+
errorMsg = pup.args[0]
436+
code = pup.args[1]
406437
return flask.make_response(errorMsg, code)
407438

408439
user, folder = names
@@ -413,7 +444,7 @@ def ApiUserFolderPrograms(username, foldername):
413444
pub = ndb_folder.isPublic is None or ndb_folder.isPublic or email == ndb_user.email # before March 2015, isPublic wasn't set
414445
except:
415446
pub = True
416-
if not pub and not override(gaeUser):
447+
if not pub and not override(ndb_user.email):
417448
return {"user":user,"folder":folder,
418449
"error": str('The folder "'+user+'/'+folder+'" is a private folder\nto which you do not have access.')}
419450
else:
@@ -431,7 +462,8 @@ def ApiUserFolderProgram(username, foldername, programname):
431462
try:
432463
names, ndb_user, email = parseUrlPath(r'/api/user/([^/]+)/folder/([^/]+)/program/([^/]+)', 3)
433464
except ParseUrlPathException as pup:
434-
errorMsg, code = pup.args
465+
errorMsg = pup.args[0]
466+
code = pup.args[1]
435467
return flask.make_response(errorMsg, code)
436468

437469
user, folder, program = names
@@ -462,7 +494,6 @@ def ApiUserFolderProgram(username, foldername, programname):
462494
if not authorize_user(user):
463495
return flask.make_response("Unauthorized", 401)
464496

465-
source = ''
466497
value = flask.request.values.get("program")
467498

468499
if value:
@@ -509,7 +540,8 @@ def ApiUserFolderProgramDownload(username, foldername, programname, optionname):
509540
try:
510541
names, ndb_user, email = parseUrlPath(r'/api/user/([^/]+)/folder/([^/]+)/program/([^/]+)/option/([^/]+)', 4)
511542
except ParseUrlPathException as pup:
512-
errorMsg, code = pup.args
543+
errorMsg = pup.args[0]
544+
code = pup.args[1]
513545
return flask.make_response(errorMsg, code)
514546

515547
user, folder, name, option = names
@@ -585,9 +617,10 @@ def ApiUserFolderProgramDownload(username, foldername, programname, optionname):
585617
def ApiUserProgramCopy(username, foldername, programname, optionname, oldfoldername, oldprogramname):
586618

587619
try:
588-
names, ndb_user, email = parseUrlPath(r'/api/user/([^/]+)/folder/([^/]+)/program/([^/]+)/option/([^/]+)/oldfolder/([^/]+)/oldprogram/([^/]+)', 6)
620+
names, _, _ = parseUrlPath(r'/api/user/([^/]+)/folder/([^/]+)/program/([^/]+)/option/([^/]+)/oldfolder/([^/]+)/oldprogram/([^/]+)', 6)
589621
except ParseUrlPathException as pup:
590-
errorMsg, code = pup.args
622+
errorMsg = pup.args[0]
623+
code = pup.args[1]
591624
return flask.make_response(errorMsg, code)
592625

593626
user, folder, program, option, oldfolder, oldprogram = names

0 commit comments

Comments
 (0)