def create_account(): """ Create a PythonAnywhere account """ if not request.vars: raise HTTP(400) if request.vars.username and request.vars.web2py_admin_password: # Check if web2py is already there otherwise we get an error 500 too. client = ServerProxy('https://%(username)s:%(web2py_admin_password)s@%(username)s.pythonanywhere.com/admin/webservices/call/jsonrpc' % request.vars) try: if client.login() is True: return response.json({'status': 'ok'}) except ProtocolError as error: pass import urllib, urllib2 url = 'https://www.pythonanywhere.com/api/web2py/create_account' data = urllib.urlencode(request.vars) req = urllib2.Request(url, data) try: reply = urllib2.urlopen(req) except urllib2.HTTPError as error: if error.code == 400: reply = error elif error.code == 500: return response.json({'status':'error', 'errors':{'username': ['An App other than web2py is installed in the domain %(username)s.pythonanywhere.com' % request.vars]}}) else: raise response.headers['Content-Type'] = 'application/json' return reply.read()
def test_chunks(): response.view = 'generic.json' from gluon.contrib.simplejsonrpc import ServerProxy msg = "TEST" url = "https://127.0.0.1:8000/data_sync/chunk/call/jsonrpc" service = ServerProxy(url, verbose=True) chunk = service.get_chunk("user!", "key!", "chunk_id") return dict(msg=msg, chunk=chunk)
def list_apps(): """ Get a list of apps both remote and local """ if not request.vars.username or not request.vars.password: raise HTTP(400) client = ServerProxy('https://%(username)s:%(password)s@%(username)s.pythonanywhere.com/admin/webservices/call/jsonrpc' % request.vars) regex = re.compile('^\w+$') local = [f for f in os.listdir(apath(r=request)) if regex.match(f)] try: pythonanywhere = client.list_apps() except ProtocolError as error: raise HTTP(error.errcode) return response.json({'local': local, 'pythonanywhere': pythonanywhere})
def list_apps(): """ Get a list of apps both remote and local """ if not request.vars.username or not request.vars.password: raise HTTP(400) client = ServerProxy( 'https://%(username)s:%(password)s@%(username)s.pythonanywhere.com/admin/webservices/call/jsonrpc' % request.vars) regex = re.compile('^\w+$') local = [f for f in os.listdir(apath(r=request)) if regex.match(f)] try: pythonanywhere = client.list_apps() except ProtocolError as error: raise HTTP(error.errcode) return response.json({'local': local, 'pythonanywhere': pythonanywhere})
def bulk_install(): """ Install a list of apps """ def b64pack(app): """ Given an app's name, return the base64 representation of its packed version. """ folder = apath(app, r=request) tmpfile = StringIO() tar = tarfile.TarFile(fileobj=tmpfile, mode='w') try: filenames = listdir( folder, '^[\w\.\-]+$', add_dirs=True, exclude_content_from=['cache', 'sessions', 'errors']) for fname in filenames: tar.add(os.path.join(folder, fname), fname, False) finally: tar.close() tmpfile.seek(0) gzfile = StringIO() w2pfp = gzip.GzipFile(fileobj=gzfile, mode='wb') w2pfp.write(tmpfile.read()) w2pfp.close() gzfile.seek(0) return base64.b64encode(gzfile.read()) request.vars.apps = request.vars['apps[]'] if not request.vars.apps or not request.vars.username or not request.vars.password: raise HTTP(400) if not isinstance(request.vars.apps, list): request.vars.apps = [request.vars.apps] # Only one app selected client = ServerProxy( 'https://%(username)s:%(password)s@%(username)s.pythonanywhere.com/admin/webservices/call/jsonrpc' % request.vars) for app in request.vars.apps: try: client.install(app, app + '.w2p', b64pack(app)) except ProtocolError as error: raise HTTP(error.errcode) return response.json({'status': 'ok'})
def bulk_install(): """ Install a list of apps """ def b64pack(app): """ Given an app's name, return the base64 representation of its packed version. """ folder = apath(app, r=request) tmpfile = StringIO() tar = tarfile.TarFile(fileobj=tmpfile, mode="w") try: filenames = listdir( folder, "^[\w\.\-]+$", add_dirs=True, exclude_content_from=["cache", "sessions", "errors"] ) for fname in filenames: tar.add(os.path.join(folder, fname), fname, False) finally: tar.close() tmpfile.seek(0) gzfile = StringIO() w2pfp = gzip.GzipFile(fileobj=gzfile, mode="wb") w2pfp.write(tmpfile.read()) w2pfp.close() gzfile.seek(0) return base64.b64encode(gzfile.read()) request.vars.apps = request.vars["apps[]"] if not request.vars.apps or not request.vars.username or not request.vars.password: raise HTTP(400) if not isinstance(request.vars.apps, list): request.vars.apps = [request.vars.apps] # Only one app selected client = ServerProxy( "https://%(username)s:%(password)s@%(username)s.pythonanywhere.com/admin/webservices/call/jsonrpc" % request.vars ) for app in request.vars.apps: try: client.install(app, app + ".w2p", b64pack(app)) except ProtocolError as error: raise HTTP(error.errcode) return response.json({"status": "ok"})
def f(*a, **b): if len(request.args) > 0: token = request.args[-1] res = None try: from gluon.contrib.simplejsonrpc import ServerProxy url = settings.rpc_server + "/cba/admin/call/jsonrpc" server = ServerProxy(url) res = server.check_permission(request.application, request.controller, request.function, token) except: # print auth.user.token # import traceback # traceback.print_exc() pass finally: if "result" in res and res["result"] is True: return action(*a, **b) if request.is_restful: raise HTTP(401) else: return dict(error="You don't have permission to access!")
def create_account(): """ Create a PythonAnywhere account """ if not request.vars: raise HTTP(400) if request.vars.username and request.vars.web2py_admin_password: # Check if web2py is already there otherwise we get an error 500 too. client = ServerProxy( 'https://%(username)s:%(web2py_admin_password)s@%(username)s.pythonanywhere.com/admin/webservices/call/jsonrpc' % request.vars) try: if client.login() is True: return response.json({'status': 'ok'}) except ProtocolError as error: pass import urllib, urllib2 url = 'https://www.pythonanywhere.com/api/web2py/create_account' data = urllib.urlencode(request.vars) req = urllib2.Request(url, data) try: reply = urllib2.urlopen(req) except urllib2.HTTPError as error: if error.code == 400: reply = error elif error.code == 500: return response.json({ 'status': 'error', 'errors': { 'username': [ 'An App other than web2py is installed in the domain %(username)s.pythonanywhere.com' % request.vars ] } }) else: raise response.headers['Content-Type'] = 'application/json' return reply.read()
def f(*a, **b): if auth.user is not None: res = None try: from gluon.contrib.simplejsonrpc import ServerProxy url = settings.rpc_server + "/cba/admin/call/jsonrpc" service = ServerProxy(url) res = service.check_permission(request.application, request.controller, request.function, auth.user.token) except: # print auth.user.token # import traceback # traceback.print_exc() pass finally: if res and "result" in res and res["result"] is True: auth.user.permissions = res["permissions"] return action(*a, **b) if request.is_restful: raise HTTP(401) else: #session.flash = "Bạn không có quyền truy cập!" if not "message" in res else res["message"] redirect(URL(c='default', f='index'))
def member_register(): links = None db.auth_user.id.readable = False # db.auth_user.first_name.writable = False # db.auth_user.last_name.writable = False # db.auth_user.first_name.readable = False # db.auth_user.last_name.readable = False db.auth_user.password.readable = False db.auth_user.username.readable = False db.auth_user.username.writable = False db.auth_user.province.readable = False db.auth_user.province.writable = False db.auth_user.address.readable = False db.auth_user.address.writable = False db.auth_user.country.readable = False db.auth_user.country.writable = False db.auth_user.bank_number.readable = False db.auth_user.bank_number.writable = False db.auth_user.bank_acc.readable = False db.auth_user.bank_acc.writable = False db.auth_user.phone.readable = False db.auth_user.phone.writable = False if not "new" in request.args: db.auth_user.email.writable = False db.auth_user.password.writable = False grid = SQLFORM.smartgrid(table=db.auth_user, showbuttontext=False, linked_tables=[], csv=False, links=links, constraints={ str(auth.table_user()): (db.auth_user.created_by == auth.user_id) }, oncreate=member_register_oncreate, onupdate=member_register_onupdate, ondelete=member_register_ondelete) if grid.create_form or grid.update_form or grid.view_form: functions = list() roles = list() try: from gluon.contrib.simplejsonrpc import ServerProxy url = settings.rpc_server + "/cba/admin/call/jsonrpc" service = ServerProxy(url) if grid.create_form: res = service.get_cp_roles(request.application) else: res = service.get_cp_roles(request.application) if "result" in res and res["result"]: functions.extend(res["result"]["functions"]) roles.extend(res["result"]["groups"]) except: import traceback traceback.print_exc() pass groups = list() if grid.view_form or grid.update_form: groups = db(db.auth_membership.user_id == request.args[-1]).select( db.auth_membership.group_id) groups = [x.group_id for x in groups] div_permission = TABLE( _border=1, _style="border: 1px solid #C8CDD5;color: #45535e;") header = TR( TD(), _style="background: #ACB5C5 -webkit-gradient(linear, left top," " left bottom, from(#D0D8E1), to(#ACB5C5));") for role in roles: header.append( TD(LABEL(str.replace(role["role"].encode("utf-8"), "CPUser_", ""), _for=role["role"], _style="font-weight:bold;padding: 5px 5px 0 5px;" "margin-bottom:-7px;text-align: center;"), INPUT(_type="checkbox", _id=role["role"], _name="roles", _value=role["id"], _checked='' if role["id"] in groups else None, _disabled='' if grid.view_form else None), _style="text-align: center;width: 80px;")) div_permission.append(header) old_cat = None bg_odd = "background-color: #eff1f4;" bg_even = "" bg = bg_odd for function in functions: cat_tr = TR( TD(function["category"], _style="font-weight:bold;padding: 5px 5px 5px;")) if old_cat != function["category"]: bg = bg_odd if bg == bg_even else bg_even div_permission.append(cat_tr) old_cat = function["category"] cat_tr.attributes["_style"] = "%s" % bg cat_tr.append(TD(_colspan=len(roles))) tr = TR(TD(SPAN(function["name"], _style="margin-left: 20px;"), _style="padding: 5px 5px 5px;"), _style="%s" % bg) for role in roles: if function["id"] in role["functions"]: tr.append( TD(IMG(_src=URL('static', 'images/check_green.png')), _style= "text-align:center;min-width: 50px;padding: 5px 0 5px;" )) else: tr.append( TD(IMG(_src=URL('static', 'images/check_grey.png')), _style= "text-align:center;min-width: 50px;padding: 5px 0 5px;" )) div_permission.append(tr) div_permission = TR(TD("Phân Quyền:"), TD(div_permission)) if grid.view_form: grid.view_form.element('table').insert( len(grid.view_form.element('table')), div_permission) if grid.update_form: grid.update_form.element('table').insert(-2, div_permission) if grid.create_form: grid.create_form.element('table').insert(-1, div_permission) js = SCRIPT(""" //alert('test'); //alert('test'); """) return dict(grid=grid + js)