From 0d6171bc0f3e385aa42995d2f6efd16710e64745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez?= Date: Fri, 20 Jun 2014 13:24:18 +0000 Subject: [PATCH] Adding "user friendly" editors to Configuration... :-) --- .../org.eclipse.core.resources.prefs | 4 +- server/src/uds/REST/methods/config.py | 3 +- server/src/uds/core/util/Config.py | 111 ++++---- .../0019_auto__add_field_config_field_type.py | 240 ++++++++++++++++++ server/src/uds/models/Config.py | 3 +- .../src/uds/static/adm/js/gui-d-config.coffee | 1 + .../uds/admin/tmpl/authenticators.html | 4 +- .../uds/admin/tmpl/configuration.html | 24 +- .../templates/uds/html5/templates/base.html | 2 +- server/src/uds/templatetags/html5.py | 2 +- 10 files changed, 328 insertions(+), 66 deletions(-) create mode 100644 server/src/uds/migrations/0019_auto__add_field_config_field_type.py diff --git a/server/.settings/org.eclipse.core.resources.prefs b/server/.settings/org.eclipse.core.resources.prefs index ea272fa50..1cda9bb2e 100644 --- a/server/.settings/org.eclipse.core.resources.prefs +++ b/server/.settings/org.eclipse.core.resources.prefs @@ -259,9 +259,11 @@ encoding//src/uds/tests/core/__init__.py=utf-8 encoding//src/uds/tests/core/util/cache.py=utf-8 encoding//src/uds/tests/core/util/net.py=utf-8 encoding//src/uds/tests/core/util/storage.py=utf-8 +encoding//src/uds/tests/util/UDSWebTest.py=utf-8 encoding//src/uds/tests/web/__init__.py=utf-8 encoding//src/uds/tests/web/admin/auth/__init__.py=utf-8 -encoding//src/uds/tests/web/admin/auth/create.py=utf-8 +encoding//src/uds/tests/web/admin/auth/create_auth.py=utf-8 +encoding//src/uds/tests/web/admin/auth/create_user.py=utf-8 encoding//src/uds/tests/web/auth/__init__.py=utf-8 encoding//src/uds/transports/HTML5RDP/HTML5RDP.py=utf-8 encoding//src/uds/transports/HTML5RDP/__init__.py=utf-8 diff --git a/server/src/uds/REST/methods/config.py b/server/src/uds/REST/methods/config.py index e5e68e431..a0a44bd7c 100644 --- a/server/src/uds/REST/methods/config.py +++ b/server/src/uds/REST/methods/config.py @@ -59,7 +59,8 @@ class Config(Handler): res[cfg.section()][cfg.key()] = { 'value': cfg.get(), 'crypt': cfg.isCrypted(), - 'longText': cfg.isLongText() + 'longText': cfg.isLongText(), + 'type': cfg.getType() } logger.debug('Configuration: {0}'.format(res)) return res diff --git a/server/src/uds/core/util/Config.py b/server/src/uds/core/util/Config.py index b59b1784b..1bb3178ec 100644 --- a/server/src/uds/core/util/Config.py +++ b/server/src/uds/core/util/Config.py @@ -43,14 +43,20 @@ GLOBAL_SECTION = 'UDS' SECURITY_SECTION = 'Security' CLUSTER_SECTION = 'Cluster' - class Config(object): ''' - Keeps persistend configuration data + Keeps persistence configuration data ''' + # Fields types, so inputs get more "beautiful" + TEXT_FIELD = 0 + LONGTEXT_FIELD = 1 + NUMERIC_FIELD = 2 + BOOLEAN_FIELD = 3 + class _Value(object): - def __init__(self, section, key, default='', crypt=False, longText=False): + def __init__(self, section, key, default='', crypt=False, longText=False, **kwargs): + self._type = kwargs.get('type', -1) self._section = section self._key = key self._crypt = crypt @@ -69,6 +75,10 @@ class Config(object): self._data = readed.value self._crypt = [self._crypt, True][readed.crypt] # True has "higher" precedende than False self._longText = readed.long + if readed.field_type == -1 and self._type != -1: + readed.field_type = self._type + readed.save() + self._type = readed.field_type except Exception: # Not found if self._default != '' and self._crypt: @@ -109,6 +119,9 @@ class Config(object): def isLongText(self): return self._longText + def getType(self): + return self._type + def set(self, value): if self._crypt is True: value = CryptoManager.manager().encrypt(value) @@ -117,11 +130,11 @@ class Config(object): ''' logger.debug('Saving config {0}.{1} as {2}'.format(self._section.name(), self._key, value)) try: - if dbConfig.objects.filter(section=self._section.name(), key=self._key).update(value=value, crypt=self._crypt, long=self._longText) == 0: + if dbConfig.objects.filter(section=self._section.name(), key=self._key).update(value=value, crypt=self._crypt, long=self._longText, field_type=self._type) == 0: raise Exception() # Do not exists, create a new one except Exception: try: - dbConfig.objects.create(section=self._section.name(), key=self._key, value=value, crypt=self._crypt, long=self._longText) + dbConfig.objects.create(section=self._section.name(), key=self._key, value=value, crypt=self._crypt, long=self._longText, field_type=self._type) except Exception: # Probably a migration issue, just ignore it logger.info("Could not save configuration key {0}.{1}".format(self._section.name(), self._key)) @@ -130,14 +143,14 @@ class Config(object): def __init__(self, sectionName): self._sectionName = sectionName - def value(self, key, default=''): - return Config._Value(self, key, default) + def value(self, key, default='', **kwargs): + return Config._Value(self, key, default, **kwargs) - def valueCrypt(self, key, default=''): - return Config._Value(self, key, default, True) + def valueCrypt(self, key, default='', **kwargs): + return Config._Value(self, key, default, True, **kwargs) - def valueLong(self, key, default=''): - return Config._Value(self, key, default, False, True) + def valueLong(self, key, default='', **kwargs): + return Config._Value(self, key, default, False, True, **kwargs) def name(self): return self._sectionName @@ -149,7 +162,7 @@ class Config(object): @staticmethod def enumerate(): for cfg in dbConfig.objects.all().order_by('key'): - logger.debug('{0}.{1}:{2}'.format(cfg.section, cfg.key, cfg.value)) + logger.debug('{0}.{1}:{2},{3}'.format(cfg.section, cfg.key, cfg.value, cfg.field_type)) if cfg.crypt is True: val = Config.section(cfg.section).valueCrypt(cfg.key) else: @@ -174,92 +187,92 @@ class GlobalConfig(object): ''' Simple helper to keep track of global configuration ''' - SESSION_EXPIRE_TIME = Config.section(GLOBAL_SECTION).value('sessionExpireTime', '24') # Max session duration (in use) after a new publishment has been made + SESSION_EXPIRE_TIME = Config.section(GLOBAL_SECTION).value('sessionExpireTime', '24', type=Config.NUMERIC_FIELD) # Max session duration (in use) after a new publishment has been made # Delay between cache checks. reducing this number will increase cache generation speed but also will load service providers - CACHE_CHECK_DELAY = Config.section(GLOBAL_SECTION).value('cacheCheckDelay', '19') + CACHE_CHECK_DELAY = Config.section(GLOBAL_SECTION).value('cacheCheckDelay', '19', type=Config.NUMERIC_FIELD) # Delayed task number of threads PER SERVER, with higher number of threads, deplayed task will complete sooner, but it will give more load to overall system - DELAYED_TASKS_THREADS = Config.section(GLOBAL_SECTION).value('delayedTasksThreads', '4') + DELAYED_TASKS_THREADS = Config.section(GLOBAL_SECTION).value('delayedTasksThreads', '4', type=Config.NUMERIC_FIELD) # Number of scheduler threads running PER SERVER, with higher number of threads, deplayed task will complete sooner, but it will give more load to overall system - SCHEDULER_THREADS = Config.section(GLOBAL_SECTION).value('schedulerThreads', '3') + SCHEDULER_THREADS = Config.section(GLOBAL_SECTION).value('schedulerThreads', '3', type=Config.NUMERIC_FIELD) # Waiting time before removing "errored" and "removed" publications, cache, and user assigned machines. Time is in seconds - CLEANUP_CHECK = Config.section(GLOBAL_SECTION).value('cleanupCheck', '3607') + CLEANUP_CHECK = Config.section(GLOBAL_SECTION).value('cleanupCheck', '3607', type=Config.NUMERIC_FIELD) # Time to maintaing "info state" items before removing it, in seconds - KEEP_INFO_TIME = Config.section(GLOBAL_SECTION).value('keepInfoTime', '14401') # Defaults to 2 days 172800?? better 4 hours xd + KEEP_INFO_TIME = Config.section(GLOBAL_SECTION).value('keepInfoTime', '14401', type=Config.NUMERIC_FIELD) # Defaults to 2 days 172800?? better 4 hours xd # Max number of services to be "preparing" at same time - MAX_PREPARING_SERVICES = Config.section(GLOBAL_SECTION).value('maxPreparingServices', '15') # Defaults to 15 services at once (per service provider) + MAX_PREPARING_SERVICES = Config.section(GLOBAL_SECTION).value('maxPreparingServices', '15', type=Config.NUMERIC_FIELD) # Defaults to 15 services at once (per service provider) # Max number of service to be at "removal" state at same time - MAX_REMOVING_SERVICES = Config.section(GLOBAL_SECTION).value('maxRemovingServices', '15') # Defaults to 15 services at once (per service provider) + MAX_REMOVING_SERVICES = Config.section(GLOBAL_SECTION).value('maxRemovingServices', '15', type=Config.NUMERIC_FIELD) # Defaults to 15 services at once (per service provider) # If we ignore limits (max....) - IGNORE_LIMITS = Config.section(GLOBAL_SECTION).value('ignoreLimits', '0') + IGNORE_LIMITS = Config.section(GLOBAL_SECTION).value('ignoreLimits', '0', type=Config.BOOLEAN_FIELD) # Number of services to initiate removal per run of CacheCleaner - USER_SERVICE_CLEAN_NUMBER = Config.section(GLOBAL_SECTION).value('userServiceCleanNumber', '3') # Defaults to 3 per wun + USER_SERVICE_CLEAN_NUMBER = Config.section(GLOBAL_SECTION).value('userServiceCleanNumber', '3', type=Config.NUMERIC_FIELD) # Defaults to 3 per wun # Removal Check time for cache, publications and deployed services - REMOVAL_CHECK = Config.section(GLOBAL_SECTION).value('removalCheck', '31') # Defaults to 30 seconds + REMOVAL_CHECK = Config.section(GLOBAL_SECTION).value('removalCheck', '31', type=Config.NUMERIC_FIELD) # Defaults to 30 seconds # Login URL - LOGIN_URL = Config.section(GLOBAL_SECTION).value('loginUrl', '/login') # Defaults to /login + LOGIN_URL = Config.section(GLOBAL_SECTION).value('loginUrl', '/login', type=Config.TEXT_FIELD) # Defaults to /login # Session duration - USER_SESSION_LENGTH = Config.section(SECURITY_SECTION).value('userSessionLength', '14400') # Defaults to 4 hours + USER_SESSION_LENGTH = Config.section(SECURITY_SECTION).value('userSessionLength', '14400', type=Config.NUMERIC_FIELD) # Defaults to 4 hours # Superuser (do not need to be at database!!!) - SUPER_USER_LOGIN = Config.section(SECURITY_SECTION).value('superUser', 'root') # Defaults to 4 hours + SUPER_USER_LOGIN = Config.section(SECURITY_SECTION).value('superUser', 'root', type=Config.TEXT_FIELD) # Superuser password (do not need to be at database!!!) - SUPER_USER_PASS = Config.section(SECURITY_SECTION).valueCrypt('rootPass', 'udsmam0') + SUPER_USER_PASS = Config.section(SECURITY_SECTION).valueCrypt('rootPass', 'udsmam0', type=Config.TEXT_FIELD) # Idle time before closing session on admin - SUPER_USER_ALLOW_WEBACCESS = Config.section(SECURITY_SECTION).value('allowRootWebAccess', '1') + SUPER_USER_ALLOW_WEBACCESS = Config.section(SECURITY_SECTION).value('allowRootWebAccess', '1', type=Config.BOOLEAN_FIELD) # Time an admi session can be idle before being "logged out" - ADMIN_IDLE_TIME = Config.section(SECURITY_SECTION).value('adminIdleTime', '14400') # Defaults to 4 hous + ADMIN_IDLE_TIME = Config.section(SECURITY_SECTION).value('adminIdleTime', '14400', type=Config.NUMERIC_FIELD) # Defaults to 4 hous # Time betwen checks of unused services by os managers # Unused services will be invoked for every machine assigned but not in use AND that has been assigned at least this time # (only if os manager asks for this characteristic) - CHECK_UNUSED_TIME = Config.section(GLOBAL_SECTION).value('checkUnusedTime', '631') # Defaults to 10 minutes + CHECK_UNUSED_TIME = Config.section(GLOBAL_SECTION).value('checkUnusedTime', '631', type=Config.TEXT_FIELD) # Defaults to 10 minutes # Default CSS Used - CSS = Config.section(GLOBAL_SECTION).value('css', settings.STATIC_URL + 'css/uds.css') + CSS = Config.section(GLOBAL_SECTION).value('css', settings.STATIC_URL + 'css/uds.css', type=Config.TEXT_FIELD) # Max logins before blocking an account - MAX_LOGIN_TRIES = Config.section(GLOBAL_SECTION).value('maxLoginTries', '3') + MAX_LOGIN_TRIES = Config.section(GLOBAL_SECTION).value('maxLoginTries', '3', type=Config.NUMERIC_FIELD) # Block time in second for an user that makes too many mistakes, 5 minutes default - LOGIN_BLOCK = Config.section(GLOBAL_SECTION).value('loginBlockTime', '300') + LOGIN_BLOCK = Config.section(GLOBAL_SECTION).value('loginBlockTime', '300', type=Config.NUMERIC_FIELD) # Do autorun of service if just one service. # 0 = No autorun, 1 = Autorun at login # In a future, maybe necessary another value "2" that means that autorun always - AUTORUN_SERVICE = Config.section(GLOBAL_SECTION).value('autorunService', '0') + AUTORUN_SERVICE = Config.section(GLOBAL_SECTION).value('autorunService', '0', type=Config.BOOLEAN_FIELD) # Redirect HTTP to HTTPS - REDIRECT_TO_HTTPS = Config.section(GLOBAL_SECTION).value('redirectToHttps', '0') + REDIRECT_TO_HTTPS = Config.section(GLOBAL_SECTION).value('redirectToHttps', '0', type=Config.BOOLEAN_FIELD) # Max time needed to get a service "fully functional" before it's considered "failed" and removed # The time is in seconds - MAX_INITIALIZING_TIME = Config.section(GLOBAL_SECTION).value('maxInitTime', '3600') + MAX_INITIALIZING_TIME = Config.section(GLOBAL_SECTION).value('maxInitTime', '3600', type=Config.NUMERIC_FIELD) # Custom HTML for login page - CUSTOM_HTML_LOGIN = Config.section(GLOBAL_SECTION).valueLong('customHtmlLogin', '') + CUSTOM_HTML_LOGIN = Config.section(GLOBAL_SECTION).value('customHtmlLogin', '', type=Config.LONGTEXT_FIELD) # Maximum logs per user service - MAX_LOGS_PER_ELEMENT = Config.section(GLOBAL_SECTION).value('maxLogPerElement', '100') + MAX_LOGS_PER_ELEMENT = Config.section(GLOBAL_SECTION).value('maxLogPerElement', '100', type=Config.NUMERIC_FIELD) # Time to restrain a deployed service in case it gives some errors at some point - RESTRAINT_TIME = Config.section(GLOBAL_SECTION).value('restrainTime', '600') + RESTRAINT_TIME = Config.section(GLOBAL_SECTION).value('restrainTime', '600', type=Config.NUMERIC_FIELD) # Number of errors that must occurr in RESTRAIN_TIME to restrain deployed service - RESTRAINT_COUNT = Config.section(GLOBAL_SECTION).value('restrainCount', '3') + RESTRAINT_COUNT = Config.section(GLOBAL_SECTION).value('restrainCount', '3', type=Config.NUMERIC_FIELD) # Statistics duration, in days - STATS_DURATION = Config.section(GLOBAL_SECTION).value('statsDuration', '365') + STATS_DURATION = Config.section(GLOBAL_SECTION).value('statsDuration', '365', type=Config.NUMERIC_FIELD) # If disallow login using /login url, and must go to an authenticator - DISALLOW_GLOBAL_LOGIN = Config.section(GLOBAL_SECTION).value('disallowGlobalLogin', '0') + DISALLOW_GLOBAL_LOGIN = Config.section(GLOBAL_SECTION).value('disallowGlobalLogin', '0', type=Config.BOOLEAN_FIELD) # Allowed "trusted sources" for request - TRUSTED_SOURCES = Config.section(SECURITY_SECTION).value('Trusted Hosts', '*') + TRUSTED_SOURCES = Config.section(SECURITY_SECTION).value('Trusted Hosts', '*', type=Config.TEXT_FIELD) # Clusters related vars # Maximum desired CPU Load. If cpu is over this value, a migration of a service is "desirable" - CLUSTER_MIGRATE_CPULOAD = Config.section(CLUSTER_SECTION).value('Migration CPU Load', '80') + CLUSTER_MIGRATE_CPULOAD = Config.section(CLUSTER_SECTION).value('Migration CPU Load', '80', type=Config.NUMERIC_FIELD) # Maximum CPU Load for a node to be elegible for destination of a migration - CLUSTER_ELEGIBLE_CPULOAD = Config.section(CLUSTER_SECTION).value('Destination CPU Load', '60') + CLUSTER_ELEGIBLE_CPULOAD = Config.section(CLUSTER_SECTION).value('Destination CPU Load', '60', type=Config.NUMERIC_FIELD) # Minimum desired Memory free for a cluster node. If free memory (in %) is under this percentage, # a migration of a service inside this node is "desirable" - CLUSTER_MIGRATE_MEMORYLOAD = Config.section(CLUSTER_SECTION).value('Migration Free Memory', '20') + CLUSTER_MIGRATE_MEMORYLOAD = Config.section(CLUSTER_SECTION).value('Migration Free Memory', '20', type=Config.NUMERIC_FIELD) # Minimum Free memory for a node to be elegible for a destination of a migration - CLUSTER_ELEGIBLE_MEMORYLOAD = Config.section(CLUSTER_SECTION).value('Migration Free Memory', '40') + CLUSTER_ELEGIBLE_MEMORYLOAD = Config.section(CLUSTER_SECTION).value('Migration Free Memory', '40', type=Config.NUMERIC_FIELD) # Gui vars - UDS_THEME = Config.section(GLOBAL_SECTION).value('UDS Theme', 'html5') + UDS_THEME = Config.section(GLOBAL_SECTION).value('UDS Theme', 'html5', type=Config.TEXT_FIELD) # This is used so templates can change "styles" from admin interface - UDS_THEME_VISUAL = Config.section(GLOBAL_SECTION).value('UDS Theme Enhaced', '1') + UDS_THEME_VISUAL = Config.section(GLOBAL_SECTION).value('UDS Theme Enhaced', '1', type=Config.BOOLEAN_FIELD) initDone = False diff --git a/server/src/uds/migrations/0019_auto__add_field_config_field_type.py b/server/src/uds/migrations/0019_auto__add_field_config_field_type.py new file mode 100644 index 000000000..28316ff74 --- /dev/null +++ b/server/src/uds/migrations/0019_auto__add_field_config_field_type.py @@ -0,0 +1,240 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Config.field_type' + db.add_column(u'uds_configuration', 'field_type', + self.gf('django.db.models.fields.IntegerField')(default=-1), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Config.field_type' + db.delete_column(u'uds_configuration', 'field_type') + + + models = { + u'uds.authenticator': { + 'Meta': {'ordering': "(u'name',)", 'object_name': 'Authenticator'}, + 'comments': ('django.db.models.fields.TextField', [], {'default': "u''"}), + 'data': ('django.db.models.fields.TextField', [], {'default': "u''"}), + 'data_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}), + 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}), + 'small_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '32', 'db_index': 'True'}) + }, + u'uds.cache': { + 'Meta': {'object_name': 'Cache', 'db_table': "u'uds_utility_cache'"}, + 'created': ('django.db.models.fields.DateTimeField', [], {}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '64', 'primary_key': 'True'}), + 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}), + 'validity': ('django.db.models.fields.IntegerField', [], {'default': '60'}), + 'value': ('django.db.models.fields.TextField', [], {'default': "u''"}) + }, + u'uds.config': { + 'Meta': {'unique_together': "((u'section', u'key'),)", 'object_name': 'Config', 'db_table': "u'uds_configuration'"}, + 'crypt': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'field_type': ('django.db.models.fields.IntegerField', [], {'default': '-1'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '64', 'db_index': 'True'}), + 'long': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'section': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}), + 'value': ('django.db.models.fields.TextField', [], {'default': "u''"}) + }, + u'uds.delayedtask': { + 'Meta': {'object_name': 'DelayedTask'}, + 'execution_delay': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'execution_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'insert_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'instance': ('django.db.models.fields.TextField', [], {}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '64', 'db_index': 'True'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + u'uds.deployedservice': { + 'Meta': {'object_name': 'DeployedService', 'db_table': "u'uds__deployed_service'"}, + 'assignedGroups': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'deployedServices'", 'symmetrical': 'False', 'db_table': "u'uds__ds_grps'", 'to': u"orm['uds.Group']"}), + 'cache_l1_srvs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'cache_l2_srvs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'comments': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '256'}), + 'current_pub_revision': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'initial_srvs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'max_srvs': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '128'}), + 'osmanager': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'deployedServices'", 'null': 'True', 'to': u"orm['uds.OSManager']"}), + 'service': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'deployedServices'", 'null': 'True', 'to': u"orm['uds.Service']"}), + 'state': ('django.db.models.fields.CharField', [], {'default': "u'A'", 'max_length': '1', 'db_index': 'True'}), + 'state_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1972, 7, 1, 0, 0)'}), + 'transports': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'deployedServices'", 'symmetrical': 'False', 'db_table': "u'uds__ds_trans'", 'to': u"orm['uds.Transport']"}) + }, + u'uds.deployedservicepublication': { + 'Meta': {'ordering': "(u'publish_date',)", 'object_name': 'DeployedServicePublication', 'db_table': "u'uds__deployed_service_pub'"}, + 'data': ('django.db.models.fields.TextField', [], {'default': "u''"}), + 'deployed_service': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'publications'", 'to': u"orm['uds.DeployedService']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'publish_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'revision': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'state': ('django.db.models.fields.CharField', [], {'default': "u'P'", 'max_length': '1', 'db_index': 'True'}), + 'state_date': ('django.db.models.fields.DateTimeField', [], {}) + }, + u'uds.group': { + 'Meta': {'ordering': "(u'name',)", 'unique_together': "((u'manager', u'name'),)", 'object_name': 'Group'}, + 'comments': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '256'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['uds.Group']", 'symmetrical': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_meta': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + 'manager': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'groups'", 'to': u"orm['uds.Authenticator']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'default': "u'A'", 'max_length': '1', 'db_index': 'True'}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'groups'", 'symmetrical': 'False', 'to': u"orm['uds.User']"}) + }, + u'uds.log': { + 'Meta': {'object_name': 'Log'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'data': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'owner_id': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}), + 'owner_type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'source': ('django.db.models.fields.CharField', [], {'default': "u'internal'", 'max_length': '16', 'db_index': 'True'}) + }, + u'uds.network': { + 'Meta': {'ordering': "(u'name',)", 'object_name': 'Network'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}), + 'net_end': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}), + 'net_start': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}), + 'net_string': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '128'}), + 'transports': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "u'networks'", 'symmetrical': 'False', 'db_table': "u'uds_net_trans'", 'to': u"orm['uds.Transport']"}) + }, + u'uds.osmanager': { + 'Meta': {'ordering': "(u'name',)", 'object_name': 'OSManager'}, + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "u''"}), + 'data_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}) + }, + u'uds.provider': { + 'Meta': {'ordering': "(u'name',)", 'object_name': 'Provider'}, + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "u''"}), + 'data_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}) + }, + u'uds.scheduler': { + 'Meta': {'object_name': 'Scheduler'}, + 'frecuency': ('django.db.models.fields.PositiveIntegerField', [], {'default': '86400'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_execution': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}), + 'next_execution': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1972, 7, 1, 0, 0)', 'db_index': 'True'}), + 'owner_server': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '64', 'db_index': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'default': "u'X'", 'max_length': '1', 'db_index': 'True'}) + }, + u'uds.service': { + 'Meta': {'ordering': "(u'name',)", 'unique_together': "((u'provider', u'name'),)", 'object_name': 'Service'}, + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "u''"}), + 'data_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'provider': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'services'", 'to': u"orm['uds.Provider']"}) + }, + u'uds.statscounters': { + 'Meta': {'object_name': 'StatsCounters', 'db_table': "u'uds_stats_c'"}, + 'counter_type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'owner_id': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}), + 'owner_type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'stamp': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}), + 'value': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}) + }, + u'uds.statsevents': { + 'Meta': {'object_name': 'StatsEvents', 'db_table': "u'uds_stats_e'"}, + 'event_type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'owner_id': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}), + 'owner_type': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'stamp': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}) + }, + u'uds.storage': { + 'Meta': {'object_name': 'Storage'}, + 'attr1': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'db_index': 'True', 'blank': 'True'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "u''"}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '64', 'primary_key': 'True'}), + 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}) + }, + u'uds.transport': { + 'Meta': {'ordering': "(u'name',)", 'object_name': 'Transport'}, + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "u''"}), + 'data_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}), + 'nets_positive': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}) + }, + u'uds.uniqueid': { + 'Meta': {'ordering': "(u'-seq',)", 'unique_together': "((u'basename', u'seq'),)", 'object_name': 'UniqueId'}, + 'assigned': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}), + 'basename': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'owner': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '128', 'db_index': 'True'}), + 'seq': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}), + 'stamp': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}) + }, + u'uds.user': { + 'Meta': {'ordering': "(u'name',)", 'unique_together': "((u'manager', u'name'),)", 'object_name': 'User'}, + 'comments': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_admin': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_access': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1972, 7, 1, 0, 0)'}), + 'manager': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'users'", 'to': u"orm['uds.Authenticator']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}), + 'parent': ('django.db.models.fields.IntegerField', [], {'default': '-1'}), + 'password': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '128'}), + 'real_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'staff_member': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'state': ('django.db.models.fields.CharField', [], {'max_length': '1', 'db_index': 'True'}) + }, + u'uds.userpreference': { + 'Meta': {'object_name': 'UserPreference'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'module': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'preferences'", 'to': u"orm['uds.User']"}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}) + }, + u'uds.userservice': { + 'Meta': {'ordering': "(u'creation_date',)", 'object_name': 'UserService', 'db_table': "u'uds__user_service'"}, + 'cache_level': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'cluster_node': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '128', 'null': 'True', 'db_index': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'data': ('django.db.models.fields.TextField', [], {'default': "u''"}), + 'deployed_service': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'userServices'", 'to': u"orm['uds.DeployedService']"}), + 'friendly_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '128'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'in_use': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'in_use_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1972, 7, 1, 0, 0)'}), + 'os_state': ('django.db.models.fields.CharField', [], {'default': "u'P'", 'max_length': '1'}), + 'publication': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'userServices'", 'null': 'True', 'to': u"orm['uds.DeployedServicePublication']"}), + 'src_hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '64'}), + 'src_ip': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '15'}), + 'state': ('django.db.models.fields.CharField', [], {'default': "u'P'", 'max_length': '1', 'db_index': 'True'}), + 'state_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'unique_id': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '128', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "u'userServices'", 'null': 'True', 'blank': 'True', 'to': u"orm['uds.User']"}) + } + } + + complete_apps = ['uds'] \ No newline at end of file diff --git a/server/src/uds/models/Config.py b/server/src/uds/models/Config.py index 1c412ccdf..ef846adc8 100644 --- a/server/src/uds/models/Config.py +++ b/server/src/uds/models/Config.py @@ -33,7 +33,7 @@ from __future__ import unicode_literals -__updated__ = '2014-04-24' +__updated__ = '2014-06-20' from django.db import models @@ -52,6 +52,7 @@ class Config(models.Model): value = models.TextField(default='') crypt = models.BooleanField(default=False) long = models.BooleanField(default=False) + field_type = models.IntegerField(default=-1) class Meta: ''' diff --git a/server/src/uds/static/adm/js/gui-d-config.coffee b/server/src/uds/static/adm/js/gui-d-config.coffee index ab3dc723b..5d35c4849 100644 --- a/server/src/uds/static/adm/js/gui-d-config.coffee +++ b/server/src/uds/static/adm/js/gui-d-config.coffee @@ -9,6 +9,7 @@ gui.configuration.link = -> config: data ) gui.setLinksEvents() + gui.tools.applyCustoms "#form_config" $("#form_config .form-control").each (i, element) -> $(element).attr "data-val", $(element).val() return diff --git a/server/src/uds/templates/uds/admin/tmpl/authenticators.html b/server/src/uds/templates/uds/admin/tmpl/authenticators.html index 2e50f0e43..f0639ce44 100644 --- a/server/src/uds/templates/uds/admin/tmpl/authenticators.html +++ b/server/src/uds/templates/uds/admin/tmpl/authenticators.html @@ -18,9 +18,9 @@
  • {% endverbatim %}{% trans 'Users' %}{% verbatim %}
  • {% endverbatim %}{% trans 'Groups' %}{% verbatim %}
  • {% endverbatim %}{% trans 'Logs' %}{% verbatim %}
  • - +
    -
    +
    diff --git a/server/src/uds/templates/uds/admin/tmpl/configuration.html b/server/src/uds/templates/uds/admin/tmpl/configuration.html index 7660716a3..698afc164 100644 --- a/server/src/uds/templates/uds/admin/tmpl/configuration.html +++ b/server/src/uds/templates/uds/admin/tmpl/configuration.html @@ -33,16 +33,20 @@
    {{ else }} - {{# if value.longText }} - - {{ else }} -
    - - - - -
    - {{/ if }} + {{# ifequals value.type 1 }} + + {{ else }} + {{# ifequals value.type 3 }} + + {{ else }} +
    + + + + +
    + {{/ ifequals }} + {{/ ifequals }} {{/ if }}
    diff --git a/server/src/uds/templates/uds/html5/templates/base.html b/server/src/uds/templates/uds/html5/templates/base.html index c3353d3a9..3c89eb885 100644 --- a/server/src/uds/templates/uds/html5/templates/base.html +++ b/server/src/uds/templates/uds/html5/templates/base.html @@ -58,7 +58,7 @@ {% ifbrowser ie<10 %}
    - {% trans 'Your browser is supported only partially. Please, upgrade it to a modern html5 browser like Firefox, Chrome, Opera, ... (IE must be 10 or better)' %} + {% trans 'Your browser is supported only partially. Please, upgrade it to a modern html5 browser like Firefox, Chrome, Opera, ... (IE must be 10 or better, and must also disable "Compatibility View Mode" for this site)' %}
    {% endifbrowser %} {% block messages %} diff --git a/server/src/uds/templatetags/html5.py b/server/src/uds/templatetags/html5.py index bd6d569d3..34d4626e5 100644 --- a/server/src/uds/templatetags/html5.py +++ b/server/src/uds/templatetags/html5.py @@ -64,7 +64,7 @@ class EnhacedVisual(template.Node): self._nodelistFalse = nodelistFalse def render(self, context): - if GlobalConfig.UDS_THEME_VISUAL.getBool() is True: + if GlobalConfig.UDS_THEME_VISUAL.getBool(True) is True: return self._nodelistTrue.render(context) if self._nodelistFalse is None: return ''