plugins/*/*.js
plugins/*/*.html
# myslice.ini* is not intended to be under git as it may contain keys and other specifics
-myslice.ini*
-# other junk
+myslice.ini
+#other junk
foo.*
.project
+.settings
.pydevproject
-/sla/trashcan
\ No newline at end of file
+/sla/trashcan
--- /dev/null
+from django.conf.urls import patterns, url, include
+
+import forge.views
+
+urlpatterns = patterns('',
+ (r'^studentslabs/(?P<slicename>[^/]+)/?$', forge.views.CreateCourseViev.as_view())
+)
\ No newline at end of file
--- /dev/null
+from django.http import HttpResponse
+from rest import error
+import os,json
+import ConfigParser
+import string, random
+
+from portal.models import MeasurementsDB
+
+from manifold.core.query import Query, AnalyzedQuery
+from manifoldapi.manifoldapi import execute_query
+
+from influxdb import InfluxDBClient
+
+def createDatabase(request, slicename):
+ result = {}
+
+ Config = config(request)
+
+ server = Config.get('influxdb', 'server')
+ #port = Config.get('influxdb', 'port', 8086)
+ port = 8086
+ user = Config.get('influxdb', 'user')
+ password = Config.get('influxdb', 'password')
+
+ dbname = slicename
+ dbuser = request.user.username
+ dbpassword = generatePassword()
+
+ query = Query().get('user').filter_by('user_email', '==', dbuser).select('slices')
+ slices = execute_query(request, query)
+
+ if not slicename in slices:
+ result['status'] = 'fail'
+ result['message'] = 'no permissions'
+ return HttpResponse(json.dumps(result), content_type="application/json")
+
+ client = InfluxDBClient(server, port, user, password, dbname)
+
+ try :
+ client.create_database(dbname)
+ except Exception as e:
+ print e
+
+ # Add database user
+ try :
+ client.add_database_user(dbuser, dbpassword)
+ except Exception as e:
+ print e
+
+ # Make user a database admin
+ client.set_database_admin(dbuser)
+
+
+ # Insert an entry in the Influxdb table
+ i = MeasurementsDB(
+ backend = 'influxdb',
+ server = server,
+ port = port,
+ dbname = dbname,
+ dbuser = dbuser,
+ dbpassword = dbpassword
+ )
+ i.save()
+
+
+ result['status'] = 'ok'
+
+ return HttpResponse(json.dumps(result), content_type="application/json")
+
+def infoDatabase(request, slicename):
+ Config = config(request)
+
+ res = MeasurementsDB.objects.get(dbname=slicename, dbuser=request.user.username)
+ result = {
+ 'server' : res.server,
+ 'port' : res.port,
+ 'dbname' : res.dbname,
+ 'dbuser' : res.dbuser,
+ 'dbpassword' : res.dbpassword
+ }
+ return HttpResponse(json.dumps(result), content_type="application/json")
+
+def config(request):
+ Config = ConfigParser.ConfigParser()
+ Config.read(os.getcwd() + "/myslice/measurements.ini")
+
+ if not request.user.is_authenticated :
+ return HttpResponse(json.dumps({'error' : 'not authenticated'}), content_type="application/json")
+
+ #if Config.has_section('influxdb') :
+ if not Config.has_option('influxdb', 'server') :
+ return HttpResponse(json.dumps({'error' : 'server not specified'}), content_type="application/json")
+
+ if not Config.has_option('influxdb', 'user') :
+ return HttpResponse(json.dumps({'error' : 'user not specified'}), content_type="application/json")
+
+ if not Config.has_option('influxdb', 'password') :
+ return HttpResponse(json.dumps({'error' : 'server not specified'}), content_type="application/json")
+
+ return Config
+
+def generatePassword():
+ password_len = 16
+ password = []
+
+ for group in (string.ascii_letters, string.punctuation, string.digits):
+ password += random.sample(group, 3)
+
+ password += random.sample(
+ string.ascii_letters + string.punctuation + string.digits,
+ password_len - len(password))
+
+ random.shuffle(password)
+ password = ''.join(password)
+
+
+ return password
+
+
--- /dev/null
+from django.conf.urls import patterns, url, include
+
+urlpatterns = patterns('',
+ (r'^influxdb/create/(?P<slicename>[^/]+)/?$', 'influxdb.client.createDatabase'),
+ (r'^influxdb/info/(?P<slicename>[^/]+)/?$', 'influxdb.client.infoDatabase'),
+)
\ No newline at end of file
# Manifold API Python interface
-import copy, xmlrpclib
+import copy, xmlrpclib, ssl
from myslice.configengine import ConfigEngine
self.calls = {}
self.multicall = False
self.url = ConfigEngine().manifold_url()
- # for more debug on this link, set verbose=True
- self.server = xmlrpclib.Server(self.url, verbose=False, allow_none=True)
+
+ # Manifold uses a self signed certificate
+ # https://www.python.org/dev/peps/pep-0476/
+ if hasattr(ssl, '_create_unverified_context'):
+ self.server = xmlrpclib.Server(self.url, verbose=False, allow_none=True, context=ssl._create_unverified_context())
+ else :
+ self.server = xmlrpclib.Server(self.url, verbose=False, allow_none=True)
def __repr__ (self): return "ManifoldAPI[%s]"%self.url
--- /dev/null
+from django.conf.urls import include, url
+from myslice.configengine import ConfigEngine
+
+def list():
+ config = ConfigEngine()
+ return config.myslice.components.split(',')
+
+def urls():
+ u = []
+ for component in list():
+ try:
+ __import__(component)
+ u.append( url(r'^%s/' % component, include('%s.urls' % component)) )
+ except Exception, e:
+ print "-> Cannot load component (%s): %s" % (component, e)
+ else:
+ print "-> Loaded component %s" % component
+
+ return u
+
--- /dev/null
+[manifold]
+url = https://portal.onelab.eu:7080
+admin_user =
+admin_password =
+
+[myslice]
+theme = onelab
+debug = true
+httproot =
+dataroot =
+components = sla,influxdb,forge
+
+[database]
+# postgresql_psycopg2, mysql, sqlite3 or oracle
+engine = sqlite3
+name = myslice
+server =
+port =
+user =
+password =
+
+
+
+[activity]
+#server = http://athos.ipv6.lip6.fr/activity/push/log
+#apikey =
+#secret =
-# Django settings for unfold project.
+#from __future__ import print_function
+import os.path
-from __future__ import print_function
+try:
+ ROOT = os.path.realpath(os.path.dirname(__file__) + '/..')
+except:
+ import traceback
+ traceback.print_exc()
-import os.path
+import myslice.components as components
+from myslice.configengine import ConfigEngine
-import djcelery
-djcelery.setup_loader()
+# import djcelery
+# djcelery.setup_loader()
### detect if we're in a build environment
try:
except:
building=True
-DEBUG = True
+config = ConfigEngine()
-# show the various settings as we go
-DEBUG_SETTINGS = False
+if config.myslice.debug :
+ DEBUG = True
+else :
+ DEBUG = False
-# compute ROOT from where this file is installed
-# should fit every need including developers
-# but you can redefine ROOT if that's not working for you
-try:
- # get the directory where this file is
- ROOT=os.path.dirname(__file__) or '.'
- # move one step up
- ROOT=os.path.realpath(ROOT+'/..')
-except:
- # something is badly wrong here
- ROOT=None
- import traceback
- traceback.print_exc()
-
-#### this is where the problem lies I believe
-# first try to run manage.py collectstatic without this
# themes
-theme=None
-try:
- from myslice.configengine import ConfigEngine
- configEngine = ConfigEngine()
- if configEngine.myslice.theme :
- theme = configEngine.myslice.theme
-except:
- pass
-
-# find out HTTPROOT, which is different from ROOT
-# when deployed from a package
-# this code is run by collectstatic too, so we cannot
-# assume we have ./static present already
-HTTPROOT="/var/www/myslice/"
-# the place to store local data, like e.g. the sqlite db
-DATAROOT="/var/unfold"
-if not os.path.isdir(DATAROOT):
- print("WARNING: {} is a non-existing directory".format(DATAROOT))
- print("consequently we assume development mode and re-route DATAROOT to {}".format(ROOT))
- DATAROOT=ROOT
-# if not there, then we assume it's from a devel tree
-if not os.path.isdir (os.path.join(HTTPROOT,"static")):
- HTTPROOT=ROOT
-
-if not os.path.isdir(ROOT): raise Exception,"Cannot find ROOT %s for unfold"%ROOT
-if not os.path.isdir(HTTPROOT): raise Exception,"Cannot find HTTPROOT %s for unfold"%HTTPROOT
-
-if DEBUG_SETTINGS:
- print('ROOT', ROOT)
- print('DATAROOT', DATAROOT)
- print('HTTPROOT', HTTPROOT)
+if config.myslice.theme :
+ theme = config.myslice.theme
+else :
+ theme = None
+
+# HTTPROOT
+if config.myslice.httproot :
+ HTTPROOT = config.myslice.httproot
+else :
+ HTTPROOT = ROOT
+
+# DATAROOT
+if config.myslice.httproot :
+ DATAROOT = config.myslice.dataroot
+else :
+ DATAROOT = ROOT
+
# dec 2013 - we currently have 2 auxiliary subdirs with various utilities
# that we do not wish to package
# EMAIL_USE_TLS = False
# DEFAULT_FROM_EMAIL = 'testing@example.com'
-DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
- 'NAME': os.path.join(DATAROOT,'unfold.sqlite3'), # Or path to database file if using sqlite3.
- 'USER': '', # Not used with sqlite3.
- 'PASSWORD': '', # Not used with sqlite3.
- 'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
- 'PORT': '', # Set to empty string for default. Not used with sqlite3.
+if config.database :
+ DATABASES = {
+ 'default': {
+ 'ENGINE' : 'django.db.backends.%s' % config.database.engine,
+ 'USER' : config.database.user or '',
+ 'PASSWORD' : config.database.password or '',
+ 'HOST' : config.database.host or '',
+ 'PORT' : config.database.port or '',
+ }
}
-}
-
-if DEBUG_SETTINGS:
- print('DATABASE NAME',DATABASES['default']['NAME'])
-
+ if config.database.engine == 'sqlite3' :
+ DATABASES['default']['NAME'] = os.path.join(DATAROOT,'%s.sqlite3' % config.database.name)
+ else :
+ DATABASES['default']['NAME'] = config.database.name
+else :
+ # default database is sqlite
+ DATABASES = {
+ 'default': {
+ 'ENGINE' : 'django.db.backends.sqlite3',
+ 'NAME' : os.path.join(DATAROOT,'myslice.sqlite3'),
+ 'USER' : '',
+ 'PASSWORD' : '',
+ 'HOST' : '',
+ 'PORT' : '',
+ }
+ }
+print DATABASES
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'unfold.wsgi.application'
-TEMPLATE_DIRS = [ ]
+TEMPLATE_DIRS = []
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
if theme is not None:
- TEMPLATE_DIRS.append ( os.path.join(HTTPROOT,"portal/templates", theme))
-TEMPLATE_DIRS.append ( os.path.join(HTTPROOT,"portal/templates"))
-TEMPLATE_DIRS.append ( os.path.join(HTTPROOT,"templates"))
+ TEMPLATE_DIRS.append( os.path.join(HTTPROOT,"portal/templates", theme) )
+TEMPLATE_DIRS.append( os.path.join(HTTPROOT,"portal/templates") )
+TEMPLATE_DIRS.append( os.path.join(HTTPROOT,"templates") )
INSTALLED_APPS = [
'django.contrib.auth',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# FORGE Plugin app
- 'djcelery',
- 'forge',
+# 'djcelery',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
'portal',
- # SLA
- 'sla',
]
# this app won't load in a build environment
if not building: INSTALLED_APPS.append ('rest')
+for component in components.list() :
+ INSTALLED_APPS.append(component)
+
BROKER_URL = "amqp://myslice:myslice@localhost:5672/myslice"
for aux in auxiliaries:
from django.conf import settings
from django.contrib import admin
+##
+# components module
+##
+import components
+
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
from settings import auxiliaries, INSTALLED_APPS
+import portal.about
+import portal.institution
+import portal.registrationview
+import portal.accountview
+import portal.contactview
+import portal.termsview
+import portal.supportview
+
import portal.platformsview
import portal.dashboardview
import portal.homeview
import portal.newsview
import portal.loginwidget
-from portal.about import AboutView
-from portal.registrationview import RegistrationView
-from portal.accountview import AccountView, account_process
-from portal.institution import InstitutionView
-
-from portal.supportview import SupportView
-from portal.contactview import ContactView
-
-from portal.termsview import TermsView
-
-home_view=portal.homeview.HomeView.as_view()
-dashboard_view=portal.dashboardview.DashboardView.as_view()
platforms_view=portal.platformsview.PlatformsView.as_view()
#import portal.testbedlist
import portal.managementtababout
import portal.managementtabrequests
-import forge.views
-
-#### high level choices
-# main entry point (set to the / URL)
-# beware that if this view is broken you end up in an endless cycle...
-# maybe platforms_view would be best on the longer run
-the_default_view=home_view
-# where to be redirected after login
-the_after_login_view=dashboard_view
-# where to redirect when login is required
-# might need another one ?
-the_login_view=home_view
-admin.autodiscover()
urls = [
'',
# Examples:
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
- url(r'^admin/', include(admin.site.urls)),
+ url(r'^admin/', include(admin.site.urls)),
#
# default / view
- (r'^/?$', the_default_view),
+ (r'^/?$', portal.homeview.HomeView.as_view()),
#
# login / logout
- (r'^login-ok/?$', the_after_login_view, {'state': 'Welcome to MySlice'} ),
+ (r'^login-ok/?$', portal.dashboardview.DashboardView.as_view(), {'state': 'Welcome to MySlice'} ),
#
# seems to be what login_required uses to redirect ...
- (r'^accounts/login/$', the_login_view),
- (r'^login/?$', the_login_view),
+ (r'^accounts/login/$', portal.homeview.HomeView.as_view()),
+ (r'^login/?$', portal.homeview.HomeView.as_view()),
(r'^logout/?$', 'auth.views.logout_user'),
#
# the manifold proxy
(r'^testbeds/(?P<slicename>[^/]+)/?$', portal.slicetabtestbeds.SliceTabTestbeds.as_view()),
(r'^measurements/(?P<slicename>[^/]+)/?$', portal.slicetabmeasurements.SliceTabMeasurements.as_view()),
(r'^experiment/(?P<slicename>[^/]+)/?$', portal.slicetabexperiment.ExperimentView.as_view()),
- (r'^studentslabs/(?P<slicename>[^/]+)/?$', forge.views.CreateCourseViev.as_view()),
- url(r'^about/?$', AboutView.as_view(), name='about'),
- url(r'^institution/?$', InstitutionView.as_view(), name='institution'),
+ url(r'^about/?$', portal.about.AboutView.as_view(), name='about'),
+
+ url(r'^institution/?$', portal.institution.InstitutionView.as_view(), name='institution'),
(r'^management/requests/?$', portal.managementtabrequests.ManagementRequestsView.as_view()),
(r'^management/about/?$', portal.managementtababout.ManagementAboutView.as_view()),
#
- url(r'^register/?$', RegistrationView.as_view(), name='registration'),
- url(r'^account/?$', AccountView.as_view(), name='account'),
- url(r'^account/account_process/?$', account_process),
- url(r'^contact/?$', ContactView.as_view(), name='contact'),
- url(r'^terms/?$', TermsView.as_view(), name='terms'),
- url(r'^support/?$', SupportView.as_view(), name='support'),
+ url(r'^register/?$', portal.registrationview.RegistrationView.as_view(), name='registration'),
+ url(r'^account/?$', portal.accountview.AccountView.as_view(), name='account'),
+ url(r'^account/account_process/?$', portal.accountview.account_process),
+ url(r'^contact/?$', portal.contactview.ContactView.as_view(), name='contact'),
+ url(r'^terms/?$', portal.termsview.TermsView.as_view(), name='terms'),
+ url(r'^support/?$', portal.supportview.SupportView.as_view(), name='support'),
#
url(r'^portal/', include('portal.urls')),
# url(r'^sla/', include('sla.urls')),
]
+urls.extend( components.urls() )
+
#this one would not match the convention
# url(r'^debug/', include('debug_platform.urls')),
# but it was commented out anyways
for aux in auxiliaries:
if aux in INSTALLED_APPS:
- urls.append ( url ( r'^%s/'%aux, include ('%s.urls'%aux )))
+ urls.append ( url ( r'^%s/'%aux, include ('%s.urls' % aux )))
urlpatterns = patterns(*urls)
}
- $scope._dump_leases();
+ //$scope._dump_leases();
};
$scope._dump_leases = function()
+++ /dev/null
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
- def forwards(self, orm):
- # Adding model 'Institution'
- db.create_table(u'portal_institution', (
- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('name', self.gf('django.db.models.fields.TextField')()),
- ))
- db.send_create_signal(u'portal', ['Institution'])
-
- # Adding model 'PendingUser'
- db.create_table(u'portal_pendinguser', (
- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('first_name', self.gf('django.db.models.fields.TextField')()),
- ('last_name', self.gf('django.db.models.fields.TextField')()),
- ('email', self.gf('django.db.models.fields.EmailField')(max_length=75)),
- ('password', self.gf('django.db.models.fields.TextField')()),
- ('user_hrn', self.gf('django.db.models.fields.TextField')()),
- ('public_key', self.gf('django.db.models.fields.TextField')()),
- ('private_key', self.gf('django.db.models.fields.TextField')()),
- ('authority_hrn', self.gf('django.db.models.fields.TextField')()),
- ('login', self.gf('django.db.models.fields.TextField')()),
- ('pi', self.gf('django.db.models.fields.TextField')()),
- ('email_hash', self.gf('django.db.models.fields.TextField')()),
- ('status', self.gf('django.db.models.fields.TextField')()),
- ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
- ))
- db.send_create_signal(u'portal', ['PendingUser'])
-
- # Adding model 'PendingAuthority'
- db.create_table(u'portal_pendingauthority', (
- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('site_name', self.gf('django.db.models.fields.TextField')()),
- ('site_authority', self.gf('django.db.models.fields.TextField')()),
- ('site_abbreviated_name', self.gf('django.db.models.fields.TextField')()),
- ('site_url', self.gf('django.db.models.fields.TextField')()),
- ('site_latitude', self.gf('django.db.models.fields.TextField')()),
- ('site_longitude', self.gf('django.db.models.fields.TextField')()),
- ('address_line1', self.gf('django.db.models.fields.TextField')()),
- ('address_line2', self.gf('django.db.models.fields.TextField')()),
- ('address_line3', self.gf('django.db.models.fields.TextField')()),
- ('address_city', self.gf('django.db.models.fields.TextField')()),
- ('address_postalcode', self.gf('django.db.models.fields.TextField')()),
- ('address_state', self.gf('django.db.models.fields.TextField')()),
- ('address_country', self.gf('django.db.models.fields.TextField')()),
- ('authority_hrn', self.gf('django.db.models.fields.TextField')()),
- ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
- ))
- db.send_create_signal(u'portal', ['PendingAuthority'])
-
- # Adding model 'PendingSlice'
- db.create_table(u'portal_pendingslice', (
- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('slice_name', self.gf('django.db.models.fields.TextField')()),
- ('user_hrn', self.gf('django.db.models.fields.TextField')()),
- ('authority_hrn', self.gf('django.db.models.fields.TextField')(null=True)),
- ('number_of_nodes', self.gf('django.db.models.fields.TextField')(default=0)),
- ('type_of_nodes', self.gf('django.db.models.fields.TextField')(default='NA')),
- ('purpose', self.gf('django.db.models.fields.TextField')(default='NA')),
- ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
- ))
- db.send_create_signal(u'portal', ['PendingSlice'])
-
- # Adding model 'PendingProject'
- db.create_table(u'portal_pendingproject', (
- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('project_name', self.gf('django.db.models.fields.TextField')()),
- ('user_hrn', self.gf('django.db.models.fields.TextField')()),
- ('email', self.gf('django.db.models.fields.TextField')()),
- ('authority_hrn', self.gf('django.db.models.fields.TextField')(null=True)),
- ('purpose', self.gf('django.db.models.fields.TextField')(default='NA')),
- ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
- ))
- db.send_create_signal(u'portal', ['PendingProject'])
-
- # Adding model 'PendingJoin'
- db.create_table(u'portal_pendingjoin', (
- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('user_hrn', self.gf('django.db.models.fields.TextField')()),
- ('email', self.gf('django.db.models.fields.TextField')()),
- ('project_name', self.gf('django.db.models.fields.TextField')(null=True)),
- ('authority_hrn', self.gf('django.db.models.fields.TextField')()),
- ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
- ))
- db.send_create_signal(u'portal', ['PendingJoin'])
-
-
- def backwards(self, orm):
- # Deleting model 'Institution'
- db.delete_table(u'portal_institution')
-
- # Deleting model 'PendingUser'
- db.delete_table(u'portal_pendinguser')
-
- # Deleting model 'PendingAuthority'
- db.delete_table(u'portal_pendingauthority')
-
- # Deleting model 'PendingSlice'
- db.delete_table(u'portal_pendingslice')
-
- # Deleting model 'PendingProject'
- db.delete_table(u'portal_pendingproject')
-
- # Deleting model 'PendingJoin'
- db.delete_table(u'portal_pendingjoin')
-
-
- models = {
- u'portal.institution': {
- 'Meta': {'object_name': 'Institution'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.TextField', [], {})
- },
- u'portal.pendingauthority': {
- 'Meta': {'object_name': 'PendingAuthority'},
- 'address_city': ('django.db.models.fields.TextField', [], {}),
- 'address_country': ('django.db.models.fields.TextField', [], {}),
- 'address_line1': ('django.db.models.fields.TextField', [], {}),
- 'address_line2': ('django.db.models.fields.TextField', [], {}),
- 'address_line3': ('django.db.models.fields.TextField', [], {}),
- 'address_postalcode': ('django.db.models.fields.TextField', [], {}),
- 'address_state': ('django.db.models.fields.TextField', [], {}),
- 'authority_hrn': ('django.db.models.fields.TextField', [], {}),
- 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'site_abbreviated_name': ('django.db.models.fields.TextField', [], {}),
- 'site_authority': ('django.db.models.fields.TextField', [], {}),
- 'site_latitude': ('django.db.models.fields.TextField', [], {}),
- 'site_longitude': ('django.db.models.fields.TextField', [], {}),
- 'site_name': ('django.db.models.fields.TextField', [], {}),
- 'site_url': ('django.db.models.fields.TextField', [], {})
- },
- u'portal.pendingjoin': {
- 'Meta': {'object_name': 'PendingJoin'},
- 'authority_hrn': ('django.db.models.fields.TextField', [], {}),
- 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
- 'email': ('django.db.models.fields.TextField', [], {}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'project_name': ('django.db.models.fields.TextField', [], {'null': 'True'}),
- 'user_hrn': ('django.db.models.fields.TextField', [], {})
- },
- u'portal.pendingproject': {
- 'Meta': {'object_name': 'PendingProject'},
- 'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
- 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
- 'email': ('django.db.models.fields.TextField', [], {}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'project_name': ('django.db.models.fields.TextField', [], {}),
- 'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
- 'user_hrn': ('django.db.models.fields.TextField', [], {})
- },
- u'portal.pendingslice': {
- 'Meta': {'object_name': 'PendingSlice'},
- 'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
- 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
- 'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
- 'slice_name': ('django.db.models.fields.TextField', [], {}),
- 'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
- 'user_hrn': ('django.db.models.fields.TextField', [], {})
- },
- u'portal.pendinguser': {
- 'Meta': {'object_name': 'PendingUser'},
- 'authority_hrn': ('django.db.models.fields.TextField', [], {}),
- 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
- 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
- 'email_hash': ('django.db.models.fields.TextField', [], {}),
- 'first_name': ('django.db.models.fields.TextField', [], {}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'last_name': ('django.db.models.fields.TextField', [], {}),
- 'login': ('django.db.models.fields.TextField', [], {}),
- 'password': ('django.db.models.fields.TextField', [], {}),
- 'pi': ('django.db.models.fields.TextField', [], {}),
- 'private_key': ('django.db.models.fields.TextField', [], {}),
- 'public_key': ('django.db.models.fields.TextField', [], {}),
- 'status': ('django.db.models.fields.TextField', [], {}),
- 'user_hrn': ('django.db.models.fields.TextField', [], {})
- }
- }
-
- complete_apps = ['portal']
\ No newline at end of file
# REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2
authorities_query = Query.get('authority').select('name', 'authority_hrn')
authorities = execute_admin_query(wsgi_request, authorities_query)
+ print "RegistrationView authorities = ", authorities
if authorities is not None:
- authorities = sorted(authorities, key=lambda k: k['authority_hrn'])
- authorities = sorted(authorities, key=lambda k: k['name'])
+ # Remove the root authority from the list
+ matching = [s for s in authorities if "." in s['authority_hrn']]
+ authorities = sorted(matching, key=lambda k: k['authority_hrn'])
+ authorities = sorted(matching, key=lambda k: k['name'])
print "############ BREAKPOINT 1 #################"
# Page rendering
-<img src="http://www.fed4fire.eu/uploads/media/fed4fire-logo.jpg">
+<img src="http://doc.fed4fire.eu/_static/fed4fire-logo.jpg">
<br>
-<h1>You have registered to {{current_site}}</h1>
-<br>
-<h1>Please validate your email address by clicking the following link</h1>
-<br>
-<a href={{validation_link}}>{{validation_link}}</a>
+<p>We have received a user signup request for your email address at {{current_site}}</p>
+<p>You have the following user details:</p>
+
+First name: {{first_name}}<br>
+Last name: {{last_name}}<br>
+Email: {{email}}<br>
+
+<p></p>
+<p>
+You may now <a href="http://{{current_site}}">log</a> in to the portal using your email address and the password that you provided, but your access will be limited. To gain full access, two steps are required:
+</p>
+<ul style="list-style-type:decimal;">
+<li>
+You must confirm that you have indeed made this request by clicking on the following link: <br>
+ <a href={{validation_link}}>{{validation_link}}</a>
+ <ul><li>If you did not make this request, we apologise. You may disregard this email or you may advise us the error by replying to this email.</li></ul>
+</li>
+<li>
+A manager from your organization must also validate your request. Upon confirmation of your signup request, we will send an email to the managers at your organization with a validation request.
+</li>
+</ul>
+<p>
+We look forward to welcoming you to Fed4FIRE portal. You will find answers to frequently asked questions <a href="http://{{current_site}}/support/">here</a>.
+Please don't hesitate to <a href="http://{{current_site}}/contact/">contact us</a> with any additional questions that you might have.
+</p>
-<img src="http://www.fed4fire.eu/uploads/media/fed4fire-logo.jpg">
+<img src="http://doc.fed4fire.eu/_static/fed4fire-logo.jpg">
<br>
<b>Email :</b> {{email}}
title="Choose your organization (company/university) from the list that apears when you click in the field and start to type.
Use the arrow keys to scroll through the list; type part of the name to narrow down the list. We will send an email to
the managers that we have on record for your organization, asking them to validate your sign-up request." required>
+ <option value="">select an organization</option>
{% if authorities %}
{% for authority in authorities %}
{% if authority.name %}
<label for="password" class="control-label">Authentication</label>
</p>
<p>
- <input type="password" id="password" name="password" class="form-control" style="width:250px" minlength="4" value="{{ password }}" title="Your password allows you to log in to this portal." placeholder="Password" required />
+ <input type="password" id="password" name="password" class="form-control" style="width:250px" minlength="8" value="{{ password }}" title="Your password allows you to log in to this portal." placeholder="Password" required />
</p>
<p>
- <input type="password" id="confirmpassword" name="confirmpassword" style="width:250px" minlength="4" class="form-control" value="" placeholder="Confirm password" required />
+ <input type="password" id="confirmpassword" name="confirmpassword" style="width:250px" minlength="8" class="form-control" value="" placeholder="Confirm password" required />
</p>
<p>
<select name="question" class="form-control" style="width:350px" id="key-policy"
-<img src="http://www.fed4fire.eu/uploads/media/fed4fire-logo.jpg">
+<img src="http://doc.fed4fire.eu/_static/fed4fire-logo.jpg">
<br>
<p>Dear Fed4FIRE user,</p>
<p></p>
-<img src="http://www.fed4fire.eu/uploads/media/fed4fire-logo.jpg">
+<img src="http://doc.fed4fire.eu/_static/fed4fire-logo.jpg">
<br>
<h1>NEW SLICE REQUEST</h1>
<br>
-<img src="http://www.fed4fire.eu/uploads/media/fed4fire-logo.jpg">
+<img src="http://doc.fed4fire.eu/_static/fed4fire-logo.jpg">
<br>
<p>Dear Fed4FIRE user,</p>
<p></p>
-<img src="http://www.fed4fire.eu/uploads/media/fed4fire-logo.jpg">
+<img src="http://doc.fed4fire.eu/_static/fed4fire-logo.jpg">
<br>
<p>Dear {{first_name}} {{last_name}},</p>
<p></p>
-<img src="http://www.fed4fire.eu/uploads/media/fed4fire-logo.jpg">
+<img src="http://doc.fed4fire.eu/_static/fed4fire-logo.jpg">
<br>
<h1>NEW USER REQUEST</h1>
<br>
-<img src="http://www.fed4fire.eu/uploads/media/fed4fire-logo.jpg">
+<img src="http://doc.fed4fire.eu/_static/fed4fire-logo.jpg">
<br>
<p>Dear {{first_name}} {{last_name}},</p>
<p></p>
title="Choose your organization (company/university) from the list that apears when you click in the field and start to type.
Use the arrow keys to scroll through the list; type part of the name to narrow down the list. We will send an email to
the managers that we have on record for your organization, asking them to validate your sign-up request." required>
+ <option value="">select an organization</option>
{% if authorities %}
{% for authority in authorities %}
{% if authority.name %}
- {% if authority.authority_hrn == authority_hrn %}
- <option value="{{ authority.authority_hrn }}" selected>{{authority.name}}</option>
- {% else %}
<option value="{{ authority.authority_hrn }}">{{authority.name}}</option>
- {% endif %}
{% else %}
- {% if authority.authority_hrn == authority_hrn %}
- <option value="{{ authority.authority_hrn }}" selected>{{authority.authority_hrn}}</option>
- {% else %}
<option value="{{ authority.authority_hrn }}">{{authority.authority_hrn}}</option>
- {% endif %}
{% endif %}
{% endfor %}
{% else %}
{% if authorities %}
{% for authority in authorities %}
{% if authority.name %}
- {% if authority.authority_hrn == authority_hrn %}
- <option value="{{ authority.authority_hrn }}" selected>{{authority.name}}</option>
- {% else %}
<option value="{{ authority.authority_hrn }}">{{authority.name}}</option>
- {% endif %}
{% else %}
- {% if authority.authority_hrn == authority_hrn %}
- <option value="{{ authority.authority_hrn }}" selected>{{authority.authority_hrn}}</option>
- {% else %}
<option value="{{ authority.authority_hrn }}">{{authority.authority_hrn}}</option>
{% endif %}
{% endif %}