diff --git a/server/src/uds/REST/methods/transports.py b/server/src/uds/REST/methods/transports.py index 74a85de1..4242f5bf 100644 --- a/server/src/uds/REST/methods/transports.py +++ b/server/src/uds/REST/methods/transports.py @@ -36,6 +36,7 @@ from django.utils.translation import ugettext_lazy as _, ugettext from uds.models import Transport, Network from uds.core.transports import factory from uds.core.util import permissions +from uds.core.util import OsDetector from uds.REST.model import ModelHandler @@ -48,14 +49,14 @@ logger = logging.getLogger(__name__) class Transports(ModelHandler): model = Transport - save_fields = ['name', 'comments', 'tags', 'priority', 'nets_positive'] + save_fields = ['name', 'comments', 'tags', 'priority', 'nets_positive', 'allowed_oss'] table_title = _('Current Transports') table_fields = [ {'priority': {'title': _('Priority'), 'type': 'numeric', 'width': '6em'}}, {'name': {'title': _('Name'), 'visible': True, 'type': 'iconType'}}, {'comments': {'title': _('Comments')}}, - {'deployed_count': {'title': _('Used by'), 'type': 'numeric', 'width': '8em'}}, + {'allowed_oss': {'title': _('Devices'), 'width': '8em'}}, {'tags': {'title': _('tags'), 'visible': False}}, ] @@ -65,22 +66,32 @@ class Transports(ModelHandler): def getGui(self, type_): try: return self.addField( - self.addField(self.addDefaultFields(factory().lookup(type_).guiDescription(), ['name', 'comments', 'tags', 'priority']), { - 'name': 'nets_positive', - 'value': True, - 'label': ugettext('Network access'), - 'tooltip': ugettext('If checked, the transport will be enabled for the selected networks.If unchecked, transport will be disabled for selected networks'), - 'type': 'checkbox', - 'order': 100, # At end - }), { - 'name': 'networks', + self.addField( + self.addField(self.addDefaultFields(factory().lookup(type_).guiDescription(), ['name', 'comments', 'tags', 'priority']), { + 'name': 'nets_positive', + 'value': True, + 'label': ugettext('Network access'), + 'tooltip': ugettext('If checked, the transport will be enabled for the selected networks.If unchecked, transport will be disabled for selected networks'), + 'type': 'checkbox', + 'order': 100, # At end + }), { + 'name': 'networks', + 'value': [], + 'values': sorted([{'id': x.id, 'text': x.name} for x in Network.objects.all()], key=lambda x: x['text'].lower()), # TODO: We will fix this behavior after current admin client is fully removed + 'label': ugettext('Networks'), + 'tooltip': ugettext('Networks associated with this transport. If No network selected, will mean "all networks"'), + 'type': 'multichoice', + 'order': 101 + }), { + 'name': 'allowed_oss', 'value': [], - 'values': sorted([{'id': x.id, 'text': x.name} for x in Network.objects.all()], key=lambda x: x['text'].lower()), # TODO: We will fix this behavior after current admin client is fully removed - 'label': ugettext('Networks'), - 'tooltip': ugettext('Networks associated with this transport. If No network selected, will mean "all networks"'), + 'values': sorted([{'id': x, 'text': x} for x in OsDetector.knownOss], key=lambda x: x['text'].lower()), # TODO: We will fix this behavior after current admin client is fully removed + 'label': ugettext('Allowed Devices'), + 'tooltip': ugettext('If empty, any kind of device compatible with this transport will be allowed. Else, only devices compatible with selected values will be allowed'), 'type': 'multichoice', - 'order': 101 + 'order': 102 }) + except Exception: self.invalidItemException() @@ -94,12 +105,17 @@ class Transports(ModelHandler): 'priority': item.priority, 'nets_positive': item.nets_positive, 'networks': [{'id': n.id} for n in item.networks.all()], + 'allowed_oss': [{'id': x} for x in item.allowed_oss.split(',')] if item.allowed_oss != '' else [], 'deployed_count': item.deployedServices.count(), 'type': type_.type(), 'protocol': type_.protocol, 'permission': permissions.getEffectivePermission(self._user, item) } + def beforeSave(self, fields): + fields['allowed_oss'] = ','.join(fields['allowed_oss']) + + def afterSave(self, item): try: networks = self._params['networks'] @@ -108,5 +124,13 @@ class Transports(ModelHandler): return if networks is None: return - logger.debug('Params: {0}'.format(networks)) + logger.debug('Networks: {0}'.format(networks)) item.networks = Network.objects.filter(id__in=networks) + + # try: + # oss = ','.join(self._params['allowed_oss']) + # except: + # oss = '' + # logger.debug('Devices: {0}'.format(oss)) + # item.allowed_oss = oss + # item.save() # Store correctly the allowed_oss diff --git a/server/src/uds/REST/model.py b/server/src/uds/REST/model.py index 5df223af..4a6f241f 100644 --- a/server/src/uds/REST/model.py +++ b/server/src/uds/REST/model.py @@ -54,7 +54,7 @@ import logging logger = logging.getLogger(__name__) -__updated__ = '2016-04-18' +__updated__ = '2016-08-24' # a few constants @@ -848,6 +848,7 @@ class ModelHandler(BaseModelHandler): args = self.readFieldsFromParams(self.save_fields) logger.debug('Args: {}'.format(args)) self.beforeSave(args) + logger.debug('Args after processing: {}'.format(args)) # If tags is in save fields, treat it "specially" if 'tags' in self.save_fields: tags = args['tags'] diff --git a/server/src/uds/core/util/OsDetector.py b/server/src/uds/core/util/OsDetector.py index 022c5e93..c74a4a81 100644 --- a/server/src/uds/core/util/OsDetector.py +++ b/server/src/uds/core/util/OsDetector.py @@ -44,8 +44,8 @@ WindowsPhone = 'Windows Phone' Windows = 'Windows' Macintosh = 'Mac' Android = 'Android' -iPad = 'iPad' -iPhone = 'iPhone' +iPad = 'iPad' # +iPhone = 'iPhone' # In fact, these are IOS both, but we can diferentiate it... Unknown = 'Unknown' knownOss = (WindowsPhone, Android, Linux, Windows, Macintosh, iPad, iPhone) # Android is linux also, so it is cheched on first place diff --git a/server/src/uds/migrations/0024_transport_allowed_oss.py b/server/src/uds/migrations/0024_transport_allowed_oss.py new file mode 100644 index 00000000..531acf87 --- /dev/null +++ b/server/src/uds/migrations/0024_transport_allowed_oss.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.5 on 2016-08-24 09:32 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('uds', '0023_ticketstore_owner'), + ] + + operations = [ + migrations.AddField( + model_name='transport', + name='allowed_oss', + field=models.CharField(default='', max_length=255), + ), + ] diff --git a/server/src/uds/models/Transport.py b/server/src/uds/models/Transport.py index dc3bd864..4afcd32d 100644 --- a/server/src/uds/models/Transport.py +++ b/server/src/uds/models/Transport.py @@ -33,7 +33,7 @@ from __future__ import unicode_literals -__updated__ = '2016-02-26' +__updated__ = '2016-08-24' from django.db import models from django.db.models import signals @@ -59,6 +59,9 @@ class Transport(ManagedObjectModel, TaggingMixin): # pylint: disable=model-missing-unicode priority = models.IntegerField(default=0, db_index=True) nets_positive = models.BooleanField(default=False) + # We store allowed oss as a comma-separated list + allowed_oss = models.CharField(max_length=255, default='') + class Meta(ManagedObjectModel.Meta): ''' @@ -113,6 +116,12 @@ class Transport(ManagedObjectModel, TaggingMixin): else: return self.networks.filter(net_start__lte=ip, net_end__gte=ip).count() == 0 + def validForOs(self, os): + logger.debug('Checkin if os "{}" is in "{}"'.format(os, self.allowed_oss)) + if self.allowed_oss == '' or os in self.allowed_oss.split(','): + return True + return False + def __str__(self): return u"{0} of type {1} (id:{2})".format(self.name, self.data_type, self.id) diff --git a/server/src/uds/static/adm/js/gui-d-connectivity.coffee b/server/src/uds/static/adm/js/gui-d-connectivity.coffee index 65b5bbfc..2105de64 100644 --- a/server/src/uds/static/adm/js/gui-d-connectivity.coffee +++ b/server/src/uds/static/adm/js/gui-d-connectivity.coffee @@ -1,4 +1,4 @@ -# jshint strict: true +# jshint strict: true gui.connectivity = transports: new GuiElement(api.transports, "trans") networks: new GuiElement(api.networks, "nets") @@ -41,6 +41,14 @@ gui.connectivity.link = (event) -> # Load osmanager "info" gui.methods.typedShow gui.connectivity.transports, selected[0], '#transports-info-placeholder .well', gettext('Error accessing data') + onData: (data) -> + $.each data, (undefined_, value) -> + if value.allowed_oss != '' + value.allowed_oss = (v.id for v in value.allowed_oss).toString() + return + + return + buttons: [ "new" "edit" @@ -69,4 +77,4 @@ gui.connectivity.link = (event) -> return - return \ No newline at end of file + return diff --git a/server/src/uds/web/views/index.py b/server/src/uds/web/views/index.py index 47af0699..40424d4f 100644 --- a/server/src/uds/web/views/index.py +++ b/server/src/uds/web/views/index.py @@ -52,7 +52,7 @@ import logging logger = logging.getLogger(__name__) -__updated__ = '2016-05-20' +__updated__ = '2016-08-24' def about(request): @@ -105,7 +105,7 @@ def index(request): trans = [] for t in svr.transports.all().order_by('priority'): typeTrans = t.getType() - if t.validForIp(request.ip) and typeTrans.supportsOs(os['OS']): + if t.validForIp(request.ip) and typeTrans.supportsOs(os['OS']) and t.validForOs(os['OS']): if typeTrans.ownLink is True: link = reverse('TransportOwnLink', args=('A' + svr.uuid, t.uuid)) else: @@ -147,7 +147,7 @@ def index(request): trans = [] for t in svr.transports.all().order_by('priority'): typeTrans = t.getType() - if t.validForIp(request.ip) and typeTrans.supportsOs(os['OS']): + if t.validForIp(request.ip) and typeTrans.supportsOs(os['OS']) and t.validForOs(os['OS']): if typeTrans.ownLink is True: link = reverse('TransportOwnLink', args=('F' + svr.uuid, t.uuid)) else: