#
# Activity monitor
#
+# Client is authenticated with an API key and a secret
+# The API key is a 64 chars string (digits and letters) that is passed to the request
+# The secret is a 64 chars string that is used to sign the request
+# The generated signature is a SHA256 hes digest
import urllib, urllib2
import threading
-from datetime import datetime
+import hmac
+import hashlib
+import base64
+import time
+import datetime
+from myslice.configengine import ConfigEngine
+config = ConfigEngine()
+if config.activity and config.activity.apikey :
+ apikey = config.activity.apikey
+else :
+ # apikey will be necessary
+ apikey = None
+
+if config.activity and config.activity.secret :
+ secret = config.activity.secret
+else :
+ # secret will be necessary
+ secret = None
+
+if config.activity and config.activity.server :
+ server = config.activity.server
+else :
+ # secret will be necessary
+ server = "http://athos.ipv6.lip6.fr/log"
def logWrite(request, action, message):
- url = "http://localhost:5000/log"
+
+ if not apikey :
+ print "===============>> activity: no apikey"
+ return
+ if not secret :
+ print "===============>> activity: no secret"
+ return
+
+ timestamp = time.mktime(datetime.datetime.today().timetuple())
+ ip = getClientIp(request)
log = {
- "date" : datetime.today(),
- "client_ip" : getClientIp(request),
- "host" : request.get_host(),
- "referrer" : request.META.get('HTTP_REFERER'),
- "user" : request.user
+ "timestamp" : timestamp,
+ "client_ip" : ip,
+ "host" : request.get_host(),
+ "referrer" : request.META.get('HTTP_REFERER'),
+ "user" : request.user,
+ "action" : action,
+ "message" : message,
+ "apikey" : apikey,
+ "signature" : sign(secret, "%s%s%s%s" % (timestamp, ip, request.user, action))
}
-
try :
- result = urllib2.urlopen(url, urllib.urlencode(log))
+ result = urllib2.urlopen(server, urllib.urlencode(log))
content = result.read()
except urllib2.URLError as e:
- print "Error: connection to " + url + " impossible, logging disabled"
+ print "Warning: connection to " + url + " impossible, could not log action"
-def spawnThread(request, action, message):
- print "aaaaaaaaa"
+def log(request, action, message):
# Create a new thread in Daemon mode to send the log entry
t = threading.Thread(target=logWrite, args=(request, action, message))
t.setDaemon(True)
t.start()
-def userLogin(request):
- spawnThread(request, 'userlogin', 'User logged in')
-
-def userLogout(request):
- spawnThread(request, 'userlogout', 'User logged out')
-
-def userRegistration(request):
- spawnThread(request, 'userregistration', 'User registered')
-
-def userSliceRequest(request):
- spawnThread(request, 'userslicerequest', 'User requested a slice')
-
-def userContactSupport(request):
- spawnThread(request, 'usercontactsupport', 'User contacted suppport')
-
-def userAddResource(request):
- spawnThread(request, 'useraddresource', 'User added resource to slice')
-
-def userDelResource(request):
- spawnThread(request, 'userdelresource', 'User removed resource from slice')
-
-
def getClientIp(request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
- return ip
\ No newline at end of file
+ return ip
+
+#
+# sign the request with the secret key
+def sign(secret, message):
+ return hmac.new(secret, msg=message, digestmod=hashlib.sha256).hexdigest()
\ No newline at end of file
--- /dev/null
+#
+# log functions for user activity
+#
+
+import activity
+
+def login(request):
+ activity.log(request, "user.login", "User log in")
+
+def logout(request):
+ activity.log(request, "user.logout", "User log out")
+
+def signup(request):
+ activity.log(request, "user.signup", "User sign up")
+
+def register(request):
+ activity.log(request, "user.register", "User registered")
\ No newline at end of file
from django.contrib.auth import logout
from django.http import HttpResponseRedirect
+import activity.user
+
# hard question : where should we redirect requests to logout if user is not logged in ?
def logout_user (request):
# check that we're indeed logged in
if not request.user.is_authenticated():
return HttpResponseRedirect ('/')
print "LOGGING OUT"
+
+ # log user activity
+ activity.user.logout(request)
+
logout(request)
return HttpResponseRedirect ('/')
url = https://localhost:7080
admin_user = admin
admin_password = admin
+
+[myslice]
+theme = onelab
def template(self):
# Load a template from the theme directory if it exists
# else load it from the common templates dir
- print "THEME = ",self.theme
- print "TEMPLATE = ",self.template_name
- print "TEMPLATE_DIRS = ",TEMPLATE_DIRS
+ #print "THEME = ",self.theme
+ #print "TEMPLATE = ",self.template_name
+ #print "TEMPLATE_DIRS = ",TEMPLATE_DIRS
filename = self.theme + '_' + self.template_name
- print any(os.path.exists(os.path.join(d,filename)) for d in TEMPLATE_DIRS)
- print (os.path.exists(os.path.join(d,filename)) for d in TEMPLATE_DIRS)
+ #print any(os.path.exists(os.path.join(d,filename)) for d in TEMPLATE_DIRS)
+ #print (os.path.exists(os.path.join(d,filename)) for d in TEMPLATE_DIRS)
if any(os.path.exists(os.path.join(d,filename)) for d in TEMPLATE_DIRS):
return filename
else:
import portal.homeview
import portal.newsview
+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
(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()),
- #
+
+ url(r'^about/?$', AboutView.as_view(), name='about'),
+
+ url(r'^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'^portal/', include('portal.urls')),
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="{{domid}}__apply__label">
- Applying pending changes...
-
- <img id="applyloading" src="/static/img/loading.gif" />
+ Applying pending changes...
</h4>
<div>
+ <img id="applyloading" src="/static/img/loading.gif" />
Please be patient, this operation can take a minute or two.
</div>
</div>
<!-- Button toolbar -->
- <button class="btn btn-onelab btn-sm" id="{{domid}}__apply" data-toggle="modal" data-target="#{{domid}}__apply__window">Apply</button>
+ <button class="btn btn-onelab btn-apply" id="{{domid}}__apply" data-toggle="modal" data-target="#{{domid}}__apply__window">Apply</button>
<!-- <button class="btn btn-default btn-sm" id="{{domid}}__cancel">Cancel</button> -->
</div>
<table class="table dataTable" id="{{domid}}__table" width="100%">
<thead>
<tr>
- {% if checkboxes %}<th class="checkbox"><input type="checkbox" disabled/></th>{% endif %}
+ {% if checkboxes %}<th><input type="checkbox" disabled/></th>{% endif %}
<th>⚠</th>
{% for column, field in columns.items %} <th>{{ column }}</th> {% endfor %}
{% for column, field in hidden_columns.items %} <th>{{ column }}</th> {% endfor %}
var num_hidden_cells;\r
\r
$("#DateToRes").datepicker({\r
+ dateFormat: "D, d M yy",\r
onRender: function(date) {\r
return date.valueOf() < now.valueOf() ? 'disabled' : '';\r
}\r
</div>\r
<div id="plugin-{{ domid }}" class="">\r
<div class="row m-b">\r
- <div class="col-md-2">\r
- <label for="inputEmail3" class="col-sm-2 control-label">Day:</label>\r
- </div>\r
- <div class="col-md-10">\r
- <label for="inputEmail3" class="col-sm-2 control-label">Time of day:</label>\r
- </div>\r
- </div>\r
- <div class="row m-b">\r
- <div class="col-md-2">\r
- <input id="DateToRes" type="text" placeholder="Reservation Date">\r
- <!-- <input id="DateToRes" type="text" class="form-control" placeholder="Reservation Date"> -->\r
- <span class="glyphicon glyphicon-calendar"></span>\r
+ <div class="col-md-4">\r
+ <div class="row">\r
+ <div class="col-md-1">\r
+ <label for="inputEmail3" class="control-label">Day:</label>\r
+ </div>\r
+ <div class="col-md-11">\r
+ <input id="DateToRes" type="text" placeholder="Reservation Date">\r
+ <span class="glyphicon glyphicon-calendar" style="position:absolute;margin-left:-20px;margin-top:4px;"></span>\r
+ <!-- <input id="DateToRes" type="text" class="form-control" placeholder="Reservation Date"> -->\r
+ </div>\r
+ </div>\r
</div>\r
- <div class="col-md-10">\r
- <div class="sliderContainer">\r
- <div id="tblSlider"></div>\r
+ <div class="col-md-8">\r
+ <div class="row">\r
+ <div class="col-md-2">\r
+ <label for="inputEmail3" class="control-label">Time of day:</label>\r
+ </div>\r
+ <div class="col-md-10">\r
+ <div class="sliderContainer">\r
+ <div id="tblSlider"></div>\r
+ </div>\r
+ </div>\r
</div>\r
</div>\r
</div>\r
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.shortcuts import render
+
import json
from unfold.loginrequired import FreeAccessView
from myslice.theme import ThemeView
+import activity.user
+
class HomeView (FreeAccessView, ThemeView):
template_name = 'home-view.html'
env['person'] = self.request.user
env['username'] = self.request.user
+ # log user activity
+ activity.user.login(self.request)
+
## check user is pi or not
platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config')
from myslice.theme import ThemeView
import json
-import activity
-
class ManagementAboutView (FreeAccessView, ThemeView):
template_name = 'management-tab-about.html'
def get (self, request):
- activity.userLogin(request)
-
if request.user.is_authenticated():
user_query = Query().get('user').select('user_hrn','parent_authority').filter_by('user_hrn','==','$user_hrn')
user_details = execute_query(self.request, user_query)
from django.views.generic import View
from django.template.loader import render_to_string
+
from django.shortcuts import render
from django.contrib.auth import get_user_model
from django.contrib.sites.models import Site
from myslice.theme import ThemeView
+import activity.user
+
# since we inherit from FreeAccessView we cannot redefine 'dispatch'
# so let's override 'get' and 'post' instead
#
if authorities is not None:
authorities = sorted(authorities)
+ print "############ BREAKPOINT 1 #################"
# Page rendering
page = Page(wsgi_request)
page.add_js_files ( [ "js/jquery.validate.js", "js/my_account.register.js", "js/jquery.qtip.min.js","js/jquery-ui.js" ] )
page.add_css_files ( [ "css/onelab.css", "css/registration.css", "css/jquery.qtip.min.css" ] )
page.add_css_files ( [ "https://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" ] )
-
+ print "############ BREAKPOINT 2 #################"
if method == 'POST':
reg_form = {}
# The form has been submitted
# get the domain url
current_site = Site.objects.get_current()
current_site = current_site.domain
-
+
+ print "############ BREAKPOINT 3 #################"
+
for authority in authorities:
if authority['name'] == wsgi_request.POST.get('org_name', ''):
authority_hrn = authority['authority_hrn']
# Handle the case when the template uses only hrn and not name
if authority_hrn is None:
authority_hrn = wsgi_request.POST.get('org_name', '')
-
+
+ print "############ BREAKPOINT 4 #################"
+
post_email = wsgi_request.POST.get('email','').lower()
salt = randint(1,100000)
email_hash = md5(str(salt)+post_email).hexdigest()
'pi' : '',
'validation_link': 'http://' + current_site + '/portal/email_activation/'+ email_hash
}
-
+
+ print "############ BREAKPOINT 5 #################"
+
# Construct user_hrn from email (XXX Should use common code)
split_email = user_request['email'].split("@")[0]
split_email = split_email.replace(".", "_")
if not errors:
create_pending_user(wsgi_request, user_request, user_detail)
self.template_name = 'user_register_complete.html'
+ # log user activity
+ activity.user.register(self.request)
return render(wsgi_request, self.template, {'theme': self.theme})
else:
+ print "############ BREAKPOINT A #################"
user_request = {}
## this is coming from onelab website onelab.eu
reg_form = {
'last_name': wsgi_request.GET.get('last_name', ''),
'email': wsgi_request.GET.get('email', ''),
}
+ # log user activity
+ activity.user.signup(self.request)
+ print "############ BREAKPOINT B #################"
template_env = {
'topmenu_items': topmenu_items_live('Register', page),
template_env.update(user_request)
template_env.update(reg_form)
template_env.update(page.prelude_env ())
+ print "############ BREAKPOINT C #################"
return render(wsgi_request, self.template,template_env)
color:gray;
font-size:10pt;
}
+div.breadcrumbs a {
+ color:gray;
+}
+div.breadcrumbs a:hover {
+ text-decoration:underline;
+}
.tab-pane {
padding-top:15px;
}
padding:2px 4px;
-moz-border-radius: 4px;
border-radius: 4px;
- width:125px;
+ width:105px;
+ margin-left:4px;
+ margin-bottom:8px;
text-align: center;
}
a.sl-resources.active, a.sl-resources.active:hover, a.sl-resources.active:focus {
-moz-border-radius: 4px;
border-radius: 4px;
}
-
+a.sl-resources:first-child {
+ margin-left:12px;
+}
+button.btn-apply {
+ font-size:13px;
+ padding:2px 8px;
+}
div#slice-info {
margin-top:25px;
}
padding:3px 5px;
}
.slice-pending button.apply {
+ font-size:14px;
+ padding:2px 5px;
}
.slice-pending button.clear {
}
div.secondary .account a {
color:black;
}
+
+
+div.footer {
+ padding-top:15px;
+
+}
+div.footer div.bottom {
+ position:absolute;
+ bottom:0;
+}
+div.footer ul {
+ margin:6px 0 0 0;
+ padding:0;
+}
+
+div.footer li {
+ font-size:9pt;
+ display:inline;
+ list-style:none;
+ margin:0px;
+ padding:0;
+ margin-right:15px;
+ color:#747474;
+ letter-spacing:0.4px;
+}
+
+div.footer li a {
+ color:#747474;
+}
+div.footer li a:hover {
+ text-decoration:underline;
+}
+div.copy {
+ font-size:8pt;
+ color:gray;
+ padding-top:15px;
+ padding-bottom:15px;
+}
+
div.home {
font-size:11pt;
line-height:1.2em;
padding-top:60px;
text-shadow: 1px 1px #013540;
}
+
+th {
+ border:0 !important;
+}
{% block topmenu %}
{% widget "_widget-topmenu.html" %}
{% endblock topmenu %}
- {% include 'messages-transient.html' %}
{% block base_content %}
{% endblock %}
{% endblock container %}
+<div class="footer">
+<div class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <ul>
+ <li><a href="/terms">Terms and Conditions</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-12 copy">
+ Copyright © UPMC Sorbonne Universités, on behalf of the OneLab consortium
+ </div>
+ </div>
+</div>
+</div>
<div class="loading">
<div><img src="{{ STATIC_URL }}/img/loading.gif" /> Loading...</div>
<div> </div>
</script>
<div class="col-md-12">
- <h2>Authorities</h2>
+ <h2>From your authorities</h2>
</div>
{% if my_authorities %}
{% endif %}
<br />
<div class="col-md-12">
- <h2>Sub-Authorities</h2>
+ <h2>From your sub-authorities</h2>
</div>
{% if sub_authorities %}
{% endif %}
<br />
<div class="col-md-12">
- <h2>Authorities with delegation</h2>
+ <h2>From your authorities with delegation</h2>
</div>
{% if delegation_authorities %}
-{% extends "layout.html" %}
+{% extends "layout_wide.html" %}
{% block content %}
-<div class="row">
- <div class="col-md-12">
- <div class="breadcrumbs">
- </div>
- </div>
-</div>
-<div class="row">
- <div class="col-md-12">
- <ul class="nav nav-tabs nav-section">
- <li class="active"><a href="#about">About</a></li>
- <li><a href="#components">Underlying technologies</a></li>
- </ul>
+<div class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <h1><img src="{{ STATIC_URL }}icons/support-xs.png" alt="About" />About</h1>
+ </div>
</div>
-</div>
-
-
-<div class="tab-content">
- <div class="tab-pane active row" id="about">
- <div class="col-md-12">
+
+ <div class="row">
+ <div class="col-md-12">
<p>
- OneLab Portal is a central place to get acess to all OneLab testbeds.In order to get access to the portal,
- an experimenter needs to <a href="/portal/register">register</a> to the portal. The portal administrative body
+ OneLab Portal is a central place to get acess to all OneLab testbeds. In order to get access to the portal,
+ an experimenter needs to <a href="/register">register</a> to the portal. The portal administrative body
is responsible to accept or reject newly registered users.
</p>
<p>
- To learn more about OneLab visit: <a href="http://onelab.eu/" target="_blank">http://onelab.eu/</a>
+ To learn more about OneLab visit: <a href="http://onelab.eu" target="_blank">onelab.eu</a>
</p>
<p>
- If you have any questions regarding using the portal visit: <a href="/portal/support">OneLab support</a>
+ If you have any questions regarding using the portal visit: <a href="/support">OneLab support</a>
</p>
<p>
OneLab portal is a community effot. To get more information about OneLab portal team visit:
- <a href="http://myslice.info/community" target="_blank">http://myslice.info/community</a>
+ <a href="http://myslice.info/community" target="_blank">myslice.info/community</a>
</p>
</div>
</div>
- <div class="tab-pane row" id="components">
+ <div class="row">
<div class="col-md-12">
+ <br />
<h3>A ready-made and easily customisable user interface for your testbed.</h3>
<p>
MySlice is an ambitious project aiming to support researchers throughout the lifecycle of experiments that can run on a variety
</p>
</div>
<div class="col-md-12">
+ <br />
<h3>Portal Components</h3>
<h5>Myslice (Web Frontend)</h5>
<p>
</div>
</div>
</div>
-
-<script>
-$(document).ready(function() {
- $('.nav-tabs a').click(function (e) {
- e.preventDefault();
- $(this).tab('show');
- });
-});
-</script>
-
-
-{% endblock %}
+{% endblock %}
\ No newline at end of file
<div class="row">
<div class="col-md-12">
<div class="breadcrumbs">
- Account > {{ person.email }}
+ Account > <a href="/account">{{ person.email }}</a>
</div>
</div>
</div>
</script>
<div class="col-md-12">
- <h2>Authorities</h2>
+ <h2>From your authorities</h2>
</div>
{% if my_authorities %}
{% endif %}
<div>nnllknjkn<br /><br /></div>
<div class="col-md-12">
- <h2>Sub-Authorities</h2>
+ <h2>From your sub-authorities</h2>
</div>
{% if sub_authorities %}
{% endif %}
<div class="col-md-12">
- <h2>Authorities with delegation</h2>
+ <h2>From your authorities with delegation</h2>
</div>
{% if delegation_authorities %}
<div class="row">
<div class="col-md-12">
<h1><img src="{{ STATIC_URL }}icons/slices-xs.png" alt="News" />News</h1>
- <br />
</div>
</div>
<div class="row">
<div class="col-md-12">
- <b>15 July 2014</b> - The <b>OneLab</b> Portal opens with the <b>PlanetLab Europe</b>, <b>IOTLab</b> and <b>NITOS</b> testbeds!
+ <b>1 August 2014</b> - The <b>OneLab</b> Portal opens for beta test with the <b>PlanetLab Europe</b>, <b>IOTLab</b> and <b>NITOS</b> testbeds!
<p>
Existing PlanetLab users will be able to open an account with their existing PLE credentials.
</p>
<div class="col-md-12">
<ul>
{% for error in errors %}
- <li>{{ error }}</li>
+ <li style="color:white;">{{ error }}</li>
{% endfor %}
</ul>
</div>
{% for authority in authorities %}
{% if authority.name %}
{value:"{{ authority.name }}",label:"{{authority.name}}"},
- // to show only full name
- // {% else %}
- // {value:"{{ authority.authority_hrn }}",label:"{{authority.authority_hrn}}"},
{% endif %}
{% endfor %}
{% else %}
minLength: 0,
change: function (event, ui) {
if(!ui.item){
- //http://api.jqueryui.com/autocomplete/#event-change -
- // The item selected from the menu, if any. Otherwise the property is null
- //so clear the item for force selection
jQuery("#authority_hrn").val("");
}
}
- //select: function( event, ui ) {console.log(jQuery(this))}
});
- // for hover texts
$('[title!=""]').qtip();
$("form").validate();
$("form").submit(function() {
{% extends "layout_wide.html" %}
{% block head %}
-
{% endblock %}
{% block content %}
-
{% include theme|add:"_widget-slice-sections.html" %}
<div class="container-fluid tab-content container-slice">
<div class="row">
<div class="col-md-12">
<ul class="nav nav-tabs nav-section">
- <li class="active"><a href="#support">Tickets</a></li>
- <li><a href="#faq">FAQ</a></li>
+ <li class="active"><a href="#faq">FAQ</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</div>
</div>
<div class="container tab-content">
- <div class="tab-pane active row" id="support">
- <div class="col-md-12">
- <h2>Report a Bug</h2>
- <p>If you have found a bug or having difficulties accesing some features or found some anomalies, please report it using our ticketing system.</p>
- <button id="ticketbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Create Ticket</button>
-<!-- <h3>Unresolved Tickets</h3>
- <table class="mytable table table-bordered table-hover">
- <tr>
- <th>Ticket No</th>
- <th>Reported By</th>
- <th>Description</th>
- <th>Status</th>
- </tr>
- <tr>
- <td>1</td>
- <td>yasin.upmc@gmail.com</td>
- <td> Slice_request page is not working </td>
- <td> Unresolved</td>
- </tr>
- <tr>
- <td>2</td>
- <td>azerty@lip6.fr</td>
- <td>Unable to Register</td>
- <td>Unresolved</td>
- </tr>
-
- </table> -->
- </div>
- </div>
- <div class="tab-pane row" id="faq">
+ <div class="tab-pane active row" id="faq">
<div class="col-md-12">
<h2>Frequently Asked Questions (FAQs)<h2>
</div>
</div>
- <div class="tab-pane row" id="contact">
- <div class="col-md-12">
- <h2>Contact Us</h2>
-
- <h3>Mailing List</h3>
- <p>You can subscribe to our mailing list by sending a request to: <b>support</b> (AT) <b>onelab</b> (DOT) <b>eu</b></p>
- <p>Also you can adress any issues in the same email address.</p>
-
- <h3>Mailing Address</h3>
- <address>
- UPMC - LIP6<br>
- Boîte courrier 16 <br>
- Couloir 26-00, Etage 01, Bureau 102<br>
- 4 place Jussieu<br>
- 75252 PARIS CEDEX 05<br>
- France<br>
- </address>
- </div>
- </div>
+ <div class="tab-pane" id="contact">
+ <div class="row">
+ <div class="col-md-12">
+ <h2>Contact Us</h2>
+ <div class="row">
+ <div class="col-md-6">
+ <h3>Mailing List</h3>
+ <p> </p>
+ <p>You can subscribe to our mailing list by sending a request at the following E-Mail address:</p>
+ <p class="address">
+ <a href="mailto:contact@onelab.eu">contact@onelab.eu</a>
+ </p>
+ <p>Also you can adress any issues in the same email address.</p>
+ </div>
+ <div class="col-md-6">
+ <h3>Mailing Address</h3>
+ <p> </p>
+ <p class="address">
+ <b>OneLab Team</b><br />
+ UPMC - Laboratoire d'Informatique de Paris 6<br />
+ Boite courrier 169<br />
+ 4 place Jussieu<br />
+ 75252 PARIS cedex 05<br />
+ FRANCE
+ </p>
+
+
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-6">
+ <h3>Report a Bug</h3>
+ <p>If you have found a bug or having difficulties accesing some features or found some anomalies,
+ please report it using our ticketing system.
+ </p>
+ <button id="ticketbtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Create Ticket</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
</div>
<script>
$(document).ready(function() {
$('button#ticketbtn').click(function() {
- window.location="/portal/contact/";
+ window.location="/contact/";
});
$('.nav-tabs a').click(function (e) {
e.preventDefault();
<b>User hrn :</b> {{user_hrn}}<br>
<b>Portal url :</b> {{ current_site }}<br>
<p></p>
-<p>You can validate the user <a href="http://{{current_site}}/portal/validate">here</a>.<p>
-<p>Please note that the validation request will only become visible to you on the OneLab portal once the user has confirmed his/her email address.</p>
+<p>You can see new user request <a href="http://{{current_site}}/portal/validate">in the portal.</a><p>
+<p>Please note that the request will only become visible to you on the OneLab portal once the user has confirmed his/her email address.</p>
+<p>Please only validate users who you know for whose actions you are prepared to take responsibility, as described in the
+<a href="http://{{current_site}}/terms">OneLab terms and conditions.</a> If you find any anomalies in the request
+(mistakes/spam/unauthorized persons) please <a href="mailto:support@onelab.eu">notify us.</a></p>
+
User hrn : {{user_hrn}}
Portal url : {{ current_site }}
-You can validate the user here: http://{{current_site}}/portal/validate
+You can see new user request in the portal: http://{{current_site}}/portal/validate
-Please note that the validation request will only become visible to you on the OneLab portal once the user has confirmed his/her email address.
+Please note that the request will only become visible to you on the OneLab portal once the user has confirmed his/her email address.
+Please only validate users who you know for whose actions you are prepared to take responsibility, as described in the OneLab terms and conditions.
+If you find any anomalies in the request (mistakes/spam/unauthorized persons) please notify us at support@onelab.eu.
<div class="login-signup">
You don't have yet an account?
- <a href="/portal/register">Sign Up!</a>
+ <a href="/register">Sign Up!</a>
</div>
</form>
</div>
<div class="row">
<div class="col-md-12">
<div class="breadcrumbs">
- Experiment > {{ slice }}
+ Experiment > Slice: {{ slice }}
</div>
</div>
</div>
<div class="col-md-12">
{% if section == "resources" %}
<ul class="nav nav-tabs nav-section">
- <li><a href="/slice/{{ slice }}#info">Information</a></li>
+
<!-- <li><a href="/slice/{{ slice }}#testbeds">Testbeds</a></li> -->
<li class="active"><a class="link" href="/resources/{{ slice }}">Resources</a></li>
<li><a href="/slice/{{ slice }}#users">Users</a></li>
+ <li><a href="/slice/{{ slice }}#info">Information</a></li>
<!-- <li><a href="/slice/{{ slice }}#experiment">Statistics</a></li> -->
<!-- <li><a href="/slice/{{ slice }}#experiment">Measurements</a></li> -->
<li><a href="/slice/{{ slice }}#experiment">Tools</a></li>
</ul>
{% else %}
<ul class="nav nav-tabs nav-section">
- <li class="active"><a href="#info">Information</a></li>
<!-- <li class="testbeds"><a href="#testbeds">Testbeds</a></li> -->
<li><a class="link" href="/resources/{{ slice }}">Resources</a></li>
<li class="users"><a href="#users">Users</a></li>
+ <li class="active"><a href="#info">Information</a></li>
<!-- <li class="statistics"><a href="#experiment">Statistics</a></li> -->
<!-- <li class="measurements"><a href="#experiment">Measurements</a></li> -->
<li class="experiment"><a href="#experiment">Tools</a></li>
</div>
</li>
{%if 'is_pi' in pi %}
- <li id="nav-institution" class=""><a href="/portal/institution">MANAGEMENT</a></li>
+ <li id="nav-institution" class=""><a href="/institution">MANAGEMENT</a></li>
{%endif%}
- <li><a href="/portal/support/">SUPPORT</a></li>
+ <li><a href="/support/">SUPPORT</a></li>
</ul>
</div>
{% else %}
<div class="col-sm-5 col-md-5 secondary">
<ul>
<li><a href="/news">News</a></li>
- <li><a href="/portal/about">About</a></li>
+ <li><a href="/about">About</a></li>
<li><a target="_blank" href="http://new.onelab.eu">Public Website</a></li>
<li><a target="_blank" href="http://intranet.onelab.eu">Intranet</a></li>
</ul>
{% if username %}
- <div class="account">You are logged in as <a href="/portal/account/">{{ username }}</a> | <a id="logout" style="cursor:pointer;" data-username="{{ username }}"><span class="glyphicon glyphicon-off"></span> Logout</a></div>
+ <div class="account">You are logged in as <a href="/account/">{{ username }}</a> | <a id="logout" style="cursor:pointer;" data-username="{{ username }}"><span class="glyphicon glyphicon-off"></span> Logout</a></div>
{% endif %}
</div>
</div>
{{filter_testbeds}}
</div>
<div class="col-md-10" style="height:100%;">
- <!-- <div class="row slice-pending">
- <ul class="nav nav-pills">
- <li><a href="">Unreserved</a></li>
- <li><a href="">Reserved</a></li>
- <li><a href="">Pending<span class="badge" id="badge-pending" style="display:none;"></span></a></li>
- <li>
- <button type="button" class="btn btn-primary apply" id="ApplyPendind">Apply</button>
- <button type="button" class="btn btn-default clear">Clear</button>
- </li>
- <li>
- <div id="loading" style="display:none;"><img src="{{ STATIC_URL }}img/loading.gif" alt="Loading" /></div>
- </li>
- </ul>
- </div> -->
<div class="row">
{% if msg %}
<div class="col-md-12"><p class="alert-success">{{ msg }}</p></div>
<div class="col-md-6">
{{ filter_status }}
</div>
- <div class="col-md-2">
+ <div class="col-md-1">
{{ apply }}
</div>
</div>
<div class="tab-content" style="height:100%;">
<div class="tab-pane active" id="resourcelist">
<!-- Button trigger modal - columns selector -->
- <button class="btn btn-primary btn-sm" style="float:right;" data-toggle="modal" data-target="#myModal">...</button>
+ <button class="btn btn-default btn-sm" style="float:right;" data-toggle="modal" data-target="#myModal">...</button>
{{list_resources}}
<!-- <table cellpadding="0" cellspacing="0" border="0" class="table" id="objectList"></table> -->
</div>