From 53dbc5438319411919d37cf01f6f010ddae514bb Mon Sep 17 00:00:00 2001 From: "Agustin C. Caminero" Date: Fri, 16 May 2014 15:07:40 +0200 Subject: [PATCH] Merging master into ach_issue30 (working on #30) --- ..._validation_and_completion_of_http_rlms.py | 36 +++ labmanager/models.py | 48 ++- labmanager/rlms/ext/__init__.py | 1 + labmanager/rlms/ext/http.py | 131 ++++++++ .../rlms_properties_list.html | 41 +++ .../translations/es/LC_MESSAGES/messages.mo | Bin 25944 -> 27231 bytes .../translations/es/LC_MESSAGES/messages.po | 291 +++++++++++------- labmanager/views/admin.py | 185 ++++++++++- messages.pot | 270 +++++++++------- 9 files changed, 781 insertions(+), 222 deletions(-) create mode 100644 alembic/versions/33058c41765c_validation_and_completion_of_http_rlms.py create mode 100644 labmanager/rlms/ext/http.py create mode 100644 labmanager/templates/labmanager_admin/rlms_properties_list.html diff --git a/alembic/versions/33058c41765c_validation_and_completion_of_http_rlms.py b/alembic/versions/33058c41765c_validation_and_completion_of_http_rlms.py new file mode 100644 index 0000000..38763b7 --- /dev/null +++ b/alembic/versions/33058c41765c_validation_and_completion_of_http_rlms.py @@ -0,0 +1,36 @@ +"""Validation and completion of HTTP RLMS + +Revision ID: 33058c41765c +Revises: 3ee46f95bcce +Create Date: 2014-05-16 10:00:23.411755 + +""" + +# revision identifiers, used by Alembic. +revision = '33058c41765c' +down_revision = '3ee46f95bcce' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + + op.add_column('rlmss', sa.Column('validated', sa.Boolean(), nullable=False)) + op.add_column('rlmss', sa.Column('newrlms', sa.Boolean(), nullable=False)) + + op.create_table('http_rlms_property', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('rlms_id', sa.Integer(), nullable=False), + sa.Column('name', sa.Unicode(length=50), nullable=False), + sa.Column('value', sa.Unicode(length=50), nullable=False), + sa.ForeignKeyConstraint(['rlms_id'], ['rlmss.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('name','rlms_id') + ) + +def downgrade(): + op.drop_column('rlmss', 'validated') + op.drop_column('rlmss', 'newrlms') + + op.drop_table('http_rlms_property') diff --git a/labmanager/models.py b/labmanager/models.py index e55a596..bed9dea 100644 --- a/labmanager/models.py +++ b/labmanager/models.py @@ -94,21 +94,65 @@ class RLMS(Base, SBBase): location = Column(Unicode(50), nullable = False) url = Column(Unicode(300), nullable = False) version = Column(Unicode(50), nullable = False) + + # validated: true or false. True means that the last time that the validation process took place it was a success. The validation process involves that the labmanager admin checks the correctness of the credentials provided during the RLMS creation. False means that the last time that the validation took place, it did not succeed. + + validated = Column(Boolean, default = False) + + # newrlms is true for all the rlms when they are created. After the completion process (for HTTP RLMSs) or validation process (for all RLMSs), newrlms = false. newrlms is only usefull for HTTP, not for any of the other RLMS kinds. + + newrlms = Column(Boolean, default = True) + + configuration = Column(Unicode(10 * 1024)) - def __init__(self, kind = None, url = None, location = None, version = None, configuration = '{}'): + def __init__(self, kind = None, url = None, location = None, version = None, newrlms = True, configuration = '{}'): self.kind = kind self.location = location self.url = url self.version = version self.configuration = configuration + self.validated = False + self.newrlms = True + def __repr__(self): - return "RLMS(kind = %(rlmskind)r, url=%(rlmsurl)r, location=%(rlmslocation)r, version=%(rmlsversion)r, configuration=%(rmlsconfiguration)r)" % dict(rmlskind=self.kind, rmlsurl=self.url, rmlslocation=self.location, rlmsversion=self.version, rmlsconfiguration=self.configuration) + return "RLMS(kind = %(rlmskind)r, url=%(rlmsurl)r, location=%(rlmslocation)r, version=%(rmlsversion)r, validated=%(rlmsvalidated)r, newrlms=%(newrlms)r , configuration=%(rmlsconfiguration)r)" % dict(rmlskind=self.kind, rmlsurl=self.url, rmlslocation=self.location, rlmsversion=self.version, rlmsvalidated=self.validated, newrlms=self.newrlms, rmlsconfiguration=self.configuration) def __unicode__(self): return gettext(u"%(kind)s on %(location)s", kind=self.kind, location=self.location) +######################################################### +# +# HTTP_RLMS_Property: Properties that a HTTP RLMS may have +# +# 1 RLMS (of HTTP kind) may have 1 or multiple HTTP_RLMS_Properties +# + +class HTTP_RLMS_Property(Base, SBBase): + __tablename__ = 'http_rlms_property' + __table_args__ = (UniqueConstraint('name', 'rlms_id'), ) + + id = Column(Integer, primary_key = True) + rlms_id = Column(Integer, ForeignKey('rlmss.id'), nullable = False) + name = Column(Unicode(50), nullable = False) + value = Column(Unicode(50), nullable = False, default = u"") + + rlms = relation(RLMS.__name__, backref = backref('http_properties', order_by=id, cascade = 'all,delete')) + + def __init__(self, name = None, value = None, rlms = None): + + + self.name = name + self.value = value + self.rlms = rlms + + def __unicode__(self): + return u'%s with value %s at %s' % (self.name, self.value, self.rlms) + + + + ####################################################################### # # Laboratory diff --git a/labmanager/rlms/ext/__init__.py b/labmanager/rlms/ext/__init__.py index 35b6b6f..2900782 100644 --- a/labmanager/rlms/ext/__init__.py +++ b/labmanager/rlms/ext/__init__.py @@ -21,6 +21,7 @@ import virtual assert virtual is not None # pyflakes warning +import http def setup(): from flask.exthook import ExtensionImporter diff --git a/labmanager/rlms/ext/http.py b/labmanager/rlms/ext/http.py new file mode 100644 index 0000000..a48c359 --- /dev/null +++ b/labmanager/rlms/ext/http.py @@ -0,0 +1,131 @@ +# -*-*- encoding: utf-8 -*-*- + +import sys +import json + +from flask import request, Blueprint +from flask.ext.wtf import TextField, PasswordField, Required, URL, ValidationError, BooleanField + +from labmanager.forms import AddForm, RetrospectiveForm, GenericPermissionForm +from labmanager.rlms import register, Laboratory, BaseRLMS, BaseFormCreator, register_blueprint, Capabilities, Versions +from labmanager import app + + +def get_module(version): + """get_module(version) -> proper module for that version + + Right now, a single version is supported, so this module itself will be returned. + When compatibility is required, we may change this and import different modules. + """ + # TODO: check version + return sys.modules[__name__] + + +class HTTPAddForm(AddForm): + + remote_login = TextField("Login", validators = [Required()]) + password = PasswordField("Password") + + base_url = TextField("Base URL", validators = [Required(), URL() ]) + # completed = BooleanField('This RLMS is completed') + + def __init__(self, add_or_edit, *args, **kwargs): + super(HTTPAddForm, self).__init__(*args, **kwargs) + self.add_or_edit = add_or_edit + + @staticmethod + def process_configuration(old_configuration, new_configuration): + old_configuration_dict = json.loads(old_configuration) + new_configuration_dict = json.loads(new_configuration) + if new_configuration_dict.get('password', '') == '': + new_configuration_dict['password'] = old_configuration_dict.get('password','') + return json.dumps(new_configuration_dict) + + def validate_password(form, field): + if form.add_or_edit and field.data == '': + raise ValidationError("This field is required.") + + + +class HTTPPermissionForm(RetrospectiveForm): + priority = TextField("Priority") + time = TextField("Time (in seconds)") + + def validate_number(form, field): + if field.data != '' and field.data is not None: + try: + int(field.data) + except: + raise ValidationError("Invalid value. Must be an integer.") + + + validate_priority = validate_number + validate_time = validate_number + +class HTTPLmsPermissionForm(HTTPPermissionForm, GenericPermissionForm): + pass + +class HTTPFormCreator(BaseFormCreator): + + def get_add_form(self): + return HTTPAddForm + + def get_permission_form(self): + return HTTPPermissionForm + + def get_lms_permission_form(self): + return HTTPLmsPermissionForm + +FORM_CREATOR = HTTPFormCreator() + + + +class RLMS(BaseRLMS): + + def __init__(self, configuration): + configuration = json.loads(configuration) + self.http_url = self.configuration['url'] + self.http_user = self.configuration['remote_login'] + self.http_passwd = self.configuration['password'] + self.http_config = self.configuration['config'] # String, a JSON + self.base_url = self.configuration['base_url'] + + if self.login is None or self.password is None or self.base_url is None: + raise Exception("Laboratory misconfigured: fields missing" ) + + + def get_version(self): + + return Versions.VERSION_1 + + def get_capabilities(self): + + return Versions.VERSION_1 + + def test(self): + + return None + + def get_laboratories(self): + + return None + + def reserve(self, laboratory_id, username, institution, general_configuration_str, particular_configurations, request_payload, user_properties, *args, **kwargs): + return None + + def get_http_user(self): + return self.http_user + + + + + + +http_blueprint = Blueprint('http', __name__) +@http_blueprint.route('/') +def index(): + return "This is the index for HTTP" + +register("HTTP", ['0.1'], __name__) +register_blueprint(http_blueprint, '/http') + diff --git a/labmanager/templates/labmanager_admin/rlms_properties_list.html b/labmanager/templates/labmanager_admin/rlms_properties_list.html new file mode 100644 index 0000000..e08747e --- /dev/null +++ b/labmanager/templates/labmanager_admin/rlms_properties_list.html @@ -0,0 +1,41 @@ +{% extends 'admin/master.html' %} +{% block body %} +

{{gettext('Properties for')}} {{ rlms.kind }} ({{rlms.version }}) {{gettext('at')}} {{ rlms.location }}

+ + +{% if prop_value_list %} +
+ + + + + + + + + + + {% for prop_value in prop_value_list %} + + + + + {% endfor %} + + +
{{gettext('Property')}}{{gettext('Value')}}
{{ prop_value[0] }}
+
+ + + + + +
+ +{% else %} +
+ No property found +
+{% endif %} + +{% endblock %} diff --git a/labmanager/translations/es/LC_MESSAGES/messages.mo b/labmanager/translations/es/LC_MESSAGES/messages.mo index 5fb6bf6d6f0b153c9c6b1960e70c4d7481021a84..6513c0bad4fc49377352be28bc4f4a40bf83ec44 100644 GIT binary patch delta 6463 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 diff --git a/labmanager/translations/es/LC_MESSAGES/messages.po b/labmanager/translations/es/LC_MESSAGES/messages.po index 3af0775..1983f4e 100644 --- a/labmanager/translations/es/LC_MESSAGES/messages.po +++ b/labmanager/translations/es/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: labmanager VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-05-07 16:52+0200\n" +"POT-Creation-Date: 2014-05-16 14:47+0200\n" "PO-Revision-Date: 2013-10-22 10:12+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: es \n" @@ -46,12 +46,12 @@ msgid "Labmanager password" msgstr "Contraseña del gestor de laboratorios" #: labmanager/forms.py:38 labmanager/forms.py:42 labmanager/forms.py:55 -#: labmanager/views/admin.py:91 labmanager/views/admin.py:122 +#: labmanager/views/admin.py:94 labmanager/views/admin.py:125 #: labmanager/views/lms/admin.py:106 msgid "This field is required." msgstr "Es obligatorio introducir un valor en este campo" -#: labmanager/forms.py:46 labmanager/views/opensocial.py:226 +#: labmanager/forms.py:46 labmanager/views/opensocial.py:236 #: labmanager/views/lms/admin.py:81 msgid "Login" msgstr "Usuario" @@ -61,17 +61,17 @@ msgstr "Usuario" #: labmanager/templates/login_lms.html:84 #: labmanager/templates/login_lms.html:86 #: labmanager/templates/login_ple.html:84 -#: labmanager/templates/login_ple.html:86 labmanager/views/opensocial.py:227 +#: labmanager/templates/login_ple.html:86 labmanager/views/opensocial.py:237 #: labmanager/views/lms/admin.py:84 msgid "Password" msgstr "Contraseña" -#: labmanager/forms.py:62 labmanager/forms.py:93 +#: labmanager/forms.py:62 labmanager/forms.py:92 #: labmanager/templates/labmanager_admin/lab-list.html:12 msgid "Identifier" msgstr "Identificador" -#: labmanager/forms.py:69 labmanager/forms.py:109 +#: labmanager/forms.py:69 labmanager/forms.py:108 #, fuzzy, python-format msgid "Invalid characters found: %(char)s" msgstr "Se ha encontrado un carácter no válido: %(char)s" @@ -80,62 +80,62 @@ msgstr "Se ha encontrado un carácter no válido: %(char)s" msgid "login lenght must be at least 5 characters long" msgstr "El nombre de usuario debe tener al menos 5 caracteres" -#: labmanager/forms.py:82 +#: labmanager/forms.py:81 msgid "Passwords can not contain a space" msgstr "Las contraseñas no pueden contener espacios en blanco" -#: labmanager/forms.py:84 +#: labmanager/forms.py:83 msgid "password lenght must be at least 8 characters long" msgstr "La contraseña debe tener al menos 8 caracteres de longitud" -#: labmanager/forms.py:97 +#: labmanager/forms.py:96 msgid "Oficial name must be between 4 and 50 characters long" msgstr "El nombre oficial debe tener entre 4 y 50 caracteres de longitud" -#: labmanager/forms.py:103 +#: labmanager/forms.py:102 msgid "Short name must be between 4 and 15 characters long" msgstr "El nombre corto debe tener entre 4 y 15 caracteres de longitud" -#: labmanager/forms.py:115 +#: labmanager/forms.py:114 msgid "Oficial name must be between 4 and 15 characters long" msgstr "El nombre oficial debe tener entre 4 y 15 caracteres de longitud" -#: labmanager/models.py:110 +#: labmanager/models.py:123 #, python-format msgid "%(kind)s on %(location)s" msgstr "%(kind)s en %(location)s" -#: labmanager/models.py:142 +#: labmanager/models.py:186 #, python-format msgid "%(name)s at %(rlms)s" msgstr "%(name)s en %(rlms)s" -#: labmanager/models.py:207 +#: labmanager/models.py:251 #, python-format msgid "Basic HTTP auth for %(name)s" msgstr "Autorización HTTP básica para %(name)s" -#: labmanager/models.py:239 +#: labmanager/models.py:283 #, python-format msgid "ShindigCredentials for %(lmsname)s" msgstr "Credenciales de Shindig para %(lmsname)s" -#: labmanager/models.py:312 +#: labmanager/models.py:356 #, python-format msgid "%(coursename)s on %(courselms)s" msgstr "%(coursename)s en %(courselms)s" -#: labmanager/models.py:354 +#: labmanager/models.py:398 #, python-format msgid "%(identifier)s: lab %(labname)s to %(lmsname)s" msgstr "%(identifier)s: laboratorio %(labname)s en %(lmsname)s" -#: labmanager/models.py:410 +#: labmanager/models.py:454 #, python-format msgid "%(coursename)s from %(lmsname)s on %(permission)s" msgstr "%(coursename)s de %(lmsname)s en %(permission)s" -#: labmanager/models.py:440 +#: labmanager/models.py:484 #, python-format msgid "'%(localidentifier)s': lab %(labname)s to %(ltname)s" msgstr "'%(localidentifier)s': laboratorio %(labname)s en %(ltname)s" @@ -423,6 +423,7 @@ msgid "Available labs for " msgstr "Laboratorios disponibles para " #: labmanager/templates/labmanager_admin/lab-list.html:3 +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:3 msgid "at" msgstr "en" @@ -442,6 +443,28 @@ msgstr "Eliminar el registro" msgid "No laboratory found" msgstr "No se ha encontrado el laboratorio" +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:3 +msgid "Properties for" +msgstr "Propiedades de" + +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:11 +#: labmanager/templates/lti/display_lab.html:20 +msgid "Property" +msgstr "Propiedad" + +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:12 +#: labmanager/templates/lti/display_lab.html:21 +msgid "Value" +msgstr "Valor" + +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:28 +msgid "Save and return" +msgstr "Guardar y volver" + +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:30 +msgid "Return" +msgstr "Volver" + #: labmanager/templates/lms_admin/discover-errors.html:3 #: labmanager/templates/lms_admin/discover.html:3 msgid "Discover courses" @@ -520,7 +543,7 @@ msgstr "" #: labmanager/templates/lti/display_lab.html:5 #: labmanager/templates/lti/errors.html:5 -#: labmanager/templates/opensocial/errors.html:5 labmanager/views/admin.py:572 +#: labmanager/templates/opensocial/errors.html:5 labmanager/views/admin.py:746 #, fuzzy msgid "Lab Manager" msgstr "LabManager" @@ -529,19 +552,11 @@ msgstr "LabManager" msgid "Access the laboratory" msgstr "Acceder al laboratorio" -#: labmanager/templates/lti/display_lab.html:20 -msgid "Property" -msgstr "Propiedad" - -#: labmanager/templates/lti/display_lab.html:21 -msgid "Value" -msgstr "Valor" - -#: labmanager/templates/lti/display_lab.html:26 labmanager/views/admin.py:536 +#: labmanager/templates/lti/display_lab.html:26 labmanager/views/admin.py:710 msgid "Laboratory" msgstr "Laboratorio" -#: labmanager/templates/lti/display_lab.html:31 labmanager/views/admin.py:579 +#: labmanager/templates/lti/display_lab.html:31 labmanager/views/admin.py:753 #: labmanager/views/ple/instructor.py:98 msgid "RLMS" msgstr "RLMS" @@ -736,181 +751,234 @@ msgstr "Error al abrir la URL proporcionada" msgid "Invalid JSON" msgstr "El JSON es válido" -#: labmanager/views/admin.py:81 labmanager/views/admin.py:225 -#: labmanager/views/admin.py:470 labmanager/views/public.py:43 +#: labmanager/views/admin.py:84 labmanager/views/admin.py:228 +#: labmanager/views/admin.py:646 labmanager/views/public.py:43 #: labmanager/views/ple/admin.py:229 labmanager/views/ple/admin.py:278 #: labmanager/views/ple/admin.py:342 msgid "name" msgstr "Nombre" -#: labmanager/views/admin.py:81 labmanager/views/admin.py:109 +#: labmanager/views/admin.py:84 labmanager/views/admin.py:112 #: labmanager/views/ple/admin.py:86 msgid "login" msgstr "Usuario" -#: labmanager/views/admin.py:81 labmanager/views/ple/admin.py:89 +#: labmanager/views/admin.py:84 labmanager/views/ple/admin.py:89 msgid "password" msgstr "Contraseña" -#: labmanager/views/admin.py:109 labmanager/views/admin.py:174 -#: labmanager/views/admin.py:534 +#: labmanager/views/admin.py:112 labmanager/views/admin.py:177 +#: labmanager/views/admin.py:708 msgid "lt" msgstr "LT" -#: labmanager/views/admin.py:109 labmanager/views/admin.py:225 +#: labmanager/views/admin.py:112 labmanager/views/admin.py:228 #: labmanager/views/ple/admin.py:87 msgid "full_name" msgstr "Nombre completo" -#: labmanager/views/admin.py:109 labmanager/views/ple/admin.py:88 +#: labmanager/views/admin.py:112 labmanager/views/ple/admin.py:88 msgid "access_level" msgstr "Nivel de acceso" -#: labmanager/views/admin.py:144 +#: labmanager/views/admin.py:147 #, fuzzy msgid "Accept request" msgstr "Aceptar la solicitud" -#: labmanager/views/admin.py:157 +#: labmanager/views/admin.py:160 #, fuzzy msgid "Reject request" msgstr "Rechazar la solicitud" -#: labmanager/views/admin.py:174 labmanager/views/admin.py:534 +#: labmanager/views/admin.py:177 labmanager/views/admin.py:708 msgid "laboratory" msgstr "Laboratorio" -#: labmanager/views/admin.py:174 labmanager/views/admin.py:534 +#: labmanager/views/admin.py:177 labmanager/views/admin.py:708 #: labmanager/views/ple/admin.py:231 msgid "local_identifier" msgstr "Identificador local" -#: labmanager/views/admin.py:174 +#: labmanager/views/admin.py:177 msgid "accept" msgstr "Aceptar" -#: labmanager/views/admin.py:174 +#: labmanager/views/admin.py:177 msgid "reject" msgstr "Rechazar" -#: labmanager/views/admin.py:177 +#: labmanager/views/admin.py:180 msgid "The laboratory that has been requested" msgstr "El laboratorio solicitado" -#: labmanager/views/admin.py:178 +#: labmanager/views/admin.py:181 msgid "Learning Management System which created each request" msgstr "LT que creó cada solicitud" -#: labmanager/views/admin.py:179 +#: labmanager/views/admin.py:182 msgid "Unique identifier for a LT to access a laboratory" msgstr "Identificador único que permite a un LT acceder a un laboratorio" -#: labmanager/views/admin.py:211 +#: labmanager/views/admin.py:214 msgid "Login of the LT when contacting the LabManager" msgstr "Usuario del LT que contacta con el LabManager" -#: labmanager/views/admin.py:220 labmanager/views/lms/admin.py:196 +#: labmanager/views/admin.py:223 labmanager/views/lms/admin.py:196 #: labmanager/views/lms/admin.py:204 labmanager/views/ple/admin.py:134 #: labmanager/views/ple/instructor.py:85 msgid "N/A" msgstr "N / A" -#: labmanager/views/admin.py:225 labmanager/views/admin.py:289 +#: labmanager/views/admin.py:228 labmanager/views/admin.py:339 #: labmanager/views/ple/admin.py:344 msgid "url" msgstr "URL" -#: labmanager/views/admin.py:225 +#: labmanager/views/admin.py:228 msgid "download" msgstr "Descargar" -#: labmanager/views/admin.py:227 +#: labmanager/views/admin.py:230 msgid "Institution short name (lower case, all letters, dots and numbers)" msgstr "Nombre corto de la escuela: en minúsculas, a-z, 0-9 y '.'" -#: labmanager/views/admin.py:227 +#: labmanager/views/admin.py:230 msgid "Name of the institution." msgstr "Nombre oficial de la escuela" -#: labmanager/views/admin.py:289 +#: labmanager/views/admin.py:293 +msgid "UNCOMPLETE" +msgstr "INCOMPLETO" + +#: labmanager/views/admin.py:295 +msgid "Click to complete" +msgstr "Clica para completar" + +#: labmanager/views/admin.py:301 +#, fuzzy +msgid "COMPLETE" +msgstr "Completo" + +#: labmanager/views/admin.py:303 +msgid "Click to modify" +msgstr "Clica para modificar" + +#: labmanager/views/admin.py:339 msgid "kind" msgstr "Tipo" -#: labmanager/views/admin.py:289 +#: labmanager/views/admin.py:339 msgid "version" msgstr "Versión" -#: labmanager/views/admin.py:289 +#: labmanager/views/admin.py:339 msgid "location" msgstr "Ubicación" -#: labmanager/views/admin.py:289 +#: labmanager/views/admin.py:339 msgid "labs" msgstr "Laboratorios" -#: labmanager/views/admin.py:292 +#: labmanager/views/admin.py:339 +msgid "validated" +msgstr "Validado" + +#: labmanager/views/admin.py:339 +msgid "completed" +msgstr "Completo" + +#: labmanager/views/admin.py:344 msgid "City and country where the RLMS is hosted" msgstr "Ciudad y país donde está el RLMS" -#: labmanager/views/admin.py:293 +#: labmanager/views/admin.py:345 msgid "Main URL of the RLMS" msgstr "URL principal del RLMS" -#: labmanager/views/admin.py:422 +#: labmanager/views/admin.py:346 +msgid "" +"This is of interest to HTTP RLMSs only. This column means that this HTTP " +"RLMS has all its advanced properties properly configured. The basic " +"properties of HTTP RLMSs (base_url, user, and password) and all the " +"properties of the other RLMSs can be set just normally through the Edit " +"button" +msgstr "" +"De interés solamente para los RLMSs de tipo HTTP. Esta columna significa " +"que este RLMS HTTP tiene todas sus propiedades avanzadas configuradas. " +"Las propiedades básicas de un RLMS HTTP (base_url, user, y password) y el" +" resto de propiedades de los otros tipos de RLMSs se pueden ajustar a " +"través del botón Editar" + +#: labmanager/views/admin.py:347 +msgid "" +"This RLMS has been validated in the past. This shows the outcome of the " +"last validation process that was conducted on it" +msgstr "" +"Este RLMS ha sido validado en algún momento. Esta columna muestra el " +"resultado de la última vez que se realizó el proceso de validación sobre " +"este RLMS" + +#: labmanager/views/admin.py:353 labmanager/views/public.py:36 +#: labmanager/views/ple/admin.py:137 labmanager/views/ple/instructor.py:88 +msgid "list" +msgstr "lista" + +#: labmanager/views/admin.py:598 msgid "Make not available" msgstr "Marcar como no accesible" -#: labmanager/views/admin.py:425 +#: labmanager/views/admin.py:601 msgid "Make available" msgstr "Marcar como accesible" -#: labmanager/views/admin.py:436 +#: labmanager/views/admin.py:612 #, fuzzy msgid "Default local identifier:" msgstr "Identificador local por defecto" -#: labmanager/views/admin.py:445 +#: labmanager/views/admin.py:621 msgid "Make not publicly available" msgstr "Marcar como no disponible al público" -#: labmanager/views/admin.py:448 +#: labmanager/views/admin.py:624 msgid "Make publicly available" msgstr "Marcar como disponible al público" -#: labmanager/views/admin.py:459 +#: labmanager/views/admin.py:635 #, fuzzy msgid "Public identifier:" msgstr "Identificador público" -#: labmanager/views/admin.py:470 labmanager/views/public.py:43 +#: labmanager/views/admin.py:646 labmanager/views/public.py:43 #: labmanager/views/ple/admin.py:228 labmanager/views/ple/admin.py:278 msgid "rlms" msgstr "RLMS" -#: labmanager/views/admin.py:470 labmanager/views/public.py:43 +#: labmanager/views/admin.py:646 labmanager/views/public.py:43 #: labmanager/views/ple/admin.py:230 labmanager/views/ple/admin.py:278 msgid "laboratory_id" msgstr "Identificador del laboratorio" -#: labmanager/views/admin.py:470 +#: labmanager/views/admin.py:646 msgid "visibility" msgstr "Visibilidad" -#: labmanager/views/admin.py:470 +#: labmanager/views/admin.py:646 msgid "availability" msgstr "Disponibilidad" -#: labmanager/views/admin.py:470 +#: labmanager/views/admin.py:646 msgid "public_availability" msgstr "Público" -#: labmanager/views/admin.py:473 +#: labmanager/views/admin.py:649 msgid "Make this laboratory automatically available for the Learning Tools" msgstr "" "Marcar este laboratorio como accesible automáticamente para las " "herramientas de aprendizaje" -#: labmanager/views/admin.py:474 +#: labmanager/views/admin.py:650 msgid "" "Make this laboratory automatically available even from outside the " "registered Learning Tools" @@ -918,80 +986,80 @@ msgstr "" "Marcar este laboratorio accesible de forma automática, incluso desde " "fuera de las herramientas de aprendizaje registradas" -#: labmanager/views/admin.py:490 +#: labmanager/views/admin.py:666 #, python-format msgid "Local identifier '%(localidentifier)s' already exists" msgstr "El identificador local '%(localidentifier)s' ya existe" -#: labmanager/views/admin.py:495 +#: labmanager/views/admin.py:671 msgid "Invalid local identifier (empty)" msgstr "El identificador local no es válido (vacío)" -#: labmanager/views/admin.py:511 +#: labmanager/views/admin.py:687 #, python-format msgid "Public identifier '%(publicidentifier)s' already exists" msgstr "El identificador público '%(publicidentifier)s' ya existe" -#: labmanager/views/admin.py:518 +#: labmanager/views/admin.py:692 msgid "Invalid public identifier (empty)" msgstr "El identificador público no es válido (vacío)" -#: labmanager/views/admin.py:534 +#: labmanager/views/admin.py:708 msgid "configuration" msgstr "Configuración" -#: labmanager/views/admin.py:534 +#: labmanager/views/admin.py:708 msgid "SCORM" msgstr "SCORM" -#: labmanager/views/admin.py:537 +#: labmanager/views/admin.py:711 msgid "Learning Management System" msgstr "Sistema de gestión del aprendizaje (Learning Tool - LT)" -#: labmanager/views/admin.py:538 +#: labmanager/views/admin.py:712 msgid "Unique identifier for a Learning Tool to access a laboratory" msgstr "" "Identificador único para una herramienta de aprendizaje para acceder a un" " laboratorio" -#: labmanager/views/admin.py:573 +#: labmanager/views/admin.py:747 msgid "LT Management" msgstr "Gestión del LT" -#: labmanager/views/admin.py:574 +#: labmanager/views/admin.py:748 msgid "LT" msgstr "LT" -#: labmanager/views/admin.py:575 +#: labmanager/views/admin.py:749 msgid "LT Permissions" msgstr "Permisos del LT" -#: labmanager/views/admin.py:576 +#: labmanager/views/admin.py:750 msgid "LT Users" msgstr "Usuarios del LT" -#: labmanager/views/admin.py:577 +#: labmanager/views/admin.py:751 msgid "LT Requests" msgstr "Peticiones al LT" -#: labmanager/views/admin.py:578 +#: labmanager/views/admin.py:752 msgid "ReLMS Management" msgstr "Gestión del RLMS" -#: labmanager/views/admin.py:580 +#: labmanager/views/admin.py:754 msgid "Registered labs" msgstr "Laboratorios registrados" -#: labmanager/views/admin.py:581 labmanager/views/lms/admin.py:386 +#: labmanager/views/admin.py:755 labmanager/views/lms/admin.py:386 #: labmanager/views/lms/admin.py:387 labmanager/views/ple/admin.py:494 msgid "Users" msgstr "Usuarios" -#: labmanager/views/admin.py:581 +#: labmanager/views/admin.py:755 msgid "Labmanager Users" msgstr "Usuarios del gestor de laboratorios" -#: labmanager/views/admin.py:582 labmanager/views/lms/admin.py:389 +#: labmanager/views/admin.py:756 labmanager/views/lms/admin.py:389 #: labmanager/views/lms/instructor.py:86 labmanager/views/ple/admin.py:495 #: labmanager/views/ple/instructor.py:156 msgid "Log out" @@ -1154,64 +1222,59 @@ msgstr "" msgid "Could not connect to %(urlshindig)s." msgstr "No se pudo conectar a %(urlshindig)s." -#: labmanager/views/opensocial.py:205 +#: labmanager/views/opensocial.py:211 msgid "Institution not found or it does not support Shindig" msgstr "No se ha encontrado la escuela o no soporta Shindig" -#: labmanager/views/opensocial.py:210 labmanager/views/ple/admin.py:253 +#: labmanager/views/opensocial.py:216 labmanager/views/ple/admin.py:253 #: labmanager/views/ple/instructor.py:121 msgid "Laboratory not found" msgstr "No se ha encontrado el laboratorio" -#: labmanager/views/opensocial.py:222 +#: labmanager/views/opensocial.py:232 msgid "School name" msgstr "Nombre oficial de la escuela" -#: labmanager/views/opensocial.py:222 +#: labmanager/views/opensocial.py:232 msgid "School name." msgstr "Nombre oficial de la escuela" -#: labmanager/views/opensocial.py:223 +#: labmanager/views/opensocial.py:233 msgid "Short name" msgstr "Nombre corto de la escuela" -#: labmanager/views/opensocial.py:223 +#: labmanager/views/opensocial.py:233 msgid "Short name (lower case, all letters, dots and numbers)." msgstr "Nombre corto de la escuela: en minúsculas, a-z, 0-9 y '.'" -#: labmanager/views/opensocial.py:224 +#: labmanager/views/opensocial.py:234 msgid "School URL" msgstr "URL" -#: labmanager/views/opensocial.py:224 +#: labmanager/views/opensocial.py:234 msgid "Address of your school." msgstr "Página web de la escuela" -#: labmanager/views/opensocial.py:225 +#: labmanager/views/opensocial.py:235 msgid "User name" msgstr "Nombre de usuario" -#: labmanager/views/opensocial.py:225 +#: labmanager/views/opensocial.py:235 msgid "Your name and last name." msgstr "Nombre y apellidos" -#: labmanager/views/opensocial.py:226 +#: labmanager/views/opensocial.py:236 msgid "Your new login (you can create more later)." msgstr "El nombre de usuario. Pueden crearse más usuarios posteriormente" -#: labmanager/views/opensocial.py:227 +#: labmanager/views/opensocial.py:237 msgid "Your access password." msgstr "Su contraseña de acceso" -#: labmanager/views/opensocial.py:235 labmanager/views/opensocial.py:238 +#: labmanager/views/opensocial.py:245 labmanager/views/opensocial.py:248 msgid "This name is already taken" msgstr "Este nombre ya ha sido registrado" -#: labmanager/views/public.py:36 labmanager/views/ple/admin.py:137 -#: labmanager/views/ple/instructor.py:88 -msgid "list" -msgstr "lista" - #: labmanager/views/public.py:43 #, fuzzy msgid "public_identifier" @@ -1570,3 +1633,15 @@ msgstr "Laboratorios" #~ msgid "false" #~ msgstr "falso" +#~ msgid "Properties for" +#~ msgstr "Propiedades de" + +#~ msgid "Change properties" +#~ msgstr "Cambia propiedades" + +#~ msgid "Return" +#~ msgstr "Volver" + +#~ msgid "Retur" +#~ msgstr "" + diff --git a/labmanager/views/admin.py b/labmanager/views/admin.py index 89a51f0..d3042be 100644 --- a/labmanager/views/admin.py +++ b/labmanager/views/admin.py @@ -4,6 +4,9 @@ import urlparse import threading +import requests +import re + from hashlib import new as new_hash from yaml import load as yload from wtforms.fields import PasswordField @@ -16,7 +19,7 @@ from flask.ext.admin.contrib.sqlamodel import ModelView from labmanager.babel import gettext, lazy_gettext from labmanager.models import LabManagerUser, LtUser -from labmanager.models import PermissionToCourse, RLMS, Laboratory, PermissionToLt, RequestPermissionLT +from labmanager.models import PermissionToCourse, RLMS, Laboratory, PermissionToLt, RequestPermissionLT, HTTP_RLMS_Property from labmanager.models import BasicHttpCredentials, LearningTool, Course, PermissionToLtUser, ShindigCredentials from labmanager.rlms import get_form_class, get_supported_types, get_supported_versions, get_manager_class from labmanager.views import RedirectView @@ -279,23 +282,79 @@ def _generate_choices(): sel_choices.append(("%s<>%s" % (ins_rlms, ver),"%s - %s" % (ins_rlms.title(), ver)) ) return sel_choices + + +def newrlms_formatter(v, c, rlms, p): + + if rlms.kind in ("HTTP"): + + if rlms.newrlms == True: + + currently = lazy_gettext('UNCOMPLETE') + # klass = 'btn-danger' + msg = lazy_gettext('Click to complete') + color = 'white' + bgcolor='red' + + else: + + currently = lazy_gettext('COMPLETE') + # klass = 'btn-success' + msg = lazy_gettext('Click to modify') + color = 'white' + bgcolor = 'green' + + + + return Markup('

%s

%s' % (bgcolor, color, currently, url_for('.change_properties', id=rlms.id), msg)) + + + # return Markup("""
+ # %(currently)s
+ # + # + #
""" % dict( + # currently = currently, + # url = url_for('.change_properties'), + # rlms_id = rlms.id, + # klass = klass, + # msg = msg, + # )) + else: + + # for RLMS other than HTTP, the properties can be modified just editing the RLMS as usually + currently = '---' + + return Markup(currently) + + + + class RLMSPanel(L4lModelView): # For editing form_columns = ('kind', 'location', 'url') form_overrides = dict(kind=DynamicSelectField) # For listing - column_list = ['kind', 'version', 'location', 'url', 'labs'] - column_labels = dict(kind=lazy_gettext('kind'), version=lazy_gettext('version'), location=lazy_gettext('location'), url=lazy_gettext('url'), labs=lazy_gettext('labs')) + column_list = ['kind', 'version', 'location', 'url', 'validated', 'newrlms', 'labs'] + column_labels = dict(kind=lazy_gettext('kind'), version=lazy_gettext('version'), location=lazy_gettext('location'), url=lazy_gettext('url'), labs=lazy_gettext('labs'), validated=lazy_gettext('validated'), newrlms=lazy_gettext('completed')) + + column_exclude_list = ('version','configuration') column_descriptions = { 'location' : lazy_gettext('City and country where the RLMS is hosted'), 'url' : lazy_gettext('Main URL of the RLMS'), + 'newrlms' : lazy_gettext('This is of interest to HTTP RLMSs only. This column means that this HTTP RLMS has all its advanced properties properly configured. The basic properties of HTTP RLMSs (base_url, user, and password) and all the properties of the other RLMSs can be set just normally through the Edit button'), + 'validated': lazy_gettext('This RLMS has been validated in the past. This shows the outcome of the last validation process that was conducted on it') + } + column_formatters = dict( - labs = lambda v, c, rlms, p: Markup(' %s' % (url_for('.labs', id=rlms.id), gettext("list"))) + labs = lambda v, c, rlms, p: Markup(' %s' % (url_for('.labs', id=rlms.id), gettext("list"))), newrlms = newrlms_formatter ) + + def __init__(self, session, **kwargs): super(RLMSPanel, self).__init__(RLMS, session, **kwargs) # @@ -415,6 +474,124 @@ def labs(self, id): registered_labs = [ lab.laboratory_id for lab in rlms_db.laboratories ] return self.render('labmanager_admin/lab-list.html', rlms = rlms_db, labs = labs, registered_labs = registered_labs) + + @expose('/change_properties//', methods = ['GET','POST']) + def change_properties(self, id): + + + myrlms = self.session.query(RLMS).filter_by(id = id).first() + + configuration = myrlms.configuration + + jsonconfig = json.loads(configuration) + + changes = False + + if request.method == 'POST': + + if request.form['action'] == 'savechangesreturn': + + for prop_name, value in request.form.items(): + + if prop_name != 'action' and value != '': + + old_prop_value =self.session.query(HTTP_RLMS_Property).filter_by(name = prop_name, rlms = myrlms).first() + + if old_prop_value: + self.session.delete(old_prop_value) + self.session.commit() + + self.session.add(HTTP_RLMS_Property(name = prop_name, value = value , rlms = myrlms)) + myrlms.newrlms = False + changes = True + + + if changes: + changes = False + self.session.commit() + + + return redirect(url_for('.index_view')) + + + if request.form['action'] == 'return': + return redirect(url_for('.index_view')) + + + base_url = jsonconfig['base_url'] + + remote_login = jsonconfig['remote_login'] + + password = jsonconfig['password'] + + url = base_url + "/get_properties" + + r=requests.get(url, auth=(remote_login, password)) + + properties_list_json = r.json() + + properties_list = create_properties_list(properties_list_json) + + prop_value_list = create_values_list(self, properties_list, myrlms.id) + + + + return self.render('labmanager_admin/rlms_properties_list.html', rlms = myrlms, prop_value_list = prop_value_list ) + + +def create_values_list(self, properties_list, rlms_id): + + prop_value_list = [] + db_properties = self.session.query(HTTP_RLMS_Property).filter_by(rlms_id = rlms_id) + value = "" + + for prop in properties_list: + for db_prop in db_properties: + if prop == db_prop.name: + value = db_prop.value + + prop_value = (prop, value) + + prop_value_list.append(prop_value) + + value="" + + return prop_value_list + + # rlms = self.session.query(RLMS).filter_by(id = rlms_id).first() + # configuration = json.loads(rlms.configuration) + + + # prop_list_db = configuration.keys() + + # for prop in properties_list: + # + # if prop in prop_list_db: + # + # value = configuration.get(prop) + + # else: + # value = "" + + # prop_value = (prop, value) + + # prop_value_list.append(prop_value) + # + # return prop_value_list + + +def create_properties_list(properties_list_json): + + prop_list = [] + for prop in properties_list_json["properties"]: + prop_name_list = prop.keys() + prop_name = prop_name_list[0] + + prop_list.append(prop_name) + + return prop_list + + def accessibility_formatter(v, c, lab, p): if lab.available: klass = 'btn-danger' diff --git a/messages.pot b/messages.pot index 95f8e06..a5a1dfd 100644 --- a/messages.pot +++ b/messages.pot @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gateway4labs VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-05-07 16:52+0200\n" +"POT-Creation-Date: 2014-05-16 14:47+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -46,12 +46,12 @@ msgid "Labmanager password" msgstr "" #: labmanager/forms.py:38 labmanager/forms.py:42 labmanager/forms.py:55 -#: labmanager/views/admin.py:91 labmanager/views/admin.py:122 +#: labmanager/views/admin.py:94 labmanager/views/admin.py:125 #: labmanager/views/lms/admin.py:106 msgid "This field is required." msgstr "" -#: labmanager/forms.py:46 labmanager/views/opensocial.py:226 +#: labmanager/forms.py:46 labmanager/views/opensocial.py:236 #: labmanager/views/lms/admin.py:81 msgid "Login" msgstr "" @@ -61,17 +61,17 @@ msgstr "" #: labmanager/templates/login_lms.html:84 #: labmanager/templates/login_lms.html:86 #: labmanager/templates/login_ple.html:84 -#: labmanager/templates/login_ple.html:86 labmanager/views/opensocial.py:227 +#: labmanager/templates/login_ple.html:86 labmanager/views/opensocial.py:237 #: labmanager/views/lms/admin.py:84 msgid "Password" msgstr "" -#: labmanager/forms.py:62 labmanager/forms.py:93 +#: labmanager/forms.py:62 labmanager/forms.py:92 #: labmanager/templates/labmanager_admin/lab-list.html:12 msgid "Identifier" msgstr "" -#: labmanager/forms.py:69 labmanager/forms.py:109 +#: labmanager/forms.py:69 labmanager/forms.py:108 #, python-format msgid "Invalid characters found: %(char)s" msgstr "" @@ -80,62 +80,62 @@ msgstr "" msgid "login lenght must be at least 5 characters long" msgstr "" -#: labmanager/forms.py:82 +#: labmanager/forms.py:81 msgid "Passwords can not contain a space" msgstr "" -#: labmanager/forms.py:84 +#: labmanager/forms.py:83 msgid "password lenght must be at least 8 characters long" msgstr "" -#: labmanager/forms.py:97 +#: labmanager/forms.py:96 msgid "Oficial name must be between 4 and 50 characters long" msgstr "" -#: labmanager/forms.py:103 +#: labmanager/forms.py:102 msgid "Short name must be between 4 and 15 characters long" msgstr "" -#: labmanager/forms.py:115 +#: labmanager/forms.py:114 msgid "Oficial name must be between 4 and 15 characters long" msgstr "" -#: labmanager/models.py:110 +#: labmanager/models.py:123 #, python-format msgid "%(kind)s on %(location)s" msgstr "" -#: labmanager/models.py:142 +#: labmanager/models.py:186 #, python-format msgid "%(name)s at %(rlms)s" msgstr "" -#: labmanager/models.py:207 +#: labmanager/models.py:251 #, python-format msgid "Basic HTTP auth for %(name)s" msgstr "" -#: labmanager/models.py:239 +#: labmanager/models.py:283 #, python-format msgid "ShindigCredentials for %(lmsname)s" msgstr "" -#: labmanager/models.py:312 +#: labmanager/models.py:356 #, python-format msgid "%(coursename)s on %(courselms)s" msgstr "" -#: labmanager/models.py:354 +#: labmanager/models.py:398 #, python-format msgid "%(identifier)s: lab %(labname)s to %(lmsname)s" msgstr "" -#: labmanager/models.py:410 +#: labmanager/models.py:454 #, python-format msgid "%(coursename)s from %(lmsname)s on %(permission)s" msgstr "" -#: labmanager/models.py:440 +#: labmanager/models.py:484 #, python-format msgid "'%(localidentifier)s': lab %(labname)s to %(ltname)s" msgstr "" @@ -392,6 +392,7 @@ msgid "Available labs for " msgstr "" #: labmanager/templates/labmanager_admin/lab-list.html:3 +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:3 msgid "at" msgstr "" @@ -411,6 +412,28 @@ msgstr "" msgid "No laboratory found" msgstr "" +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:3 +msgid "Properties for" +msgstr "" + +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:11 +#: labmanager/templates/lti/display_lab.html:20 +msgid "Property" +msgstr "" + +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:12 +#: labmanager/templates/lti/display_lab.html:21 +msgid "Value" +msgstr "" + +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:28 +msgid "Save and return" +msgstr "" + +#: labmanager/templates/labmanager_admin/rlms_properties_list.html:30 +msgid "Return" +msgstr "" + #: labmanager/templates/lms_admin/discover-errors.html:3 #: labmanager/templates/lms_admin/discover.html:3 msgid "Discover courses" @@ -487,7 +510,7 @@ msgstr "" #: labmanager/templates/lti/display_lab.html:5 #: labmanager/templates/lti/errors.html:5 -#: labmanager/templates/opensocial/errors.html:5 labmanager/views/admin.py:572 +#: labmanager/templates/opensocial/errors.html:5 labmanager/views/admin.py:746 msgid "Lab Manager" msgstr "" @@ -495,19 +518,11 @@ msgstr "" msgid "Access the laboratory" msgstr "" -#: labmanager/templates/lti/display_lab.html:20 -msgid "Property" -msgstr "" - -#: labmanager/templates/lti/display_lab.html:21 -msgid "Value" -msgstr "" - -#: labmanager/templates/lti/display_lab.html:26 labmanager/views/admin.py:536 +#: labmanager/templates/lti/display_lab.html:26 labmanager/views/admin.py:710 msgid "Laboratory" msgstr "" -#: labmanager/templates/lti/display_lab.html:31 labmanager/views/admin.py:579 +#: labmanager/templates/lti/display_lab.html:31 labmanager/views/admin.py:753 #: labmanager/views/ple/instructor.py:98 msgid "RLMS" msgstr "" @@ -687,252 +702,296 @@ msgstr "" msgid "Invalid JSON" msgstr "" -#: labmanager/views/admin.py:81 labmanager/views/admin.py:225 -#: labmanager/views/admin.py:470 labmanager/views/public.py:43 +#: labmanager/views/admin.py:84 labmanager/views/admin.py:228 +#: labmanager/views/admin.py:646 labmanager/views/public.py:43 #: labmanager/views/ple/admin.py:229 labmanager/views/ple/admin.py:278 #: labmanager/views/ple/admin.py:342 msgid "name" msgstr "" -#: labmanager/views/admin.py:81 labmanager/views/admin.py:109 +#: labmanager/views/admin.py:84 labmanager/views/admin.py:112 #: labmanager/views/ple/admin.py:86 msgid "login" msgstr "" -#: labmanager/views/admin.py:81 labmanager/views/ple/admin.py:89 +#: labmanager/views/admin.py:84 labmanager/views/ple/admin.py:89 msgid "password" msgstr "" -#: labmanager/views/admin.py:109 labmanager/views/admin.py:174 -#: labmanager/views/admin.py:534 +#: labmanager/views/admin.py:112 labmanager/views/admin.py:177 +#: labmanager/views/admin.py:708 msgid "lt" msgstr "" -#: labmanager/views/admin.py:109 labmanager/views/admin.py:225 +#: labmanager/views/admin.py:112 labmanager/views/admin.py:228 #: labmanager/views/ple/admin.py:87 msgid "full_name" msgstr "" -#: labmanager/views/admin.py:109 labmanager/views/ple/admin.py:88 +#: labmanager/views/admin.py:112 labmanager/views/ple/admin.py:88 msgid "access_level" msgstr "" -#: labmanager/views/admin.py:144 +#: labmanager/views/admin.py:147 msgid "Accept request" msgstr "" -#: labmanager/views/admin.py:157 +#: labmanager/views/admin.py:160 msgid "Reject request" msgstr "" -#: labmanager/views/admin.py:174 labmanager/views/admin.py:534 +#: labmanager/views/admin.py:177 labmanager/views/admin.py:708 msgid "laboratory" msgstr "" -#: labmanager/views/admin.py:174 labmanager/views/admin.py:534 +#: labmanager/views/admin.py:177 labmanager/views/admin.py:708 #: labmanager/views/ple/admin.py:231 msgid "local_identifier" msgstr "" -#: labmanager/views/admin.py:174 +#: labmanager/views/admin.py:177 msgid "accept" msgstr "" -#: labmanager/views/admin.py:174 +#: labmanager/views/admin.py:177 msgid "reject" msgstr "" -#: labmanager/views/admin.py:177 +#: labmanager/views/admin.py:180 msgid "The laboratory that has been requested" msgstr "" -#: labmanager/views/admin.py:178 +#: labmanager/views/admin.py:181 msgid "Learning Management System which created each request" msgstr "" -#: labmanager/views/admin.py:179 +#: labmanager/views/admin.py:182 msgid "Unique identifier for a LT to access a laboratory" msgstr "" -#: labmanager/views/admin.py:211 +#: labmanager/views/admin.py:214 msgid "Login of the LT when contacting the LabManager" msgstr "" -#: labmanager/views/admin.py:220 labmanager/views/lms/admin.py:196 +#: labmanager/views/admin.py:223 labmanager/views/lms/admin.py:196 #: labmanager/views/lms/admin.py:204 labmanager/views/ple/admin.py:134 #: labmanager/views/ple/instructor.py:85 msgid "N/A" msgstr "" -#: labmanager/views/admin.py:225 labmanager/views/admin.py:289 +#: labmanager/views/admin.py:228 labmanager/views/admin.py:339 #: labmanager/views/ple/admin.py:344 msgid "url" msgstr "" -#: labmanager/views/admin.py:225 +#: labmanager/views/admin.py:228 msgid "download" msgstr "" -#: labmanager/views/admin.py:227 +#: labmanager/views/admin.py:230 msgid "Institution short name (lower case, all letters, dots and numbers)" msgstr "" -#: labmanager/views/admin.py:227 +#: labmanager/views/admin.py:230 msgid "Name of the institution." msgstr "" -#: labmanager/views/admin.py:289 +#: labmanager/views/admin.py:293 +msgid "UNCOMPLETE" +msgstr "" + +#: labmanager/views/admin.py:295 +msgid "Click to complete" +msgstr "" + +#: labmanager/views/admin.py:301 +msgid "COMPLETE" +msgstr "" + +#: labmanager/views/admin.py:303 +msgid "Click to modify" +msgstr "" + +#: labmanager/views/admin.py:339 msgid "kind" msgstr "" -#: labmanager/views/admin.py:289 +#: labmanager/views/admin.py:339 msgid "version" msgstr "" -#: labmanager/views/admin.py:289 +#: labmanager/views/admin.py:339 msgid "location" msgstr "" -#: labmanager/views/admin.py:289 +#: labmanager/views/admin.py:339 msgid "labs" msgstr "" -#: labmanager/views/admin.py:292 +#: labmanager/views/admin.py:339 +msgid "validated" +msgstr "" + +#: labmanager/views/admin.py:339 +msgid "completed" +msgstr "" + +#: labmanager/views/admin.py:344 msgid "City and country where the RLMS is hosted" msgstr "" -#: labmanager/views/admin.py:293 +#: labmanager/views/admin.py:345 msgid "Main URL of the RLMS" msgstr "" -#: labmanager/views/admin.py:422 +#: labmanager/views/admin.py:346 +msgid "" +"This is of interest to HTTP RLMSs only. This column means that this HTTP " +"RLMS has all its advanced properties properly configured. The basic " +"properties of HTTP RLMSs (base_url, user, and password) and all the " +"properties of the other RLMSs can be set just normally through the Edit " +"button" +msgstr "" + +#: labmanager/views/admin.py:347 +msgid "" +"This RLMS has been validated in the past. This shows the outcome of the " +"last validation process that was conducted on it" +msgstr "" + +#: labmanager/views/admin.py:353 labmanager/views/public.py:36 +#: labmanager/views/ple/admin.py:137 labmanager/views/ple/instructor.py:88 +msgid "list" +msgstr "" + +#: labmanager/views/admin.py:598 msgid "Make not available" msgstr "" -#: labmanager/views/admin.py:425 +#: labmanager/views/admin.py:601 msgid "Make available" msgstr "" -#: labmanager/views/admin.py:436 +#: labmanager/views/admin.py:612 msgid "Default local identifier:" msgstr "" -#: labmanager/views/admin.py:445 +#: labmanager/views/admin.py:621 msgid "Make not publicly available" msgstr "" -#: labmanager/views/admin.py:448 +#: labmanager/views/admin.py:624 msgid "Make publicly available" msgstr "" -#: labmanager/views/admin.py:459 +#: labmanager/views/admin.py:635 msgid "Public identifier:" msgstr "" -#: labmanager/views/admin.py:470 labmanager/views/public.py:43 +#: labmanager/views/admin.py:646 labmanager/views/public.py:43 #: labmanager/views/ple/admin.py:228 labmanager/views/ple/admin.py:278 msgid "rlms" msgstr "" -#: labmanager/views/admin.py:470 labmanager/views/public.py:43 +#: labmanager/views/admin.py:646 labmanager/views/public.py:43 #: labmanager/views/ple/admin.py:230 labmanager/views/ple/admin.py:278 msgid "laboratory_id" msgstr "" -#: labmanager/views/admin.py:470 +#: labmanager/views/admin.py:646 msgid "visibility" msgstr "" -#: labmanager/views/admin.py:470 +#: labmanager/views/admin.py:646 msgid "availability" msgstr "" -#: labmanager/views/admin.py:470 +#: labmanager/views/admin.py:646 msgid "public_availability" msgstr "" -#: labmanager/views/admin.py:473 +#: labmanager/views/admin.py:649 msgid "Make this laboratory automatically available for the Learning Tools" msgstr "" -#: labmanager/views/admin.py:474 +#: labmanager/views/admin.py:650 msgid "" "Make this laboratory automatically available even from outside the " "registered Learning Tools" msgstr "" -#: labmanager/views/admin.py:490 +#: labmanager/views/admin.py:666 #, python-format msgid "Local identifier '%(localidentifier)s' already exists" msgstr "" -#: labmanager/views/admin.py:495 +#: labmanager/views/admin.py:671 msgid "Invalid local identifier (empty)" msgstr "" -#: labmanager/views/admin.py:511 +#: labmanager/views/admin.py:687 #, python-format msgid "Public identifier '%(publicidentifier)s' already exists" msgstr "" -#: labmanager/views/admin.py:518 +#: labmanager/views/admin.py:692 msgid "Invalid public identifier (empty)" msgstr "" -#: labmanager/views/admin.py:534 +#: labmanager/views/admin.py:708 msgid "configuration" msgstr "" -#: labmanager/views/admin.py:534 +#: labmanager/views/admin.py:708 msgid "SCORM" msgstr "" -#: labmanager/views/admin.py:537 +#: labmanager/views/admin.py:711 msgid "Learning Management System" msgstr "" -#: labmanager/views/admin.py:538 +#: labmanager/views/admin.py:712 msgid "Unique identifier for a Learning Tool to access a laboratory" msgstr "" -#: labmanager/views/admin.py:573 +#: labmanager/views/admin.py:747 msgid "LT Management" msgstr "" -#: labmanager/views/admin.py:574 +#: labmanager/views/admin.py:748 msgid "LT" msgstr "" -#: labmanager/views/admin.py:575 +#: labmanager/views/admin.py:749 msgid "LT Permissions" msgstr "" -#: labmanager/views/admin.py:576 +#: labmanager/views/admin.py:750 msgid "LT Users" msgstr "" -#: labmanager/views/admin.py:577 +#: labmanager/views/admin.py:751 msgid "LT Requests" msgstr "" -#: labmanager/views/admin.py:578 +#: labmanager/views/admin.py:752 msgid "ReLMS Management" msgstr "" -#: labmanager/views/admin.py:580 +#: labmanager/views/admin.py:754 msgid "Registered labs" msgstr "" -#: labmanager/views/admin.py:581 labmanager/views/lms/admin.py:386 +#: labmanager/views/admin.py:755 labmanager/views/lms/admin.py:386 #: labmanager/views/lms/admin.py:387 labmanager/views/ple/admin.py:494 msgid "Users" msgstr "" -#: labmanager/views/admin.py:581 +#: labmanager/views/admin.py:755 msgid "Labmanager Users" msgstr "" -#: labmanager/views/admin.py:582 labmanager/views/lms/admin.py:389 +#: labmanager/views/admin.py:756 labmanager/views/lms/admin.py:389 #: labmanager/views/lms/instructor.py:86 labmanager/views/ple/admin.py:495 #: labmanager/views/ple/instructor.py:156 msgid "Log out" @@ -1085,64 +1144,59 @@ msgstr "" msgid "Could not connect to %(urlshindig)s." msgstr "" -#: labmanager/views/opensocial.py:205 +#: labmanager/views/opensocial.py:211 msgid "Institution not found or it does not support Shindig" msgstr "" -#: labmanager/views/opensocial.py:210 labmanager/views/ple/admin.py:253 +#: labmanager/views/opensocial.py:216 labmanager/views/ple/admin.py:253 #: labmanager/views/ple/instructor.py:121 msgid "Laboratory not found" msgstr "" -#: labmanager/views/opensocial.py:222 +#: labmanager/views/opensocial.py:232 msgid "School name" msgstr "" -#: labmanager/views/opensocial.py:222 +#: labmanager/views/opensocial.py:232 msgid "School name." msgstr "" -#: labmanager/views/opensocial.py:223 +#: labmanager/views/opensocial.py:233 msgid "Short name" msgstr "" -#: labmanager/views/opensocial.py:223 +#: labmanager/views/opensocial.py:233 msgid "Short name (lower case, all letters, dots and numbers)." msgstr "" -#: labmanager/views/opensocial.py:224 +#: labmanager/views/opensocial.py:234 msgid "School URL" msgstr "" -#: labmanager/views/opensocial.py:224 +#: labmanager/views/opensocial.py:234 msgid "Address of your school." msgstr "" -#: labmanager/views/opensocial.py:225 +#: labmanager/views/opensocial.py:235 msgid "User name" msgstr "" -#: labmanager/views/opensocial.py:225 +#: labmanager/views/opensocial.py:235 msgid "Your name and last name." msgstr "" -#: labmanager/views/opensocial.py:226 +#: labmanager/views/opensocial.py:236 msgid "Your new login (you can create more later)." msgstr "" -#: labmanager/views/opensocial.py:227 +#: labmanager/views/opensocial.py:237 msgid "Your access password." msgstr "" -#: labmanager/views/opensocial.py:235 labmanager/views/opensocial.py:238 +#: labmanager/views/opensocial.py:245 labmanager/views/opensocial.py:248 msgid "This name is already taken" msgstr "" -#: labmanager/views/public.py:36 labmanager/views/ple/admin.py:137 -#: labmanager/views/ple/instructor.py:88 -msgid "list" -msgstr "" - #: labmanager/views/public.py:43 msgid "public_identifier" msgstr ""