From 3801b4a4e9319a5d2e8606d7dc5ab05b8ee130e3 Mon Sep 17 00:00:00 2001 From: Aaron Tan Date: Tue, 15 Nov 2016 15:17:45 -0500 Subject: [PATCH 01/11] Update workflow job foreign key related_name. --- awx/main/access.py | 2 +- ..._workflow_job_related_name_modification.py | 20 +++++++++++++++++++ awx/main/models/workflow.py | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 awx/main/migrations/0051_v310_workflow_job_related_name_modification.py diff --git a/awx/main/access.py b/awx/main/access.py index 20d5ae508f..70c094e256 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -1555,7 +1555,7 @@ class WorkflowJobTemplateAccess(BaseAccess): if not is_delete_allowed: return False active_jobs = [dict(type="workflow_job", id=o.id) - for o in obj.jobs.filter(status__in=ACTIVE_STATES)] + for o in obj.workflow_jobs.filter(status__in=ACTIVE_STATES)] if len(active_jobs) > 0: raise StateConflict({"conflict": _("Resource is being used by running jobs"), "active_jobs": active_jobs}) diff --git a/awx/main/migrations/0051_v310_workflow_job_related_name_modification.py b/awx/main/migrations/0051_v310_workflow_job_related_name_modification.py new file mode 100644 index 0000000000..077961b174 --- /dev/null +++ b/awx/main/migrations/0051_v310_workflow_job_related_name_modification.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0050_v310_JSONField_changes'), + ] + + operations = [ + migrations.AlterField( + model_name='workflowjob', + name='workflow_job_template', + field=models.ForeignKey(related_name='workflow_jobs', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='main.WorkflowJobTemplate', null=True), + ), + ] diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index 4e2b6e3b90..3bdaaf4d5a 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -422,7 +422,7 @@ class WorkflowJob(UnifiedJob, WorkflowJobOptions, SurveyJobMixin, JobNotificatio workflow_job_template = models.ForeignKey( 'WorkflowJobTemplate', - related_name='jobs', + related_name='workflow_jobs', blank=True, null=True, default=None, From 32fe6ea4fa2aa710d2627b6c19c0e25013b72a1d Mon Sep 17 00:00:00 2001 From: Aaron Tan Date: Tue, 15 Nov 2016 15:52:55 -0500 Subject: [PATCH 02/11] Test fixture update. --- awx/main/tests/functional/test_rbac_workflow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/main/tests/functional/test_rbac_workflow.py b/awx/main/tests/functional/test_rbac_workflow.py index 663af2639a..822fdc0bcc 100644 --- a/awx/main/tests/functional/test_rbac_workflow.py +++ b/awx/main/tests/functional/test_rbac_workflow.py @@ -24,7 +24,7 @@ def wfjt_node(wfjt_with_nodes): @pytest.fixture def workflow_job(wfjt): - return wfjt.jobs.create(name='test_workflow') + return wfjt.workflow_jobs.create(name='test_workflow') @pytest.mark.django_db From 8a55c90c2c431ec079e240c3004f357b3b7a53be Mon Sep 17 00:00:00 2001 From: Aaron Tan Date: Tue, 15 Nov 2016 17:19:09 -0500 Subject: [PATCH 03/11] Remove unnecessary migrations. --- .../migrations/0034_v310_add_workflows.py | 2 +- ..._workflow_job_related_name_modification.py | 20 ------------------- 2 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 awx/main/migrations/0051_v310_workflow_job_related_name_modification.py diff --git a/awx/main/migrations/0034_v310_add_workflows.py b/awx/main/migrations/0034_v310_add_workflows.py index ceaf091cad..c80a4ecc88 100644 --- a/awx/main/migrations/0034_v310_add_workflows.py +++ b/awx/main/migrations/0034_v310_add_workflows.py @@ -79,7 +79,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='workflowjob', name='workflow_job_template', - field=models.ForeignKey(related_name='jobs', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='main.WorkflowJobTemplate', null=True), + field=models.ForeignKey(related_name='workflow_jobs', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='main.WorkflowJobTemplate', null=True), ), migrations.AddField( model_name='activitystream', diff --git a/awx/main/migrations/0051_v310_workflow_job_related_name_modification.py b/awx/main/migrations/0051_v310_workflow_job_related_name_modification.py deleted file mode 100644 index 077961b174..0000000000 --- a/awx/main/migrations/0051_v310_workflow_job_related_name_modification.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('main', '0050_v310_JSONField_changes'), - ] - - operations = [ - migrations.AlterField( - model_name='workflowjob', - name='workflow_job_template', - field=models.ForeignKey(related_name='workflow_jobs', on_delete=django.db.models.deletion.SET_NULL, default=None, blank=True, to='main.WorkflowJobTemplate', null=True), - ), - ] From 827b4e15377642eafa6ede0a478b7c9f1eaa4d84 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Wed, 16 Nov 2016 13:35:35 -0500 Subject: [PATCH 04/11] factored out base requirements * bumped all dependent packages that are not base --- requirements/requirements.txt | 198 +++++++++++++++++++++------------- requirements/tower/base.txt | 48 +++++++++ 2 files changed, 169 insertions(+), 77 deletions(-) create mode 100644 requirements/tower/base.txt diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 1ee9a35ede..975374aaed 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,136 +1,180 @@ -git+https://github.com/ansible/ansiconv.git@tower_1.0.0#egg=ansiconv amqp==1.4.9 +git+https://github.com/ansible/ansiconv.git@tower_1.0.0#egg=ansiconv anyjson==0.3.3 +apache-libcloud==0.20.1 appdirs==1.4.0 asgi-amqp==0.3.1 +asgiref==1.0.0 +autobahn==0.16.1 azure==2.0.0rc5 -Babel==2.2.0 +azure-batch==0.30.0rc5 +azure-common==1.1.4 +azure-graphrbac==0.30.0rc5 +azure-mgmt==0.30.0rc5 +azure-mgmt-authorization==0.30.0rc5 +azure-mgmt-batch==0.30.0rc5 +azure-mgmt-cdn==0.30.0rc5 +azure-mgmt-cognitiveservices==0.30.0rc5 +azure-mgmt-commerce==0.30.0rc5 +azure-mgmt-compute==0.30.0rc5 +azure-mgmt-keyvault==0.30.0rc5 +azure-mgmt-logic==0.30.0rc5 +azure-mgmt-network==0.30.0rc5 +azure-mgmt-notificationhubs==0.30.0rc5 +azure-mgmt-nspkg==1.0.0 +azure-mgmt-powerbiembedded==0.30.0rc5 +azure-mgmt-redis==0.30.0rc5 +azure-mgmt-resource==0.30.0rc5 +azure-mgmt-scheduler==0.30.0rc5 +azure-mgmt-storage==0.30.0rc5 +azure-mgmt-web==0.30.0rc5 +azure-nspkg==1.0.0 +azure-servicebus==0.20.2 +azure-servicemanagement-legacy==0.20.3 +azure-storage==0.32.0 +backports.functools-lru-cache==1.3 baron==0.6.2 -billiard==3.3.0.23 +billiard==3.5.0.2 boto==2.43.0 -celery==3.1.23 -cffi==1.7.0 +celery==4.0.0 +cffi==1.9.1 channels==0.17.3 -cliff==1.15.0 -cmd2==0.6.8 -daphne==0.15.0 +cliff==2.3.0 +cmd2==0.6.9 +constantly==15.1.0 +cryptography==1.5.3 d2to1==0.2.11 +daphne==0.15.0 +debtcollector==1.9.0 +decorator==4.0.10 defusedxml==0.4.1 -Django==1.8.16 -debtcollector==1.2.0 -decorator==4.0.6 +Django==1.10.3 django-auth-ldap==1.2.6 django-celery==3.1.17 django-crum==0.6.1 django-extensions==1.5.9 django-jsonfield==1.0.1 -git+https://github.com/ansible/django-jsonbfield@fix-sqlite_serialization#egg=jsonbfield django-polymorphic==0.7.2 +git+https://github.com/ansible/django-qsstats-magic.git@tower_0.7.2#egg=django-qsstats-magic django-radius==1.0.0 -djangorestframework==3.3.2 -djangorestframework-yaml==1.0.2 django-solo==1.1.2 django-split-settings==0.1.1 -django-transaction-hooks==0.2 django-taggit==0.17.6 +django-transaction-hooks==0.2 +djangorestframework==3.3.2 +djangorestframework-yaml==1.0.2 git+https://github.com/ansible/dm.xmlsec.binding.git@master#egg=dm.xmlsec.binding -dogpile.core==0.4.1 -funcsigs==0.4 -gevent==1.1.0 +dogpile.cache==0.6.2 +enum34==1.1.6 +funcsigs==1.0.2 +functools32==3.2.3.post2 +futures==3.0.5 +gevent==1.1.2 gevent-websocket==0.9.5 -git+https://github.com/ansible/django-qsstats-magic.git@tower_0.7.2#egg=django-qsstats-magic -greenlet==0.4.9 -dogpile.cache==0.5.7 -enum34==1.1.2 -futures==3.0.4 -httplib2==0.9.2 -idna==2.0 +greenlet==0.4.10 +idna==2.1 importlib==1.0.3 -ip-associations-python-novaclient-ext==0.1 -ipaddress==1.0.16 +incremental==16.10.1 +inflect==0.2.5 +ip-associations-python-novaclient-ext==0.2 +ipaddress==1.0.17 irc==13.3.1 iso8601==0.1.11 -isodate==0.5.1 -jsonpatch==1.12 +isodate==0.5.0 +jaraco.classes==1.4 +jaraco.collections==1.5 +jaraco.functools==1.15.1 +jaraco.itertools==2.0 +jaraco.logging==1.5 +jaraco.text==1.8 +git+https://github.com/ansible/django-jsonbfield@fix-sqlite_serialization#egg=jsonbfield +jsonpatch==1.14 +jsonpickle==0.9.3 jsonpointer==1.10 jsonschema==2.5.1 -keyring==4.1 +keyring==10.0.2 +keystoneauth1==2.15.0 kombu==3.0.35 -apache-libcloud==0.20.1 -lxml==3.4.4 -Markdown==2.4.1 +lxml==3.6.4 M2Crypto==0.22.3 -mock==1.0.1 -monotonic==0.6 +Markdown==2.4.1 +mock==2.0.0 +monotonic==1.2 +more-itertools==2.3 msgpack-python==0.4.7 munch==2.0.4 netaddr==0.7.18 -netifaces==0.10.4 -oauthlib==1.0.3 +netifaces==0.10.5 +oauthlib==2.0.0 +openstacksdk==0.9.10 ordereddict==1.1 -os-client-config==1.14.0 +os-client-config==1.24.0 os-diskconfig-python-novaclient-ext==0.1.3 -os-networksv2-python-novaclient-ext==0.25 -os-virtual-interfacesv2-python-novaclient-ext==0.19 -pbr==1.8.1 -oslo.config==3.3.0 -oslo.i18n==3.2.0 -oslo.serialization==2.2.0 -oslo.utils==3.4.0 +os-networksv2-python-novaclient-ext==0.26 +os-virtual-interfacesv2-python-novaclient-ext==0.20 +osc-lib==1.2.0 +oslo.config==3.19.0 +oslo.i18n==3.10.0 +oslo.serialization==2.14.0 +oslo.utils==3.18.0 +pbr==1.10.0 pexpect==3.1 +pipdeptree==0.8.0 +positional==1.1.1 prettytable==0.7.2 psphere==0.5.2 psutil==3.1.1 -psycopg2==2.6.1 pyasn1==0.1.9 -pycrypto==2.6.1 -pycparser==2.14 +pycparser==2.17 pygerduty==0.32.1 -PyJWT==1.4.0 +PyJWT==1.4.2 pyOpenSSL==16.0.0 -pyparsing==2.0.7 +pyparsing==2.1.10 pyrad==2.0 pyrax==1.9.7 -python-cinderclient==1.5.0 -python-dateutil==2.4.0 -python-glanceclient==1.1.0 -python-heatclient==0.8.1 -python-ironicclient==1.0.0 -python-keystoneclient==2.1.1 -python-ldap==2.4.20 +python-cinderclient==1.9.0 +python-dateutil==2.6.0 +python-glanceclient==2.5.0 +python-heatclient==1.5.0 +python-ironicclient==1.8.0 +python-keystoneclient==3.6.0 +python-ldap==2.4.27 python-memcached==1.58 -python-neutronclient==4.0.0 -python-novaclient==3.2.0 +python-mistralclient==2.1.1 +python-neutronclient==6.0.0 +python-novaclient==2.27.0 python-openid==2.2.5 -python-openstackclient==2.0.0 +python-openstackclient==3.3.0 python-radius==1.0 python-saml==2.1.8 python-social-auth==0.2.21 -python-swiftclient==2.7.0 -python-troveclient==1.4.0 -pytz==2015.7 -PyYAML==3.11 +python-swiftclient==3.2.0 +python-troveclient==2.5.0 pyzmq==14.5.0 rackspace-auth-openstack==1.3 -rackspace-novaclient==1.5 -rax-default-network-flags-python-novaclient-ext==0.3.2 +rackspace-novaclient==2.1 +rax-default-network-flags-python-novaclient-ext==0.4.0 rax-scheduled-images-python-novaclient-ext==0.3.1 redbaron==0.6.1 -requests-oauthlib==0.5.0 -requests==2.11.0 -requestsexceptions==1.1.1 +requests==2.12.1 +requests-oauthlib==0.7.0 +requestsexceptions==1.1.3 +rfc3986==0.4.1 rply==0.7.4 +SecretStorage==2.3.1 shade==1.4.0 -simplejson==3.8.1 -six==1.9.0 +simplejson==3.10.0 slackclient==0.16 -stevedore==1.10.0 +stevedore==1.18.0 suds==0.4 -unicodecsv==0.14.1 -warlock==1.2.0 +tempora==1.6.1 twilio==4.9.1 +Twisted==16.5.0 +txaio==2.5.2 +unicodecsv==0.14.1 uWSGI==2.0.14 -wheel==0.24.0 -wrapt==1.10.6 -wsgiref==0.1.2 +warlock==1.2.0 +websocket-client==0.37.0 +wrapt==1.10.8 xmltodict==0.9.2 +zope.interface==4.3.2 diff --git a/requirements/tower/base.txt b/requirements/tower/base.txt new file mode 100644 index 0000000000..6c5ec2cc61 --- /dev/null +++ b/requirements/tower/base.txt @@ -0,0 +1,48 @@ +ansiconv==1.0.0 +apache-libcloud==0.20.1 +asgi-amqp==0.3.1 +azure==2.0.0rc5 +boto==2.43.0 +channels==0.17.3 +d2to1==0.2.11 +django-auth-ldap==1.2.6 +django-celery==3.1.17 +django-crum==0.6.1 +django-extensions==1.5.9 +django-jsonfield==1.0.1 +django-polymorphic==0.7.2 +django-qsstats-magic==0.7.2 +django-radius==1.0.0 +django-solo==1.1.2 +django-split-settings==0.1.1 +django-taggit==0.17.6 +django-transaction-hooks==0.2 +djangorestframework==3.3.2 +djangorestframework-yaml==1.0.2 +gevent-websocket==0.9.5 +importlib==1.0.3 +irc==13.3.1 +jsonbfield==0.1.0 +M2Crypto==0.22.3 +Markdown==2.4.1 +ordereddict==1.1 +pexpect==3.1 +pipdeptree==0.8.0 +psphere==0.5.2 +psutil==3.1.1 +pycrypto==2.6.1 +pygerduty==0.32.1 +pyOpenSSL==16.0.0 +pyrax==1.9.7 +python-memcached==1.58 +python-radius==1.0 +python-saml==2.1.8 +python-social-auth==0.2.21 +pyzmq==14.5.0 +redbaron==0.6.1 +shade==1.4.0 +slackclient==0.16 +twilio==4.9.1 +uWSGI==2.0.14 +wheel==0.30.0a0 +xmltodict==0.9.2 From edaf018f2c336de6cc7b3a83b504e5e400bbed74 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Wed, 16 Nov 2016 13:39:44 -0500 Subject: [PATCH 05/11] Revert "factored out base requirements" This reverts commit c5129a054c272a5e59008b3dc4d8a2f287f310a6. --- requirements/requirements.txt | 200 +++++++++++++--------------------- requirements/tower/base.txt | 48 -------- 2 files changed, 78 insertions(+), 170 deletions(-) delete mode 100644 requirements/tower/base.txt diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 975374aaed..1ee9a35ede 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,180 +1,136 @@ -amqp==1.4.9 git+https://github.com/ansible/ansiconv.git@tower_1.0.0#egg=ansiconv +amqp==1.4.9 anyjson==0.3.3 -apache-libcloud==0.20.1 appdirs==1.4.0 asgi-amqp==0.3.1 -asgiref==1.0.0 -autobahn==0.16.1 azure==2.0.0rc5 -azure-batch==0.30.0rc5 -azure-common==1.1.4 -azure-graphrbac==0.30.0rc5 -azure-mgmt==0.30.0rc5 -azure-mgmt-authorization==0.30.0rc5 -azure-mgmt-batch==0.30.0rc5 -azure-mgmt-cdn==0.30.0rc5 -azure-mgmt-cognitiveservices==0.30.0rc5 -azure-mgmt-commerce==0.30.0rc5 -azure-mgmt-compute==0.30.0rc5 -azure-mgmt-keyvault==0.30.0rc5 -azure-mgmt-logic==0.30.0rc5 -azure-mgmt-network==0.30.0rc5 -azure-mgmt-notificationhubs==0.30.0rc5 -azure-mgmt-nspkg==1.0.0 -azure-mgmt-powerbiembedded==0.30.0rc5 -azure-mgmt-redis==0.30.0rc5 -azure-mgmt-resource==0.30.0rc5 -azure-mgmt-scheduler==0.30.0rc5 -azure-mgmt-storage==0.30.0rc5 -azure-mgmt-web==0.30.0rc5 -azure-nspkg==1.0.0 -azure-servicebus==0.20.2 -azure-servicemanagement-legacy==0.20.3 -azure-storage==0.32.0 -backports.functools-lru-cache==1.3 +Babel==2.2.0 baron==0.6.2 -billiard==3.5.0.2 +billiard==3.3.0.23 boto==2.43.0 -celery==4.0.0 -cffi==1.9.1 +celery==3.1.23 +cffi==1.7.0 channels==0.17.3 -cliff==2.3.0 -cmd2==0.6.9 -constantly==15.1.0 -cryptography==1.5.3 -d2to1==0.2.11 +cliff==1.15.0 +cmd2==0.6.8 daphne==0.15.0 -debtcollector==1.9.0 -decorator==4.0.10 +d2to1==0.2.11 defusedxml==0.4.1 -Django==1.10.3 +Django==1.8.16 +debtcollector==1.2.0 +decorator==4.0.6 django-auth-ldap==1.2.6 django-celery==3.1.17 django-crum==0.6.1 django-extensions==1.5.9 django-jsonfield==1.0.1 +git+https://github.com/ansible/django-jsonbfield@fix-sqlite_serialization#egg=jsonbfield django-polymorphic==0.7.2 -git+https://github.com/ansible/django-qsstats-magic.git@tower_0.7.2#egg=django-qsstats-magic django-radius==1.0.0 -django-solo==1.1.2 -django-split-settings==0.1.1 -django-taggit==0.17.6 -django-transaction-hooks==0.2 djangorestframework==3.3.2 djangorestframework-yaml==1.0.2 +django-solo==1.1.2 +django-split-settings==0.1.1 +django-transaction-hooks==0.2 +django-taggit==0.17.6 git+https://github.com/ansible/dm.xmlsec.binding.git@master#egg=dm.xmlsec.binding -dogpile.cache==0.6.2 -enum34==1.1.6 -funcsigs==1.0.2 -functools32==3.2.3.post2 -futures==3.0.5 -gevent==1.1.2 +dogpile.core==0.4.1 +funcsigs==0.4 +gevent==1.1.0 gevent-websocket==0.9.5 -greenlet==0.4.10 -idna==2.1 +git+https://github.com/ansible/django-qsstats-magic.git@tower_0.7.2#egg=django-qsstats-magic +greenlet==0.4.9 +dogpile.cache==0.5.7 +enum34==1.1.2 +futures==3.0.4 +httplib2==0.9.2 +idna==2.0 importlib==1.0.3 -incremental==16.10.1 -inflect==0.2.5 -ip-associations-python-novaclient-ext==0.2 -ipaddress==1.0.17 +ip-associations-python-novaclient-ext==0.1 +ipaddress==1.0.16 irc==13.3.1 iso8601==0.1.11 -isodate==0.5.0 -jaraco.classes==1.4 -jaraco.collections==1.5 -jaraco.functools==1.15.1 -jaraco.itertools==2.0 -jaraco.logging==1.5 -jaraco.text==1.8 -git+https://github.com/ansible/django-jsonbfield@fix-sqlite_serialization#egg=jsonbfield -jsonpatch==1.14 -jsonpickle==0.9.3 +isodate==0.5.1 +jsonpatch==1.12 jsonpointer==1.10 jsonschema==2.5.1 -keyring==10.0.2 -keystoneauth1==2.15.0 +keyring==4.1 kombu==3.0.35 -lxml==3.6.4 -M2Crypto==0.22.3 +apache-libcloud==0.20.1 +lxml==3.4.4 Markdown==2.4.1 -mock==2.0.0 -monotonic==1.2 -more-itertools==2.3 +M2Crypto==0.22.3 +mock==1.0.1 +monotonic==0.6 msgpack-python==0.4.7 munch==2.0.4 netaddr==0.7.18 -netifaces==0.10.5 -oauthlib==2.0.0 -openstacksdk==0.9.10 +netifaces==0.10.4 +oauthlib==1.0.3 ordereddict==1.1 -os-client-config==1.24.0 +os-client-config==1.14.0 os-diskconfig-python-novaclient-ext==0.1.3 -os-networksv2-python-novaclient-ext==0.26 -os-virtual-interfacesv2-python-novaclient-ext==0.20 -osc-lib==1.2.0 -oslo.config==3.19.0 -oslo.i18n==3.10.0 -oslo.serialization==2.14.0 -oslo.utils==3.18.0 -pbr==1.10.0 +os-networksv2-python-novaclient-ext==0.25 +os-virtual-interfacesv2-python-novaclient-ext==0.19 +pbr==1.8.1 +oslo.config==3.3.0 +oslo.i18n==3.2.0 +oslo.serialization==2.2.0 +oslo.utils==3.4.0 pexpect==3.1 -pipdeptree==0.8.0 -positional==1.1.1 prettytable==0.7.2 psphere==0.5.2 psutil==3.1.1 +psycopg2==2.6.1 pyasn1==0.1.9 -pycparser==2.17 +pycrypto==2.6.1 +pycparser==2.14 pygerduty==0.32.1 -PyJWT==1.4.2 +PyJWT==1.4.0 pyOpenSSL==16.0.0 -pyparsing==2.1.10 +pyparsing==2.0.7 pyrad==2.0 pyrax==1.9.7 -python-cinderclient==1.9.0 -python-dateutil==2.6.0 -python-glanceclient==2.5.0 -python-heatclient==1.5.0 -python-ironicclient==1.8.0 -python-keystoneclient==3.6.0 -python-ldap==2.4.27 +python-cinderclient==1.5.0 +python-dateutil==2.4.0 +python-glanceclient==1.1.0 +python-heatclient==0.8.1 +python-ironicclient==1.0.0 +python-keystoneclient==2.1.1 +python-ldap==2.4.20 python-memcached==1.58 -python-mistralclient==2.1.1 -python-neutronclient==6.0.0 -python-novaclient==2.27.0 +python-neutronclient==4.0.0 +python-novaclient==3.2.0 python-openid==2.2.5 -python-openstackclient==3.3.0 +python-openstackclient==2.0.0 python-radius==1.0 python-saml==2.1.8 python-social-auth==0.2.21 -python-swiftclient==3.2.0 -python-troveclient==2.5.0 +python-swiftclient==2.7.0 +python-troveclient==1.4.0 +pytz==2015.7 +PyYAML==3.11 pyzmq==14.5.0 rackspace-auth-openstack==1.3 -rackspace-novaclient==2.1 -rax-default-network-flags-python-novaclient-ext==0.4.0 +rackspace-novaclient==1.5 +rax-default-network-flags-python-novaclient-ext==0.3.2 rax-scheduled-images-python-novaclient-ext==0.3.1 redbaron==0.6.1 -requests==2.12.1 -requests-oauthlib==0.7.0 -requestsexceptions==1.1.3 -rfc3986==0.4.1 +requests-oauthlib==0.5.0 +requests==2.11.0 +requestsexceptions==1.1.1 rply==0.7.4 -SecretStorage==2.3.1 shade==1.4.0 -simplejson==3.10.0 +simplejson==3.8.1 +six==1.9.0 slackclient==0.16 -stevedore==1.18.0 +stevedore==1.10.0 suds==0.4 -tempora==1.6.1 -twilio==4.9.1 -Twisted==16.5.0 -txaio==2.5.2 unicodecsv==0.14.1 -uWSGI==2.0.14 warlock==1.2.0 -websocket-client==0.37.0 -wrapt==1.10.8 +twilio==4.9.1 +uWSGI==2.0.14 +wheel==0.24.0 +wrapt==1.10.6 +wsgiref==0.1.2 xmltodict==0.9.2 -zope.interface==4.3.2 diff --git a/requirements/tower/base.txt b/requirements/tower/base.txt deleted file mode 100644 index 6c5ec2cc61..0000000000 --- a/requirements/tower/base.txt +++ /dev/null @@ -1,48 +0,0 @@ -ansiconv==1.0.0 -apache-libcloud==0.20.1 -asgi-amqp==0.3.1 -azure==2.0.0rc5 -boto==2.43.0 -channels==0.17.3 -d2to1==0.2.11 -django-auth-ldap==1.2.6 -django-celery==3.1.17 -django-crum==0.6.1 -django-extensions==1.5.9 -django-jsonfield==1.0.1 -django-polymorphic==0.7.2 -django-qsstats-magic==0.7.2 -django-radius==1.0.0 -django-solo==1.1.2 -django-split-settings==0.1.1 -django-taggit==0.17.6 -django-transaction-hooks==0.2 -djangorestframework==3.3.2 -djangorestframework-yaml==1.0.2 -gevent-websocket==0.9.5 -importlib==1.0.3 -irc==13.3.1 -jsonbfield==0.1.0 -M2Crypto==0.22.3 -Markdown==2.4.1 -ordereddict==1.1 -pexpect==3.1 -pipdeptree==0.8.0 -psphere==0.5.2 -psutil==3.1.1 -pycrypto==2.6.1 -pygerduty==0.32.1 -pyOpenSSL==16.0.0 -pyrax==1.9.7 -python-memcached==1.58 -python-radius==1.0 -python-saml==2.1.8 -python-social-auth==0.2.21 -pyzmq==14.5.0 -redbaron==0.6.1 -shade==1.4.0 -slackclient==0.16 -twilio==4.9.1 -uWSGI==2.0.14 -wheel==0.30.0a0 -xmltodict==0.9.2 From aebff5366e53f246052abfb035a2074bd1f836fe Mon Sep 17 00:00:00 2001 From: Takao Fujiwara Date: Thu, 17 Nov 2016 17:49:39 +0900 Subject: [PATCH 06/11] Update I18N patch under awx/ui to reflect pull request #3363 - Get rid of html tags and codes in translatable strings - Replace i18n.format with i18n.sprintf to treat multiple %s - Add translatable strings for login failures and "SIGN IN". - Rename ansible-tower.pot to ansible-tower-ui.pot for backend pot Signed-off-by: Takao Fujiwara --- awx/ui/client/src/app.js | 8 +- awx/ui/client/src/controllers/Projects.js | 66 +- awx/ui/client/src/forms/Credentials.js | 52 +- awx/ui/client/src/forms/Inventories.js | 12 +- awx/ui/client/src/forms/JobTemplates.js | 69 +- awx/ui/client/src/forms/Organizations.js | 2 +- awx/ui/client/src/forms/Projects.js | 28 +- awx/ui/client/src/forms/Teams.js | 2 +- awx/ui/client/src/helpers/Credentials.js | 26 +- awx/ui/client/src/i18n.js | 63 +- .../inventory-scripts.form.js | 4 +- .../inventory-scripts.list.js | 2 +- awx/ui/client/src/lists/Credentials.js | 2 +- awx/ui/client/src/lists/Inventories.js | 2 +- awx/ui/client/src/lists/Projects.js | 2 +- awx/ui/client/src/lists/Teams.js | 2 +- awx/ui/client/src/lists/Users.js | 2 +- .../login/loginModal/loginModal.partial.html | 10 +- .../thirdPartySignOn.partial.html | 2 +- .../thirdPartySignOn.service.js | 12 +- .../src/management-jobs/card/card.route.js | 3 +- .../notificationTemplates.form.js | 34 +- .../notificationTemplates.list.js | 2 +- .../src/notifications/notifications.list.js | 2 +- awx/ui/client/src/shared/form-generator.js | 14 +- awx/ui/grunt-tasks/nggettext_extract.js | 4 +- awx/ui/package.json | 3 +- ...ansible-tower.pot => ansible-tower-ui.pot} | 1329 +++++++++-------- awx/ui/webpack.config.js | 1 + 29 files changed, 901 insertions(+), 859 deletions(-) rename awx/ui/po/{ansible-tower.pot => ansible-tower-ui.pot} (56%) diff --git a/awx/ui/client/src/app.js b/awx/ui/client/src/app.js index 52c09ded9e..c4f1f89120 100644 --- a/awx/ui/client/src/app.js +++ b/awx/ui/client/src/app.js @@ -312,7 +312,7 @@ var tower = angular.module('Tower', [ }, ncyBreadcrumb: { parent: 'setup', - label: 'CREDENTIALS' + label: N_('CREDENTIALS') } }) }); @@ -336,7 +336,7 @@ var tower = angular.module('Tower', [ }, ncyBreadcrumb: { parent: 'setup', - label: 'TEAMS' + label: N_('TEAMS') } }) }); @@ -360,7 +360,7 @@ var tower = angular.module('Tower', [ }, ncyBreadcrumb: { parent: 'setup', - label: 'USERS' + label: N_('USERS') } }) }); @@ -500,7 +500,7 @@ var tower = angular.module('Tower', [ templateUrl: urlPrefix + 'partials/sockets.html', controller: SocketsController, ncyBreadcrumb: { - label: 'SOCKETS' + label: N_('SOCKETS') } }); diff --git a/awx/ui/client/src/controllers/Projects.js b/awx/ui/client/src/controllers/Projects.js index f8f2d74886..045fc3ff12 100644 --- a/awx/ui/client/src/controllers/Projects.js +++ b/awx/ui/client/src/controllers/Projects.js @@ -45,7 +45,7 @@ export function ProjectsList($scope, $rootScope, $location, $log, $stateParams, function buildTooltips(project) { project.statusIcon = GetProjectIcon(project.status); project.statusTip = GetProjectToolTip(project.status); - project.scm_update_tooltip = "Start an SCM update"; + project.scm_update_tooltip = i18n._("Start an SCM update"); project.scm_schedule_tooltip = i18n._("Schedule future SCM updates"); project.scm_type_class = ""; @@ -153,13 +153,13 @@ export function ProjectsList($scope, $rootScope, $location, $log, $stateParams, }) .error(function (data, status) { ProcessErrors($scope, data, status, null, { hdr: i18n._('Error!'), - msg: i18n.format(i18n._('Call to %s failed. DELETE returned status: '), url) + status }); + msg: i18n.sprintf(i18n._('Call to %s failed. DELETE returned status: '), url) + status }); }); }; Prompt({ hdr: i18n._('Delete'), - body: i18n._('
Are you sure you want to delete the project below?
') + '
' + $filter('sanitize')(name) + '
', + body: '
' + i18n._('Are you sure you want to delete the project below?') + '
' + '
' + $filter('sanitize')(name) + '
', action: action, actionText: 'DELETE' }); @@ -177,7 +177,7 @@ export function ProjectsList($scope, $rootScope, $location, $log, $stateParams, $scope.refresh(); }) .error(function (data, status) { - ProcessErrors($scope, data, status, null, { hdr: i18n._('Error!'), msg: i18n.format(i18n._('Call to %s failed. POST status: '), url) + status }); + ProcessErrors($scope, data, status, null, { hdr: i18n._('Error!'), msg: i18n.sprintf(i18n._('Call to %s failed. POST status: '), url) + status }); }); }); @@ -193,12 +193,12 @@ export function ProjectsList($scope, $rootScope, $location, $log, $stateParams, if (data.can_cancel) { $scope.$emit('Cancel_Update', url); } else { - Alert(i18n._('Cancel Not Allowed'), i18n._('
Either you do not have access or the SCM update process completed. ' + - 'Click the Refresh button to view the latest status.
'), 'alert-info', null, null, null, null, true); + Alert(i18n._('Cancel Not Allowed'), '
' + i18n.sprintf(i18n._('Either you do not have access or the SCM update process completed. ' + + 'Click the %sRefresh%s button to view the latest status.'), '', '') + '
', 'alert-info', null, null, null, null, true); } }) .error(function (data, status) { - ProcessErrors($scope, data, status, null, { hdr: i18n._('Error!'), msg: i18n.format(i18n._('Call to %s failed. GET status: '), url) + status }); + ProcessErrors($scope, data, status, null, { hdr: i18n._('Error!'), msg: i18n.sprintf(i18n._('Call to %s failed. GET status: '), url) + status }); }); }); @@ -214,11 +214,11 @@ export function ProjectsList($scope, $rootScope, $location, $log, $stateParams, }) .error(function (data, status) { ProcessErrors($scope, data, status, null, { hdr: i18n._('Error!'), - msg: i18n.format(i18n._('Call to %s failed. GET status: '), data.related.current_update) + status }); + msg: i18n.sprintf(i18n._('Call to %s failed. GET status: '), data.related.current_update) + status }); }); } else { - Alert(i18n._('Update Not Found'), i18n.format(i18n._('
An SCM update does not appear to be running for project: %s. Click the Refresh ' + - 'button to view the latest status.
'), $filter('sanitize')(name)), 'alert-info',undefined,undefined,undefined,undefined,true); + Alert(i18n._('Update Not Found'), '
' + i18n.sprintf(i18n._('An SCM update does not appear to be running for project: %s. Click the %sRefresh%s ' + + 'button to view the latest status.'), $filter('sanitize')(name), '', '') + '
', 'alert-info',undefined,undefined,undefined,undefined,true); } }) .error(function (data, status) { @@ -377,27 +377,29 @@ export function ProjectsAdd($scope, $rootScope, $compile, $location, $log, if ($scope.scm_type.value) { switch ($scope.scm_type.value) { case 'git': - $scope.urlPopover = i18n._('

Example URLs for GIT SCM include:

  • https://github.com/ansible/ansible.git
  • ' + + $scope.urlPopover = '

    ' + + i18n._('Example URLs for GIT SCM include:') + + '

    • https://github.com/ansible/ansible.git
    • ' + '
    • git@github.com:ansible/ansible.git
    • git://servername.example.com/ansible.git
    ' + - '

    Note: When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, ' + + '

    ' + i18n.sprintf(i18n._('%sNote:%s When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, ' + 'do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using ' + - 'SSH. GIT read only protocol (git://) does not use username or password information.'); + 'SSH. GIT read only protocol (git://) does not use username or password information.'), '', ''); break; case 'svn': - $scope.urlPopover = i18n._('

    Example URLs for Subversion SCM include:

    ' + + $scope.urlPopover = '

    ' + i18n._('Example URLs for Subversion SCM include:') + '

    ' + '
    • https://github.com/ansible/ansible
    • svn://servername.example.com/path
    • ' + - '
    • svn+ssh://servername.example.com/path
    '); + '
  • svn+ssh://servername.example.com/path
'; break; case 'hg': - $scope.urlPopover = i18n._('

Example URLs for Mercurial SCM include:

' + + $scope.urlPopover = '

' + i18n._('Example URLs for Mercurial SCM include:') + '

' + '
  • https://bitbucket.org/username/project
  • ssh://hg@bitbucket.org/username/project
  • ' + '
  • ssh://server.example.com/path
' + - '

Note: Mercurial does not support password authentication for SSH. ' + + '

' + i18n.sprintf(i18n._('%sNote:%s Mercurial does not support password authentication for SSH. ' + 'Do not put the username and key in the URL. ' + - 'If using Bitbucket and SSH, do not supply your Bitbucket username.'); + 'If using Bitbucket and SSH, do not supply your Bitbucket username.'), '', ''); break; default: - $scope.urlPopover = i18n._('

URL popover text'); + $scope.urlPopover = '

' + i18n._('URL popover text'); } } @@ -535,14 +537,14 @@ export function ProjectsEdit($scope, $rootScope, $compile, $location, $log, }); $scope.scmBranchLabel = ($scope.scm_type.value === 'svn') ? 'Revision #' : 'SCM Branch'; - $scope.scm_update_tooltip = "Start an SCM update"; + $scope.scm_update_tooltip = i18n._("Start an SCM update"); $scope.scm_type_class = ""; if (data.status === 'running' || data.status === 'updating') { - $scope.scm_update_tooltip = "SCM update currently running"; + $scope.scm_update_tooltip = i18n._("SCM update currently running"); $scope.scm_type_class = "btn-disabled"; } if (Empty(data.scm_type)) { - $scope.scm_update_tooltip = 'Manual projects do not require an SCM update'; + $scope.scm_update_tooltip = i18n._('Manual projects do not require an SCM update'); $scope.scm_type_class = "btn-disabled"; } @@ -641,7 +643,7 @@ export function ProjectsEdit($scope, $rootScope, $compile, $location, $log, Prompt({ hdr: i18n._('Delete'), - body: i18n.format(i18n._('

Are you sure you want to remove the %s below from %s?
'), title, $scope.name) + '
' + name + '
', + body: '
' + i18n.sprintf(i18n._('Are you sure you want to remove the %s below from %s?'), title, $scope.name) + '
' + '
' + name + '
', action: action, actionText: 'DELETE' }); @@ -658,27 +660,27 @@ export function ProjectsEdit($scope, $rootScope, $compile, $location, $log, if ($scope.scm_type.value) { switch ($scope.scm_type.value) { case 'git': - $scope.urlPopover = i18n._('

Example URLs for GIT SCM include:

  • https://github.com/ansible/ansible.git
  • ' + + $scope.urlPopover = '

    ' + i18n._('Example URLs for GIT SCM include:') + '

    • https://github.com/ansible/ansible.git
    • ' + '
    • git@github.com:ansible/ansible.git
    • git://servername.example.com/ansible.git
    ' + - '

    Note: When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, ' + + '

    ' + i18n.sprintf(i18n._('%sNote:%s When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, ' + 'do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using ' + - 'SSH. GIT read only protocol (git://) does not use username or password information.'); + 'SSH. GIT read only protocol (git://) does not use username or password information.'), '', ''); break; case 'svn': - $scope.urlPopover = i18n._('

    Example URLs for Subversion SCM include:

    ' + + $scope.urlPopover = '

    ' + i18n._('Example URLs for Subversion SCM include:') + '

    ' + '
    • https://github.com/ansible/ansible
    • svn://servername.example.com/path
    • ' + - '
    • svn+ssh://servername.example.com/path
    '); + '
  • svn+ssh://servername.example.com/path
'; break; case 'hg': - $scope.urlPopover = i18n._('

Example URLs for Mercurial SCM include:

' + + $scope.urlPopover = '

' + i18n._('Example URLs for Mercurial SCM include:') + '

' + '
  • https://bitbucket.org/username/project
  • ssh://hg@bitbucket.org/username/project
  • ' + '
  • ssh://server.example.com/path
' + - '

Note: Mercurial does not support password authentication for SSH. ' + + '

' + i18n.sprintf(i18n._('%sNote:%s Mercurial does not support password authentication for SSH. ' + 'Do not put the username and key in the URL. ' + - 'If using Bitbucket and SSH, do not supply your Bitbucket username.'); + 'If using Bitbucket and SSH, do not supply your Bitbucket username.'), '', ''); break; default: - $scope.urlPopover = i18n._('

URL popover text'); + $scope.urlPopover = '

' + i18n._('URL popover text'); } } }; diff --git a/awx/ui/client/src/forms/Credentials.js b/awx/ui/client/src/forms/Credentials.js index 9ba77799ce..42fae2c82f 100644 --- a/awx/ui/client/src/forms/Credentials.js +++ b/awx/ui/client/src/forms/Credentials.js @@ -51,7 +51,7 @@ export default list: 'OrganizationList', sourceModel: 'organization', sourceField: 'name', - awPopOver: i18n._("

If no organization is given, the credential can only be used by the user that creates the credential. Organization admins and system administrators can assign an organization so that roles for the credential can be assigned to users and teams in that organization.

"), + awPopOver: "

" + i18n._("If no organization is given, the credential can only be used by the user that creates the credential. Organization admins and system administrators can assign an organization so that roles for the credential can be assigned to users and teams in that organization.") + "

", dataTitle: i18n._('Organization') + ' ', dataPlacement: 'bottom', dataContainer: "body", @@ -64,24 +64,24 @@ export default ngOptions: 'kind.label for kind in credential_kind_options track by kind.value', // select as label for value in array 'kind.label for kind in credential_kind_options', ngChange: 'kindChange()', required: true, - awPopOver: i18n._('
\n' + - '
Machine
\n' + - '
Authentication for remote machine access. This can include SSH keys, usernames, passwords, ' + + awPopOver: '
\n' + + '
' + i18n._('Machine') + '
\n' + + '
' + i18n._('Authentication for remote machine access. This can include SSH keys, usernames, passwords, ' + 'and sudo information. Machine credentials are used when submitting jobs to run playbooks against ' + - 'remote hosts.
' + - '
Network
\n' + - '
Authentication for network device access. This can include SSH keys, usernames, passwords, ' + + 'remote hosts.') + '
' + + '
' + i18n._('Network') + '
\n' + + '
' + i18n._('Authentication for network device access. This can include SSH keys, usernames, passwords, ' + 'and authorize information. Network credentials are used when submitting jobs to run playbooks against ' + - 'network devices.
' + - '
Source Control
\n' + - '
Used to check out and synchronize playbook repositories with a remote source control ' + + 'network devices.') + '
' + + '
' + i18n._('Source Control') + '
\n' + + '
' + i18n._('Used to check out and synchronize playbook repositories with a remote source control ' + 'management system such as Git, Subversion (svn), or Mercurial (hg). These credentials are ' + - 'used by Projects.
\n' + - '
Others (Cloud Providers)
\n' + - '
Usernames, passwords, and access keys for authenticating to the specified cloud or infrastructure ' + + 'used by Projects.') + '
\n' + + '
' + i18n._('Others (Cloud Providers)') + '
\n' + + '
' + i18n._('Usernames, passwords, and access keys for authenticating to the specified cloud or infrastructure ' + 'provider. These are used for dynamic inventory sources and for cloud provisioning and deployment ' + - 'in playbook runs.
\n' + - '
\n'), + 'in playbook runs.') + '
\n' + + '
\n', dataTitle: i18n._('Type'), dataPlacement: 'right', dataContainer: "body", @@ -122,7 +122,8 @@ export default ngShow: "kind.value == 'aws'", autocomplete: false, apiField: 'security_token', - awPopOver: i18n._("
Security Token Service (STS) is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users.
To learn more about the IAM STS Token, refer to the Amazon documentation.
"), + awPopOver: "
" + i18n._("Security Token Service (STS) is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users.") + "
" + + i18n.sprintf(i18n._("To learn more about the IAM STS Token, refer to the %sAmazon documentation%s."), "", "") + "
", hasShowInputButton: true, dataTitle: i18n._('STS Token'), dataPlacement: 'right', @@ -158,7 +159,7 @@ export default autocomplete: false, - awPopOver: i18n._('

Subscription ID is an Azure construct, which is mapped to a username.

'), + awPopOver: '

' + i18n._('Subscription ID is an Azure construct, which is mapped to a username.') + '

', dataTitle: i18n._('Subscription ID'), dataPlacement: 'right', dataContainer: "body", @@ -187,7 +188,7 @@ export default init: false }, autocomplete: false, - awPopOver: i18n._('

The email address assigned to the Google Compute Engine service account.

'), + awPopOver: '

' + i18n.sprintf(i18n._('The email address assigned to the Google Compute Engine %sservice account.'), '') + '

', dataTitle: i18n._('Email'), dataPlacement: 'right', dataContainer: "body", @@ -281,9 +282,10 @@ export default ngShow: "kind.value == 'ssh'", dataTitle: i18n._('Privilege Escalation'), ngOptions: 'become.label for become in become_options track by become.value', - awPopOver: i18n._("

Specify a method for 'become' operations. " + + // i18n.sprintf() does not support the order of multiple "%s" + awPopOver: "

" + i18n.sprintf(i18n._("Specify a method for 'become' operations. " + "This is equivalent to specifying the --become-method=BECOME_METHOD parameter, where BECOME_METHOD could be "+ - "sudo | su | pbrun | pfexec | runas
(defaults to sudo)

"), + "%s"), "sudo | su | pbrun | pfexec | runas") + "
" + i18n.sprintf(i18n._("(defaults to %s)"), "sudo") + "

", dataPlacement: 'right', dataContainer: "body", subForm: 'credentialSubForm', @@ -373,11 +375,11 @@ export default labelBind: 'domainLabel', type: 'text', ngShow: "kind.value == 'openstack'", - awPopOver: i18n._("

OpenStack domains define administrative " + + awPopOver: "

" + i18n._("OpenStack domains define administrative " + "boundaries. It is only needed for Keystone v3 authentication URLs. " + - "Common scenarios include:

  • v2 URLs - leave blank
  • " + - "
  • v3 default - set to 'default'
  • " + - "
  • v3 multi-domain - your domain name

"), + "Common scenarios include:") + "
  • " + i18n.sprintf(i18n._("v2 URLs%s - leave blank"), "") + "
  • " + + "
  • " + i18n.sprintf(i18n._("v3 default%s - set to 'default'"), "") + "
  • " + + "
  • " + i18n.sprintf(i18n._("v3 multi-domain%s - your domain name"), "") + "

", dataTitle: i18n._('Domain Name'), dataPlacement: 'right', dataContainer: "body", @@ -438,7 +440,7 @@ export default label: 'Add', awToolTip: i18n._('Add a permission'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: '(credential_obj.summary_fields.user_capabilities.edit || canAdd)' } }, diff --git a/awx/ui/client/src/forms/Inventories.js b/awx/ui/client/src/forms/Inventories.js index 49692f476e..e7106b8277 100644 --- a/awx/ui/client/src/forms/Inventories.js +++ b/awx/ui/client/src/forms/Inventories.js @@ -15,7 +15,7 @@ angular.module('InventoryFormDefinition', ['ScanJobsListDefinition']) .factory('InventoryFormObject', ['i18n', function(i18n) { return { - addTitle: 'New Inventory', + addTitle: i18n._('New Inventory'), editTitle: '{{ inventory_name }}', name: 'inventory', basePath: 'inventory', @@ -57,14 +57,14 @@ angular.module('InventoryFormDefinition', ['ScanJobsListDefinition']) class: 'Form-formGroup--fullWidth', rows: 6, "default": "---", - awPopOver: "

Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two.

" + + awPopOver: "

" + i18n._("Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two.") + "

" + "JSON:
\n" + "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + "YAML:
\n" + "
---
somevar: somevalue
password: magic
\n" + - '

View JSON examples at www.json.org

' + - '

View YAML examples at docs.ansible.com

', - dataTitle: 'Inventory Variables', + '

' + i18n.sprintf(i18n._('View JSON examples at %s'), 'www.json.org') + '

' + + '

' + i18n.sprintf(i18n._('View YAML examples at %s'), 'docs.ansible.com') + '

', + dataTitle: i18n._('Inventory Variables'), dataPlacement: 'right', dataContainer: 'body', ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' // TODO: get working @@ -150,7 +150,7 @@ angular.module('InventoryFormDefinition', ['ScanJobsListDefinition']) label: i18n._('Add'), awToolTip: i18n._('Add a permission'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' } }, diff --git a/awx/ui/client/src/forms/JobTemplates.js b/awx/ui/client/src/forms/JobTemplates.js index 00f4c5f131..7c3d3c4702 100644 --- a/awx/ui/client/src/forms/JobTemplates.js +++ b/awx/ui/client/src/forms/JobTemplates.js @@ -51,10 +51,13 @@ export default "default": 0, required: true, column: 1, - awPopOver: i18n._("

When this template is submitted as a job, setting the type to run will execute the playbook, running tasks " + - " on the selected hosts.

Setting the type to check will not execute the playbook. Instead, ansible will check playbook " + - " syntax, test environment setup and report problems.

Setting the type to scan will execute the playbook and store any " + - " scanned facts for use with Tower's System Tracking feature.

"), + awPopOver: "

" + i18n._("When this template is submitted as a job, setting the type to run will execute the playbook, running tasks " + + " on the selected hosts.") + "

" + + i18n.sprintf(i18n._("Setting the type to %scheck%s will not execute the playbook."), "", "") + " " + + i18n.sprintf(i18n._("Instead, %s will check playbook " + + " syntax, test environment setup and report problems."), "ansible") + "

" + + i18n.sprintf(i18n._("Setting the type to %sscan%s will execute the playbook and store any " + + " scanned facts for use with Tower's System Tracking feature."), "", "") + "

", dataTitle: i18n._('Job Type'), dataPlacement: 'right', dataContainer: "body", @@ -78,7 +81,7 @@ export default }, requiredErrorMsg: "Please select an Inventory or check the Prompt on launch option.", column: 1, - awPopOver: i18n._("

Select the inventory containing the hosts you want this job to manage.

"), + awPopOver: "

" + i18n._("Select the inventory containing the hosts you want this job to manage.") + "

", dataTitle: i18n._('Inventory'), dataPlacement: 'right', dataContainer: "body", @@ -106,7 +109,7 @@ export default init: "true" }, column: 1, - awPopOver: i18n._("

Select the project containing the playbook you want this job to execute.

"), + awPopOver: "

" + i18n._("Select the project containing the playbook you want this job to execute.") + "

", dataTitle: i18n._('Project'), dataPlacement: 'right', dataContainer: "body", @@ -123,7 +126,7 @@ export default init: "true" }, column: 1, - awPopOver: i18n._("

Select the playbook to be executed by this job.

"), + awPopOver: "

" + i18n._("Select the playbook to be executed by this job.") + "

", dataTitle: i18n._('Playbook'), dataPlacement: 'right', dataContainer: "body", @@ -145,8 +148,8 @@ export default }, requiredErrorMsg: "Please select a Machine Credential or check the Prompt on launch option.", column: 1, - awPopOver: i18n._("

Select the credential you want the job to use when accessing the remote hosts. Choose the credential containing " + - " the username and SSH key or password that Ansible will need to log into the remote hosts.

"), + awPopOver: "

" + i18n._("Select the credential you want the job to use when accessing the remote hosts. Choose the credential containing " + + " the username and SSH key or password that Ansible will need to log into the remote hosts.") + "

", dataTitle: i18n._('Credential'), dataPlacement: 'right', dataContainer: "body", @@ -167,8 +170,8 @@ export default sourceModel: 'cloud_credential', sourceField: 'name', column: 1, - awPopOver: i18n._("

Selecting an optional cloud credential in the job template will pass along the access credentials to the " + - "running playbook, allowing provisioning into the cloud without manually passing parameters to the included modules.

"), + awPopOver:"

" + i18n._("Selecting an optional cloud credential in the job template will pass along the access credentials to the " + + "running playbook, allowing provisioning into the cloud without manually passing parameters to the included modules.") + "

", dataTitle: i18n._('Cloud Credential'), dataPlacement: 'right', dataContainer: "body", @@ -185,7 +188,7 @@ export default sourceModel: 'network_credential', sourceField: 'name', column: 1, - awPopOver: i18n._("

Network credentials are used by Ansible networking modules to connect to and manage networking devices.

"), + awPopOver: "

" + i18n._("Network credentials are used by Ansible networking modules to connect to and manage networking devices.") + "

", dataTitle: i18n._('Network Credential'), dataPlacement: 'right', dataContainer: "body", @@ -201,9 +204,10 @@ export default "default": '0', 'class': "input-small", column: 1, - awPopOver: i18n._('

The number of parallel or simultaneous processes to use while executing the playbook. 0 signifies ' + - 'the default value from the ansible configuration file.

'), + awPopOver: '

' + i18n.sprintf(i18n._('The number of parallel or simultaneous processes to use while executing the playbook. 0 signifies ' + + 'the default value from the %sansible configuration file%s.'), '' + + '', '') +'

', dataTitle: i18n._('Forks'), dataPlacement: 'right', dataContainer: "body", @@ -213,9 +217,10 @@ export default label: i18n._('Limit'), type: 'text', column: 1, - awPopOver: i18n._("

Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. " + - "Multiple patterns can be separated by ; : or ,

For more information and examples see " + - "the Patterns topic at docs.ansible.com.

"), + awPopOver: "

" + i18n.sprintf(i18n._("Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. " + + "Multiple patterns can be separated by %s %s or %s"), ";", ":", ",") + "

" + + i18n.sprintf(i18n._("For more information and examples see " + + "%sthe Patterns topic at docs.ansible.com%s."), "", "") + "

", dataTitle: i18n._('Limit'), dataPlacement: 'right', dataContainer: "body", @@ -232,7 +237,7 @@ export default "default": 1, required: true, column: 1, - awPopOver: i18n._("

Control the level of output ansible will produce as the playbook executes.

"), + awPopOver: "

" + i18n._("Control the level of output ansible will produce as the playbook executes.") + "

", dataTitle: i18n._('Verbosity'), dataPlacement: 'right', dataContainer: "body", @@ -244,9 +249,9 @@ export default rows: 5, 'elementClass': 'Form-textInput', column: 2, - awPopOver: i18n._("

Provide a comma separated list of tags.

\n" + - "

Tags are useful when you have a large playbook, and you want to run a specific part of a play or task.

" + - "

Consult the Ansible documentation for further details on the usage of tags.

"), + awPopOver: "

" + i18n._("Provide a comma separated list of tags.") + "

\n" + + "

" + i18n._("Tags are useful when you have a large playbook, and you want to run a specific part of a play or task.") + "

" + + "

" + i18n._("Consult the Ansible documentation for further details on the usage of tags.") + "

", dataTitle: i18n._("Job Tags"), dataPlacement: "right", dataContainer: "body", @@ -262,9 +267,9 @@ export default rows: 5, 'elementClass': 'Form-textInput', column: 2, - awPopOver: i18n._("

Provide a comma separated list of tags.

\n" + - "

Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task.

" + - "

Consult the Ansible documentation for further details on the usage of tags.

"), + awPopOver: "

" + i18n._("Provide a comma separated list of tags.") + "

\n" + + "

" + i18n._("Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task.") + "

" + + "

" + i18n._("Consult the Ansible documentation for further details on the usage of tags.") + "

", dataTitle: i18n._("Skip Tags"), dataPlacement: "right", dataContainer: "body", @@ -282,7 +287,7 @@ export default label: i18n._('Enable Privilege Escalation'), type: 'checkbox', column: 2, - awPopOver: i18n._("

If enabled, run this playbook as an administrator. This is the equivalent of passing the --become option to the ansible-playbook command.

"), + awPopOver: "

" + i18n.sprintf(i18n._("If enabled, run this playbook as an administrator. This is the equivalent of passing the %s option to the %s command."), '--become', 'ansible-playbook') + "

", dataPlacement: 'right', dataTitle: i18n._('Become Privilege Escalation'), dataContainer: "body", @@ -294,8 +299,8 @@ export default type: 'checkbox', ngChange: "toggleCallback('host_config_key')", column: 2, - awPopOver: i18n._("

Enables creation of a provisioning callback URL. Using the URL a host can contact Tower and request a configuration update " + - "using this job template.

"), + awPopOver: "

" + i18n._("Enables creation of a provisioning callback URL. Using the URL a host can contact Tower and request a configuration update " + + "using this job template.") + "

", dataPlacement: 'right', dataTitle: i18n._('Allow Provisioning Callbacks'), dataContainer: "body", @@ -338,7 +343,7 @@ export default multiSelect: true, dataTitle: i18n._('Labels'), dataPlacement: 'right', - awPopOver: i18n._("

Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs in the Tower display.

"), + awPopOver: "

" + i18n._("Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs in the Tower display.") + "

", dataContainer: 'body', ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' }, @@ -349,12 +354,12 @@ export default rows: 6, "default": "---", column: 2, - awPopOver: i18n._("

Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter " + - "for ansible-playbook. Provide key/value pairs using either YAML or JSON.

" + + awPopOver: "

" + i18n.sprintf(i18n._("Pass extra command line variables to the playbook. This is the %s or %s command line parameter " + + "for %s. Provide key/value pairs using either YAML or JSON."), '-e', '--extra-vars', 'ansible-playbook') + "

" + "JSON:
\n" + "
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" + "YAML:
\n" + - "
---
somevar: somevalue
password: magic
\n"), + "
---
somevar: somevalue
password: magic
\n", dataTitle: i18n._('Extra Variables'), dataPlacement: 'right', dataContainer: "body", diff --git a/awx/ui/client/src/forms/Organizations.js b/awx/ui/client/src/forms/Organizations.js index 5cadb65ce0..011ad90907 100644 --- a/awx/ui/client/src/forms/Organizations.js +++ b/awx/ui/client/src/forms/Organizations.js @@ -72,7 +72,7 @@ export default label: i18n._('Add'), awToolTip: i18n._('Add a permission'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: '(organization_obj.summary_fields.user_capabilities.edit || canAdd)' } }, diff --git a/awx/ui/client/src/forms/Projects.js b/awx/ui/client/src/forms/Projects.js index 2dabbba6b4..a1d65a82d5 100644 --- a/awx/ui/client/src/forms/Projects.js +++ b/awx/ui/client/src/forms/Projects.js @@ -77,9 +77,9 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition']) class: 'Form-textUneditable', showonly: true, ngShow: "scm_type.value == 'manual' " , - awPopOver: i18n._('

Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. ' + - 'Together the base path and selected playbook directory provide the full path used to locate playbooks.

' + - '

Use PROJECTS_ROOT in your environment settings file to determine the base path value.

'), + awPopOver: '

' + i18n._('Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. ' + + 'Together the base path and selected playbook directory provide the full path used to locate playbooks.') + '

' + + '

' + i18n.sprintf(i18n._('Use %s in your environment settings file to determine the base path value.'), 'PROJECTS_ROOT') + '

', dataTitle: i18n._('Project Base Path'), dataContainer: 'body', dataPlacement: 'right', @@ -95,9 +95,9 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition']) init: false }, ngShow: "scm_type.value == 'manual' && !showMissingPlaybooksAlert", - awPopOver: i18n._('

Select from the list of directories found in the base path.' + - 'Together the base path and the playbook directory provide the full path used to locate playbooks.

' + - '

Use PROJECTS_ROOT in your environment settings file to determine the base path value.

'), + awPopOver: '

' + i18n._('Select from the list of directories found in the base path.' + + 'Together the base path and the playbook directory provide the full path used to locate playbooks.') + '

' + + '

' + i18n.sprintf(i18n._('Use %s in your environment settings file to determine the base path value.'), 'PROJECTS_ROOT') + '

', dataTitle: i18n._('Project Path'), dataContainer: 'body', dataPlacement: 'right', @@ -151,7 +151,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition']) name: 'scm_clean', label: i18n._('Clean'), type: 'checkbox', - awPopOver: i18n._('

Remove any local modifications prior to performing an update.

'), + awPopOver: '

' + i18n._('Remove any local modifications prior to performing an update.') + '

', dataTitle: i18n._('SCM Clean'), dataContainer: 'body', dataPlacement: 'right', @@ -161,8 +161,8 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition']) name: 'scm_delete_on_update', label: i18n._('Delete on Update'), type: 'checkbox', - awPopOver: i18n._('

Delete the local repository in its entirety prior to performing an update.

Depending on the size of the ' + - 'repository this may significantly increase the amount of time required to complete an update.

'), + awPopOver: '

' + i18n._('Delete the local repository in its entirety prior to performing an update.') + '

' + i18n._('Depending on the size of the ' + + 'repository this may significantly increase the amount of time required to complete an update.') + '

', dataTitle: i18n._('SCM Delete'), dataContainer: 'body', dataPlacement: 'right', @@ -172,7 +172,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition']) name: 'scm_update_on_launch', label: i18n._('Update on Launch'), type: 'checkbox', - awPopOver: i18n._('

Each time a job runs using this project, perform an update to the local repository prior to starting the job.

'), + awPopOver: '

' + i18n._('Each time a job runs using this project, perform an update to the local repository prior to starting the job.') + '

', dataTitle: i18n._('SCM Update'), dataContainer: 'body', dataPlacement: 'right', @@ -181,7 +181,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition']) }] }, scm_update_cache_timeout: { - label: i18n._(`Cache Timeout (seconds)`), + label: i18n.sprintf(i18n._('Cache Timeout%s (seconds)%s'), '', ''), id: 'scm-cache-timeout', type: 'number', integer: true, @@ -189,9 +189,9 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition']) ngShow: "scm_update_on_launch && projectSelected && scm_type.value !== 'manual'", spinner: true, "default": '0', - awPopOver: i18n._('

Time in seconds to consider a project to be current. During job runs and callbacks the task system will ' + + awPopOver: '

' + i18n._('Time in seconds to consider a project to be current. During job runs and callbacks the task system will ' + 'evaluate the timestamp of the latest project update. If it is older than Cache Timeout, it is not considered current, ' + - 'and a new project update will be performed.

'), + 'and a new project update will be performed.') + '

', dataTitle: i18n._('Cache Timeout'), dataPlacement: 'right', dataContainer: "body", @@ -235,7 +235,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition']) label: 'Add', awToolTip: i18n._('Add a permission'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: '(project_obj.summary_fields.user_capabilities.edit || canAdd)' } }, diff --git a/awx/ui/client/src/forms/Teams.js b/awx/ui/client/src/forms/Teams.js index d1507f28a0..a7f03a490b 100644 --- a/awx/ui/client/src/forms/Teams.js +++ b/awx/ui/client/src/forms/Teams.js @@ -83,7 +83,7 @@ export default label: 'Add', awToolTip: i18n._('Add user to team'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: '(team_obj.summary_fields.user_capabilities.edit || canAdd)' } }, diff --git a/awx/ui/client/src/helpers/Credentials.js b/awx/ui/client/src/helpers/Credentials.js index f965ec2ac4..375a556be0 100644 --- a/awx/ui/client/src/helpers/Credentials.js +++ b/awx/ui/client/src/helpers/Credentials.js @@ -38,7 +38,7 @@ angular.module('CredentialsHelper', ['Utilities']) scope.key_required = false; // JT -- doing the same for key and project scope.project_required = false; scope.subscription_required = false; - scope.key_description = i18n._("Paste the contents of the SSH private key file.
esc or click to close
"); + scope.key_description = i18n.sprintf(i18n._("Paste the contents of the SSH private key file.%s or click to close%s"), "
Esc", "
"); scope.host_required = false; scope.password_required = false; scope.hostLabel = ''; @@ -71,8 +71,8 @@ angular.module('CredentialsHelper', ['Utilities']) scope.domainLabel = ''; scope.project_required = false; scope.passwordLabel = i18n._('Password (API Key)'); - scope.projectPopOver = i18n._("

The project value

"); - scope.hostPopOver = i18n._("

The host value

"); + scope.projectPopOver = "

" + i18n._("The project value") + "

"; + scope.hostPopOver = "

" + i18n._("The host value") + "

"; scope.ssh_key_data_api_error = ''; if (!Empty(scope.kind)) { // Apply kind specific settings @@ -102,10 +102,10 @@ angular.module('CredentialsHelper', ['Utilities']) scope.key_description = i18n._('Paste the contents of the PEM file associated with the service account email.'); scope.projectLabel = i18n._("Project"); scope.project_required = false; - scope.projectPopOver = i18n._("

The Project ID is the " + + scope.projectPopOver = "

" + i18n._("The Project ID is the " + "GCE assigned identification. It is constructed as " + "two words followed by a three digit number. Such " + - "as:

adjective-noun-000

"); + "as: ") + "

adjective-noun-000

"; break; case 'azure': scope.sshKeyDataLabel = i18n._('Management Certificate'); @@ -135,11 +135,11 @@ angular.module('CredentialsHelper', ['Utilities']) scope.project_required = true; scope.host_required = true; scope.username_required = true; - scope.projectPopOver = i18n._("

This is the tenant name. " + + scope.projectPopOver = "

" + i18n._("This is the tenant name. " + " This value is usually the same " + - " as the username.

"); - scope.hostPopOver = i18n._("

The host to authenticate with." + - "
For example, https://openstack.business.com/v2.0/"); + " as the username.") + "

"; + scope.hostPopOver = "

" + i18n._("The host to authenticate with.") + + "
" + i18n.sprintf(i18n._("For example, %s"), "https://openstack.business.com/v2.0/"); break; case 'satellite6': scope.username_required = true; @@ -147,8 +147,8 @@ angular.module('CredentialsHelper', ['Utilities']) scope.passwordLabel = i18n._('Password'); scope.host_required = true; scope.hostLabel = i18n._("Satellite 6 Host"); - scope.hostPopOver = i18n._("Enter the hostname or IP address name which
" + - "corresponds to your Red Hat Satellite 6 server."); + scope.hostPopOver = i18n.sprintf(i18n._("Enter the hostname or IP address name which %s" + + "corresponds to your Red Hat Satellite 6 server."), "
"); break; case 'cloudforms': scope.username_required = true; @@ -156,8 +156,8 @@ angular.module('CredentialsHelper', ['Utilities']) scope.passwordLabel = i18n._('Password'); scope.host_required = true; scope.hostLabel = i18n._("CloudForms Host"); - scope.hostPopOver = i18n._("Enter the hostname or IP address for the virtual
" + - " machine which is hosting the CloudForm appliance."); + scope.hostPopOver = i18n.sprintf(i18n._("Enter the hostname or IP address for the virtual %s" + + " machine which is hosting the CloudForm appliance."), "
"); break; case 'net': scope.username_required = true; diff --git a/awx/ui/client/src/i18n.js b/awx/ui/client/src/i18n.js index 0b64a40222..9471e04616 100644 --- a/awx/ui/client/src/i18n.js +++ b/awx/ui/client/src/i18n.js @@ -1,16 +1,6 @@ /* jshint ignore:start */ -function isString(arg) { - return typeof arg === 'string'; -} - -function isNull(arg) { - return arg === null; -} - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} +var sprintf = require('sprintf-js').sprintf; /** * @ngdoc method @@ -24,55 +14,6 @@ export function N_(s) { return s; } -// Copied format() from util/util.js. util.js includes "require()". -/** - * @ngdoc method - * @name function:i18n#format - * @methodOf function:format - * @description this function provides C-style's formatted sprintf(). - * -*/ -export function format(f) { - var i; - var formatRegExp = /%[sdj%]/g; - if (!isString(f)) { - var objects = []; - for (i = 0; i < arguments.length; i++) { - objects.push(JSON.stringify(arguments[i])); - } - return objects.join(' '); - } - - i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + JSON.stringify(x); - } - } - return str; -} - export default angular.module('I18N', []) .factory('I18NInit', ['$window', 'gettextCatalog', @@ -94,7 +35,7 @@ export default return { _: function (s) { return gettextCatalog.getString (s); }, N_: N_, - format: format, + sprintf: sprintf, hasTranslation: function () { return gettextCatalog.strings[gettextCatalog.currentLanguage] !== undefined; } diff --git a/awx/ui/client/src/inventory-scripts/inventory-scripts.form.js b/awx/ui/client/src/inventory-scripts/inventory-scripts.form.js index 30f85e7c2c..7d6cb01327 100644 --- a/awx/ui/client/src/inventory-scripts/inventory-scripts.form.js +++ b/awx/ui/client/src/inventory-scripts/inventory-scripts.form.js @@ -55,8 +55,8 @@ export default ['i18n', function(i18n) { awDropFile: true, ngDisabled: '!(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)', rows: 10, - awPopOver: i18n._("

Drag and drop your custom inventory script file here or create one in the field to import your custom inventory. " + - "

Script must begin with a hashbang sequence: i.e.... #!/usr/bin/env python

"), + awPopOver: "

" + i18n._("Drag and drop your custom inventory script file here or create one in the field to import your custom inventory.") + " " + + "

" + i18n.sprintf(i18n._("Script must begin with a hashbang sequence: i.e.... %s"), "#!/usr/bin/env python") + "

", dataTitle: i18n._('Custom Script'), dataPlacement: 'right', dataContainer: "body" diff --git a/awx/ui/client/src/inventory-scripts/inventory-scripts.list.js b/awx/ui/client/src/inventory-scripts/inventory-scripts.list.js index 00ac179748..10ab6d5d06 100644 --- a/awx/ui/client/src/inventory-scripts/inventory-scripts.list.js +++ b/awx/ui/client/src/inventory-scripts/inventory-scripts.list.js @@ -42,7 +42,7 @@ export default ['i18n', function(i18n){ ngClick: 'addCustomInv()', awToolTip: i18n._('Create a new custom inventory'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: 'canAdd' } }, diff --git a/awx/ui/client/src/lists/Credentials.js b/awx/ui/client/src/lists/Credentials.js index 7517146973..d099f2826e 100644 --- a/awx/ui/client/src/lists/Credentials.js +++ b/awx/ui/client/src/lists/Credentials.js @@ -56,7 +56,7 @@ export default ngClick: 'addCredential()', awToolTip: i18n._('Create a new credential'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: "true" } }, diff --git a/awx/ui/client/src/lists/Inventories.js b/awx/ui/client/src/lists/Inventories.js index f50c1c11cb..d3d68223cf 100644 --- a/awx/ui/client/src/lists/Inventories.js +++ b/awx/ui/client/src/lists/Inventories.js @@ -66,7 +66,7 @@ export default ngClick: 'addInventory()', awToolTip: i18n._('Create a new inventory'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: 'canAdd' } }, diff --git a/awx/ui/client/src/lists/Projects.js b/awx/ui/client/src/lists/Projects.js index 31d176bd98..48ffa3dcaf 100644 --- a/awx/ui/client/src/lists/Projects.js +++ b/awx/ui/client/src/lists/Projects.js @@ -58,7 +58,7 @@ export default ngClick: 'addProject()', awToolTip: i18n._('Create a new project'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: "canAdd" }, refresh: { diff --git a/awx/ui/client/src/lists/Teams.js b/awx/ui/client/src/lists/Teams.js index a2ff5924d4..b9bb151a1a 100644 --- a/awx/ui/client/src/lists/Teams.js +++ b/awx/ui/client/src/lists/Teams.js @@ -48,7 +48,7 @@ export default ngClick: 'addTeam()', awToolTip: i18n._('Create a new team'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: 'canAdd' } }, diff --git a/awx/ui/client/src/lists/Users.js b/awx/ui/client/src/lists/Users.js index 3d47cf77c0..3efb0f7ce3 100644 --- a/awx/ui/client/src/lists/Users.js +++ b/awx/ui/client/src/lists/Users.js @@ -55,7 +55,7 @@ export default basePaths: ['organizations', 'users'], // base path must be in list, or action not available awToolTip: i18n._('Create a new user'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: 'canAdd' } }, diff --git a/awx/ui/client/src/login/loginModal/loginModal.partial.html b/awx/ui/client/src/login/loginModal/loginModal.partial.html index 56d811a200..e0e46657f8 100644 --- a/awx/ui/client/src/login/loginModal/loginModal.partial.html +++ b/awx/ui/client/src/login/loginModal/loginModal.partial.html @@ -15,19 +15,19 @@
-
+
Your session timed out due to inactivity. Please sign in.
-
+
Maximum per-user sessions reached. Please sign in.
-
+
Invalid username and/or password. Please try again.
@@ -53,7 +53,7 @@ autocomplete="off" required>
+ loginForm.login_username.$error.required" translate> Please enter a username.
+ loginForm.login_password.$error.required" translate> Please enter a password.
-
+
SIGN IN WITH
diff --git a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js b/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js index 4e3233c022..ebc64fe9fc 100644 --- a/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js +++ b/awx/ui/client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js @@ -13,7 +13,7 @@ */ export default - ['$http', 'ProcessErrors', function($http, ProcessErrors) { + ['$http', 'ProcessErrors', 'i18n', function($http, ProcessErrors, i18n) { return function (params) { var scope = params.scope, url = params.url; @@ -31,7 +31,7 @@ newOption.type = "google"; newOption.icon = "ThirdPartySignOn-icon--fontCustom icon-google"; newOption.link = option.login_url; - newOption.tooltip = "Sign in with Google"; + newOption.tooltip = i18n.sprintf(i18n._("Sign in with %s"), "Google"); return newOption; } @@ -42,15 +42,15 @@ newOption.type = "github"; newOption.icon = "fa-github ThirdPartySignOn-icon--gitHub"; newOption.link = option.login_url; - newOption.tooltip = "Sign in with GitHub"; + newOption.tooltip = i18n.sprintf(i18n._("Sign in with %s"), "GitHub"); // if this is a GitHub team or org, add that to // the tooltip if (key.split("-")[1]){ if (key.split("-")[1] === "team") { - newOption.tooltip += " Teams"; + newOption.tooltip = i18n.sprintf(i18n._("Sign in with %s Teams"), "GitHub"); } else if (key.split("-")[1] === "org") { - newOption.tooltip += " Organizations"; + newOption.tooltip = i18n.sprintf(i18n._("Sign in with %s Organizations"), "GitHub"); } } @@ -63,7 +63,7 @@ newOption.type = "saml"; newOption.icon = "ThirdPartySignOn-icon--fontCustom icon-saml-02"; newOption.link = option.login_url; - newOption.tooltip = "Sign in with SAML"; + newOption.tooltip = i18n.sprintf(i18n._("Sign in with %s"), "SAML"); // add the idp of the saml type to the tooltip if (key.split(":")[1]){ diff --git a/awx/ui/client/src/management-jobs/card/card.route.js b/awx/ui/client/src/management-jobs/card/card.route.js index 7f92f75908..d8186d32f4 100644 --- a/awx/ui/client/src/management-jobs/card/card.route.js +++ b/awx/ui/client/src/management-jobs/card/card.route.js @@ -5,6 +5,7 @@ *************************************************/ import {templateUrl} from '../../shared/template-url/template-url.factory'; +import {N_} from "../../i18n"; export default { name: 'managementJobsList', @@ -17,6 +18,6 @@ export default { }, ncyBreadcrumb: { parent: 'setup', - label: 'MANAGEMENT JOBS' + label: N_('MANAGEMENT JOBS') }, }; diff --git a/awx/ui/client/src/notifications/notificationTemplates.form.js b/awx/ui/client/src/notifications/notificationTemplates.form.js index 327222eb9f..48fcbad9d7 100644 --- a/awx/ui/client/src/notifications/notificationTemplates.form.js +++ b/awx/ui/client/src/notifications/notificationTemplates.form.js @@ -94,8 +94,8 @@ export default ['i18n', function(i18n) { label: i18n._('Recipient List'), type: 'textarea', rows: 3, - awPopOver: i18n._('

Type an option on each line.

'+ - '

For example:
alias1@email.com
\n alias2@email.com
\n'), + awPopOver: '

' + i18n._('Type an option on each line.') + '

'+ + '

' + i18n._('For example:') + '
alias1@email.com
\n alias2@email.com
\n', dataTitle: i18n._('Recipient List'), dataPlacement: 'right', dataContainer: "body", @@ -138,8 +138,8 @@ export default ['i18n', function(i18n) { label: i18n._('Destination Channels'), type: 'textarea', rows: 3, - awPopOver: i18n._('

Type an option on each line. The pound symbol (#) is not required.

'+ - '

For example:
engineering
\n #support
\n'), + awPopOver: '

' + i18n._('Type an option on each line. The pound symbol (#) is not required.') + '

'+ + '

' + i18n._('For example:') + '
engineering
\n #support
\n', dataTitle: i18n._('Destination Channels'), dataPlacement: 'right', dataContainer: "body", @@ -155,8 +155,8 @@ export default ['i18n', function(i18n) { label: i18n._('Destination Channels'), type: 'textarea', rows: 3, - awPopOver: i18n._('

Type an option on each line. The pound symbol (#) is not required.

'+ - '

For example:
engineering
\n #support
\n'), + awPopOver: '

' + i18n._('Type an option on each line. The pound symbol (#) is not required.') + '

'+ + '

' + i18n._('For example:') + '
engineering
\n #support
\n', dataTitle: i18n._('Destination Channels'), dataPlacement: 'right', dataContainer: "body", @@ -195,8 +195,8 @@ export default ['i18n', function(i18n) { from_number: { label: i18n._('Source Phone Number'), type: 'text', - awPopOver: i18n._('

Number associated with the "Messaging Service" in Twilio.

'+ - '

This must be of the form +18005550199.

'), + awPopOver: '

' + i18n._('Number associated with the "Messaging Service" in Twilio.') + '

'+ + '

' + i18n.sprintf(i18n._('This must be of the form %s.'), '+18005550199') + '

', awRequiredWhen: { reqExpression: "twilio_required", init: "false" @@ -209,8 +209,8 @@ export default ['i18n', function(i18n) { label: i18n._('Destination SMS Number'), type: 'textarea', rows: 3, - awPopOver: i18n._('

Type an option on each line.

'+ - '

For example:
+12125552368
\n+19105556162
\n'), + awPopOver: '

' + i18n._('Type an option on each line.') + '

'+ + '

' + i18n._('For example:') + '
+12125552368
\n+19105556162
\n', dataTitle: i18n._('Destination SMS Number'), dataPlacement: 'right', dataContainer: "body", @@ -292,8 +292,8 @@ export default ['i18n', function(i18n) { color: { label: i18n._('Notification Color'), type: 'text', - awPopOver: i18n._('

Color can be one of yellow, green, red, ' + - 'purple, gray, or random.\n'), + awPopOver: '

' + i18n.sprintf(i18n._('Color can be one of %s.'), 'yellow, green, red, ' + + 'purple, gray, random') + '\n', awRequiredWhen: { reqExpression: "hipchat_required", init: "false" @@ -329,13 +329,13 @@ export default ['i18n', function(i18n) { reqExpression: "webhook_required", init: "false" }, - awPopOver: i18n._('

Specify HTTP Headers in JSON format

' + - '

For example:

\n' +
+                awPopOver: '

' + i18n._('Specify HTTP Headers in JSON format') + '

' + + '

' + i18n._('For example:') + '

\n' +
                            '{\n' +
                            '  "X-Auth-Token": "828jf0",\n' +
                            '  "X-Ansible": "Is great!"\n' +
                            '}\n' +
-                           '

'), + '

', dataPlacement: 'right', ngShow: "notification_type.value == 'webhook' ", subForm: 'typeSubForm', @@ -367,8 +367,8 @@ export default ['i18n', function(i18n) { label: i18n._('Destination Channels or Users'), type: 'textarea', rows: 3, - awPopOver: i18n._('

Type an option on each line. The pound symbol (#) is not required.

'+ - '

For example:
#support or support
\n @username or username
\n'), + awPopOver: '

' + i18n._('Type an option on each line. The pound symbol (#) is not required.') + '

'+ + '

' + i18n._('For example:') + '
' + i18n.sprintf(i18n._('%s or %s'), '#support', 'support') + '
\n ' + i18n.sprintf(i18n._('%s or %s'), '@username', 'username') + '
\n', dataTitle: i18n._('Destination Channels'), dataPlacement: 'right', dataContainer: "body", diff --git a/awx/ui/client/src/notifications/notificationTemplates.list.js b/awx/ui/client/src/notifications/notificationTemplates.list.js index 2c6f54f08c..f0e1d527d5 100644 --- a/awx/ui/client/src/notifications/notificationTemplates.list.js +++ b/awx/ui/client/src/notifications/notificationTemplates.list.js @@ -49,7 +49,7 @@ export default ['i18n', function(i18n){ ngClick: 'addNotification()', awToolTip: i18n._('Create a new custom inventory'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD'), + buttonContent: '+ ' + i18n._('ADD'), ngShow: 'canAdd' } }, diff --git a/awx/ui/client/src/notifications/notifications.list.js b/awx/ui/client/src/notifications/notifications.list.js index 688047d370..5509dfebfe 100644 --- a/awx/ui/client/src/notifications/notifications.list.js +++ b/awx/ui/client/src/notifications/notifications.list.js @@ -65,7 +65,7 @@ export default ['i18n', function(i18n){ ngClick: 'addNotificationTemplate()', awToolTip: i18n._('Create a new notification template'), actionClass: 'btn List-buttonSubmit', - buttonContent: i18n._('+ ADD NOTIFICATION TEMPLATE'), + buttonContent: '+ ' + i18n._('ADD NOTIFICATION TEMPLATE'), ngShow: 'current_user.is_superuser || (current_user_admin_orgs && current_user_admin_orgs.length > 0)' } } diff --git a/awx/ui/client/src/shared/form-generator.js b/awx/ui/client/src/shared/form-generator.js index dc5f01bf18..77bf4616d1 100644 --- a/awx/ui/client/src/shared/form-generator.js +++ b/awx/ui/client/src/shared/form-generator.js @@ -961,7 +961,7 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat this.form.name + "_form." + fld + `.$error.email'>${error_message}

`; } if (field.awPassMatch) { - error_message = error_message = i18n._("This value does not match the password you entered previously. Please confirm that password."); + error_message = i18n._("This value does not match the password you entered previously. Please confirm that password."); html += "
${error_message}
`; } @@ -973,7 +973,7 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat if (field.chkPass && $AnsibleConfig) { // password strength if ($AnsibleConfig.password_length) { - error_message = i18n.format(i18n._("Your password must be %d characters long."), $AnsibleConfig.password_length); + error_message = i18n.sprintf(i18n._("Your password must be %d characters long."), $AnsibleConfig.password_length); html += "
${error_message}
`; } @@ -993,7 +993,7 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat `.$error.hasNumber">${error_message}
`; } if ($AnsibleConfig.password_hasSymbol) { - i18n.format(i18n._("Your password must contain one of the following characters: %s"), "`~!@#$%^&*()_-+=|}\]{\[;:\"\'?\/>.<,"); + error_message = i18n.sprintf(i18n._("Your password must contain one of the following characters: %s"), "`~!@#$%^&*()_-+=|}\]{\[;:\"\'?\/>.<,"); html += "
${error_message}
`; } @@ -1097,7 +1097,7 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat if(!field.multiSelect && !field.disableChooseOption){ html += "\n"; } @@ -1459,9 +1459,9 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat html += (options.mode === 'edit') ? this.form.editTitle : this.form.addTitle; if(this.form.name === "user"){ html+= "Admin"; + "ng-show='is_superuser'>" + i18n._("Admin") + ""; html+= "Auditor"; + "ng-show='is_system_auditor'>" + i18n._("Auditor") + ""; html+= "LDAP"; html+= "\n"; - html += "
Loading...
\n"; + html += "
" + i18n._("Loading...") + "
\n"; html += "\n"; // End List diff --git a/awx/ui/grunt-tasks/nggettext_extract.js b/awx/ui/grunt-tasks/nggettext_extract.js index 3257b384ee..de297658e3 100644 --- a/awx/ui/grunt-tasks/nggettext_extract.js +++ b/awx/ui/grunt-tasks/nggettext_extract.js @@ -4,8 +4,8 @@ module.exports = { markerNames: ['_', 'N_'] }, files: { - 'po/ansible-tower.pot': ['client/src/**/*.js', - 'client/src/**/*.html'] + 'po/ansible-tower-ui.pot': ['client/src/**/*.js', + 'client/src/**/*.html'] } }, }; diff --git a/awx/ui/package.json b/awx/ui/package.json index 6b579f4df4..4cba5b9df9 100644 --- a/awx/ui/package.json +++ b/awx/ui/package.json @@ -108,6 +108,7 @@ "ng-toast": "leigh-johnson/ngToast#2.0.1", "nvd3": "leigh-johnson/nvd3#1.7.1", "reconnectingwebsocket": "^1.0.0", - "select2": "^4.0.2" + "select2": "^4.0.2", + "sprintf-js": "^1.0.3" } } diff --git a/awx/ui/po/ansible-tower.pot b/awx/ui/po/ansible-tower-ui.pot similarity index 56% rename from awx/ui/po/ansible-tower.pot rename to awx/ui/po/ansible-tower-ui.pot index 70b35a0ba9..e213c65a24 100644 --- a/awx/ui/po/ansible-tower.pot +++ b/awx/ui/po/ansible-tower-ui.pot @@ -4,279 +4,53 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: \n" -#: client/src/forms/Credentials.js:453 -#: client/src/forms/Inventories.js:108 -#: client/src/forms/Organizations.js:74 -#: client/src/forms/Projects.js:247 -#: client/src/forms/Teams.js:88 -#: client/src/inventory-scripts/inventory-scripts.list.js:45 -#: client/src/lists/Credentials.js:62 -#: client/src/lists/Inventories.js:95 -#: client/src/lists/JobTemplates.js:59 -#: client/src/lists/Projects.js:68 -#: client/src/lists/Teams.js:51 -#: client/src/lists/Users.js:48 -#: client/src/notifications/notificationTemplates.list.js:52 -msgid "+ ADD" +#: client/src/notifications/notificationTemplates.form.js:371 +msgid "%s or %s" msgstr "" -#: client/src/notifications/notifications.list.js:68 -msgid "+ ADD NOTIFICATION TEMPLATE" +#: client/src/controllers/Projects.js:398 +#: client/src/controllers/Projects.js:679 +msgid "%sNote:%s Mercurial does not support password authentication for SSH. Do not put the username and key in the URL. If using Bitbucket and SSH, do not supply your Bitbucket username." +msgstr "" + +#: client/src/controllers/Projects.js:385 +#: client/src/controllers/Projects.js:666 +msgid "%sNote:%s When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using SSH. GIT read only protocol (git://) does not use username or password information." +msgstr "" + +#: client/src/forms/Credentials.js:288 +msgid "(defaults to %s)" msgstr "" #: client/src/organizations/list/organizations-list.partial.html:15 msgid "+ ADD" msgstr "" -#: client/src/controllers/Projects.js:779 +#: client/src/controllers/Projects.js:558 msgid ". GET status:" msgstr "" -#: client/src/controllers/Projects.js:270 -msgid "
Are you sure you want to delete the project below?
" +#: client/src/forms/Credentials.js:443 +#: client/src/forms/Inventories.js:153 +#: client/src/forms/Organizations.js:75 +#: client/src/forms/Projects.js:238 +#: client/src/forms/Teams.js:86 +#: client/src/inventory-scripts/inventory-scripts.list.js:45 +#: client/src/lists/Credentials.js:59 +#: client/src/lists/Inventories.js:69 +#: client/src/lists/JobTemplates.js:55 +#: client/src/lists/Projects.js:60 +#: client/src/lists/Teams.js:51 +#: client/src/lists/Users.js:58 +#: client/src/notifications/notificationTemplates.list.js:52 +msgid "ADD" msgstr "" -#: client/src/controllers/Projects.js:881 -msgid "
Are you sure you want to remove the %s below from %s?
" +#: client/src/notifications/notifications.list.js:68 +msgid "ADD NOTIFICATION TEMPLATE" msgstr "" -#: client/src/controllers/Projects.js:328 -msgid "
An SCM update does not appear to be running for project: %s. Click the Refresh button to view the latest status.
" -msgstr "" - -#: client/src/controllers/Projects.js:304 -msgid "
Either you do not have access or the SCM update process completed. Click the Refresh button to view the latest status.
" -msgstr "" - -#: client/src/forms/Credentials.js:127 -msgid "
Security Token Service (STS) is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users.
To learn more about the IAM STS Token, refer to the Amazon documentation.
" -msgstr "" - -#: client/src/forms/Credentials.js:69 -msgid "" -"
\n" -"
Machine
\n" -"
Authentication for remote machine access. This can include SSH keys, usernames, passwords, and sudo information. Machine credentials are used when submitting jobs to run playbooks against remote hosts.
Network
\n" -"
Authentication for network device access. This can include SSH keys, usernames, passwords, and authorize information. Network credentials are used when submitting jobs to run playbooks against network devices.
Source Control
\n" -"
Used to check out and synchronize playbook repositories with a remote source control management system such as Git, Subversion (svn), or Mercurial (hg). These credentials are used by Projects.
\n" -"
Others (Cloud Providers)
\n" -"
Usernames, passwords, and access keys for authenticating to the specified cloud or infrastructure provider. These are used for dynamic inventory sources and for cloud provisioning and deployment in playbook runs.
\n" -"
" -msgstr "" - -#: client/src/controllers/Projects.js:550 -#: client/src/controllers/Projects.js:918 -msgid "

URL popover text" -msgstr "" - -#: client/src/forms/Projects.js:85 -msgid "

Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. Together the base path and selected playbook directory provide the full path used to locate playbooks.

Use PROJECTS_ROOT in your environment settings file to determine the base path value.

" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:295 -msgid "

Color can be one of yellow, green, red, purple, gray, or random." -msgstr "" - -#: client/src/forms/JobTemplates.js:228 -msgid "

Control the level of output ansible will produce as the playbook executes.

" -msgstr "" - -#: client/src/forms/Projects.js:172 -msgid "

Delete the local repository in its entirety prior to performing an update.

Depending on the size of the repository this may significantly increase the amount of time required to complete an update.

" -msgstr "" - -#: client/src/inventory-scripts/inventory-scripts.form.js:59 -msgid "

Drag and drop your custom inventory script file here or create one in the field to import your custom inventory.

Script must begin with a hashbang sequence: i.e.... #!/usr/bin/env python

" -msgstr "" - -#: client/src/forms/Projects.js:185 -msgid "

Each time a job runs using this project, perform an update to the local repository prior to starting the job.

" -msgstr "" - -#: client/src/forms/JobTemplates.js:298 -msgid "

Enables creation of a provisioning callback URL. Using the URL a host can contact Tower and request a configuration update using this job template.

" -msgstr "" - -#: client/src/forms/Inventories.js:61 -msgid "" -"

Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two.

JSON:
\n" -"
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" -"YAML:
\n" -"
---
somevar: somevalue
password: magic
\n" -"

View JSON examples at www.json.org

View YAML examples at docs.ansible.com

" -msgstr "" - -#: client/src/controllers/Projects.js:530 -#: client/src/controllers/Projects.js:898 -msgid "

Example URLs for GIT SCM include:

  • https://github.com/ansible/ansible.git
  • git@github.com:ansible/ansible.git
  • git://servername.example.com/ansible.git

Note: When using SSH protocol for GitHub or Bitbucket, enter an SSH key only, do not enter a username (other than git). Additionally, GitHub and Bitbucket do not support password authentication when using SSH. GIT read only protocol (git://) does not use username or password information." -msgstr "" - -#: client/src/controllers/Projects.js:542 -#: client/src/controllers/Projects.js:910 -msgid "

Example URLs for Mercurial SCM include:

  • https://bitbucket.org/username/project
  • ssh://hg@bitbucket.org/username/project
  • ssh://server.example.com/path

Note: Mercurial does not support password authentication for SSH. Do not put the username and key in the URL. If using Bitbucket and SSH, do not supply your Bitbucket username." -msgstr "" - -#: client/src/controllers/Projects.js:537 -#: client/src/controllers/Projects.js:905 -msgid "

Example URLs for Subversion SCM include:

  • https://github.com/ansible/ansible
  • svn://servername.example.com/path
  • svn+ssh://servername.example.com/path
" -msgstr "" - -#: client/src/forms/JobTemplates.js:284 -msgid "

If enabled, run this playbook as an administrator. This is the equivalent of passing the --become option to the ansible-playbook command.

" -msgstr "" - -#: client/src/forms/Credentials.js:55 -msgid "

If no organization is given, the credential can only be used by the user that creates the credential. Organization admins and system administrators can assign an organization so that roles for the credential can be assigned to users and teams in that organization.

" -msgstr "" - -#: client/src/forms/JobTemplates.js:176 -msgid "

Network credentials are used by Ansible networking modules to connect to and manage networking devices.

" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:198 -msgid "

Number associated with the \"Messaging Service\" in Twilio.

This must be of the form +18005550199.

" -msgstr "" - -#: client/src/forms/Credentials.js:386 -msgid "

OpenStack domains define administrative boundaries. It is only needed for Keystone v3 authentication URLs. Common scenarios include:

  • v2 URLs - leave blank
  • v3 default - set to 'default'
  • v3 multi-domain - your domain name

" -msgstr "" - -#: client/src/forms/JobTemplates.js:346 -msgid "

Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs in the Tower display.

" -msgstr "" - -#: client/src/forms/JobTemplates.js:359 -msgid "" -"

Pass extra command line variables to the playbook. This is the -e or --extra-vars command line parameter for ansible-playbook. Provide key/value pairs using either YAML or JSON.

JSON:
\n" -"
{
 \"somevar\": \"somevalue\",
 \"password\": \"magic\"
}
\n" -"YAML:
\n" -"
---
somevar: somevalue
password: magic
" -msgstr "" - -#: client/src/forms/JobTemplates.js:262 -msgid "" -"

Provide a comma separated list of tags.

\n" -"

Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task.

Consult the Ansible documentation for further details on the usage of tags.

" -msgstr "" - -#: client/src/forms/JobTemplates.js:242 -msgid "" -"

Provide a comma separated list of tags.

\n" -"

Tags are useful when you have a large playbook, and you want to run a specific part of a play or task.

Consult the Ansible documentation for further details on the usage of tags.

" -msgstr "" - -#: client/src/forms/JobTemplates.js:208 -msgid "

Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns can be separated by ; : or ,

For more information and examples see the Patterns topic at docs.ansible.com.

" -msgstr "" - -#: client/src/forms/Projects.js:160 -msgid "

Remove any local modifications prior to performing an update.

" -msgstr "" - -#: client/src/forms/Projects.js:103 -msgid "

Select from the list of directories found in the base path.Together the base path and the playbook directory provide the full path used to locate playbooks.

Use PROJECTS_ROOT in your environment settings file to determine the base path value.

" -msgstr "" - -#: client/src/forms/JobTemplates.js:140 -msgid "

Select the credential you want the job to use when accessing the remote hosts. Choose the credential containing the username and SSH key or password that Ansible will need to log into the remote hosts.

" -msgstr "" - -#: client/src/forms/JobTemplates.js:78 -msgid "

Select the inventory containing the hosts you want this job to manage.

" -msgstr "" - -#: client/src/forms/JobTemplates.js:122 -msgid "

Select the playbook to be executed by this job.

" -msgstr "" - -#: client/src/forms/JobTemplates.js:105 -msgid "

Select the project containing the playbook you want this job to execute.

" -msgstr "" - -#: client/src/forms/JobTemplates.js:160 -msgid "

Selecting an optional cloud credential in the job template will pass along the access credentials to the running playbook, allowing provisioning into the cloud without manually passing parameters to the included modules.

" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:332 -msgid "" -"

Specify HTTP Headers in JSON format

For example:

\n"
-"{\n"
-"  \"X-Auth-Token\": \"828jf0\",\n"
-"  \"X-Ansible\": \"Is great!\"\n"
-"}\n"
-"

" -msgstr "" - -#: client/src/forms/Credentials.js:290 -msgid "

Specify a method for 'become' operations. This is equivalent to specifying the --become-method=BECOME_METHOD parameter, where BECOME_METHOD could be sudo | su | pbrun | pfexec | runas
(defaults to sudo)

" -msgstr "" - -#: client/src/forms/Credentials.js:163 -msgid "

Subscription ID is an Azure construct, which is mapped to a username.

" -msgstr "" - -#: client/src/helpers/Credentials.js:105 -msgid "

The Project ID is the GCE assigned identification. It is constructed as two words followed by a three digit number. Such as:

adjective-noun-000

" -msgstr "" - -#: client/src/forms/Credentials.js:192 -msgid "

The email address assigned to the Google Compute Engine service account.

" -msgstr "" - -#: client/src/helpers/Credentials.js:141 -msgid "

The host to authenticate with.
For example, https://openstack.business.com/v2.0/" -msgstr "" - -#: client/src/helpers/Credentials.js:75 -msgid "

The host value

" -msgstr "" - -#: client/src/forms/JobTemplates.js:194 -msgid "

The number of parallel or simultaneous processes to use while executing the playbook. 0 signifies the default value from the ansible configuration file.

" -msgstr "" - -#: client/src/helpers/Credentials.js:74 -msgid "

The project value

" -msgstr "" - -#: client/src/helpers/Credentials.js:138 -msgid "

This is the tenant name. This value is usually the same as the username.

" -msgstr "" - -#: client/src/forms/Projects.js:204 -msgid "

Time in seconds to consider a project to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest project update. If it is older than Cache Timeout, it is not considered current, and a new project update will be performed.

" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:370 -msgid "" -"

Type an option on each line. The pound symbol (#) is not required.

For example:
#support or support
\n" -" @username or username
" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:141 -#: client/src/notifications/notificationTemplates.form.js:158 -msgid "" -"

Type an option on each line. The pound symbol (#) is not required.

For example:
engineering
\n" -" #support
" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:212 -msgid "" -"

Type an option on each line.

For example:
+12125552368
\n" -"+19105556162
" -msgstr "" - -#: client/src/notifications/notificationTemplates.form.js:97 -msgid "" -"

Type an option on each line.

For example:
alias1@email.com
\n" -" alias2@email.com
" -msgstr "" - -#: client/src/forms/JobTemplates.js:52 -msgid "

When this template is submitted as a job, setting the type to run will execute the playbook, running tasks on the selected hosts.

Setting the type to check will not execute the playbook. Instead, ansible will check playbook syntax, test environment setup and report problems.

Setting the type to scan will execute the playbook and store any scanned facts for use with Tower's System Tracking feature.

" -msgstr "" - -#: client/src/forms/Credentials.js:200 +#: client/src/forms/Credentials.js:199 msgid "API Key" msgstr "" @@ -288,11 +62,11 @@ msgstr "" msgid "API Token" msgstr "" -#: client/src/setup-menu/setup-menu.partial.html:53 +#: client/src/setup-menu/setup-menu.partial.html:59 msgid "About Tower" msgstr "" -#: client/src/forms/Credentials.js:94 +#: client/src/forms/Credentials.js:92 msgid "Access Key" msgstr "" @@ -305,7 +79,7 @@ msgid "Account Token" msgstr "" #: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:20 -#: client/src/shared/list-generator/list-generator.factory.js:690 +#: client/src/shared/list-generator/list-generator.factory.js:502 msgid "Actions" msgstr "" @@ -314,6 +88,12 @@ msgstr "" msgid "Activity" msgstr "" +#: client/src/forms/Inventories.js:104 +#: client/src/forms/Inventories.js:150 +#: client/src/forms/Organizations.js:72 +msgid "Add" +msgstr "" + #: client/src/lists/Credentials.js:17 msgid "Add Credentials" msgstr "" @@ -334,7 +114,7 @@ msgstr "" msgid "Add Project" msgstr "" -#: client/src/shared/form-generator.js:1752 +#: client/src/shared/form-generator.js:1637 msgid "Add Survey" msgstr "" @@ -342,14 +122,14 @@ msgstr "" msgid "Add Team" msgstr "" -#: client/src/lists/Users.js:15 +#: client/src/lists/Users.js:25 msgid "Add Users" msgstr "" -#: client/src/forms/Credentials.js:451 -#: client/src/forms/Inventories.js:106 -#: client/src/forms/Organizations.js:72 -#: client/src/forms/Projects.js:245 +#: client/src/forms/Credentials.js:441 +#: client/src/forms/Inventories.js:151 +#: client/src/forms/Organizations.js:73 +#: client/src/forms/Projects.js:236 msgid "Add a permission" msgstr "" @@ -357,11 +137,11 @@ msgstr "" msgid "Add passwords, SSH keys, etc. for Tower to use when launching jobs against machines, or when syncing inventories or projects." msgstr "" -#: client/src/forms/Teams.js:86 +#: client/src/forms/Teams.js:84 msgid "Add user to team" msgstr "" -#: client/src/shared/form-generator.js:1523 +#: client/src/shared/form-generator.js:1446 msgid "Admin" msgstr "" @@ -376,8 +156,8 @@ msgstr "" msgid "All Jobs" msgstr "" -#: client/src/forms/JobTemplates.js:292 -#: client/src/forms/JobTemplates.js:301 +#: client/src/forms/JobTemplates.js:296 +#: client/src/forms/JobTemplates.js:303 msgid "Allow Provisioning Callbacks" msgstr "" @@ -385,26 +165,50 @@ msgstr "" msgid "Allow others to sign into Tower and own the content they create." msgstr "" -#: client/src/forms/Credentials.js:236 -#: client/src/forms/Credentials.js:276 -#: client/src/forms/Credentials.js:317 -#: client/src/forms/Credentials.js:408 +#: client/src/controllers/Projects.js:221 +msgid "An SCM update does not appear to be running for project: %s. Click the %sRefresh%s button to view the latest status." +msgstr "" + +#: client/src/controllers/Projects.js:163 +msgid "Are you sure you want to delete the project below?" +msgstr "" + +#: client/src/controllers/Projects.js:647 +msgid "Are you sure you want to remove the %s below from %s?" +msgstr "" + +#: client/src/forms/Credentials.js:233 +#: client/src/forms/Credentials.js:271 +#: client/src/forms/Credentials.js:311 +#: client/src/forms/Credentials.js:396 msgid "Ask at runtime?" msgstr "" -#: client/src/shared/form-generator.js:1527 +#: client/src/shared/form-generator.js:1448 msgid "Auditor" msgstr "" -#: client/src/forms/Credentials.js:348 +#: client/src/forms/Credentials.js:73 +msgid "Authentication for network device access. This can include SSH keys, usernames, passwords, and authorize information. Network credentials are used when submitting jobs to run playbooks against network devices." +msgstr "" + +#: client/src/forms/Credentials.js:69 +msgid "Authentication for remote machine access. This can include SSH keys, usernames, passwords, and sudo information. Machine credentials are used when submitting jobs to run playbooks against remote hosts." +msgstr "" + +#: client/src/forms/Credentials.js:342 msgid "Authorize" msgstr "" -#: client/src/forms/Credentials.js:356 +#: client/src/forms/Credentials.js:350 msgid "Authorize Password" msgstr "" -#: client/src/forms/JobTemplates.js:286 +#: client/src/forms/Projects.js:80 +msgid "Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. Together the base path and selected playbook directory provide the full path used to locate playbooks." +msgstr "" + +#: client/src/forms/JobTemplates.js:290 msgid "Become Privilege Escalation" msgstr "" @@ -412,72 +216,52 @@ msgstr "" msgid "Browse" msgstr "" -#: client/src/app.js:441 -msgid "CREATE CREDENTIAL" -msgstr "" - -#: client/src/job-templates/add/job-templates-add.route.js:17 -msgid "CREATE JOB TEMPLATE" -msgstr "" - -#: client/src/app.js:307 -msgid "CREATE PROJECT" -msgstr "" - -#: client/src/app.js:356 -msgid "CREATE TEAM" -msgstr "" - -#: client/src/app.js:478 -msgid "CREATE USER" -msgstr "" - -#: client/src/app.js:431 +#: client/src/app.js:305 msgid "CREDENTIALS" msgstr "" -#: client/src/forms/Projects.js:207 +#: client/src/forms/Projects.js:195 msgid "Cache Timeout" msgstr "" -#: client/src/forms/Projects.js:194 -msgid "Cache Timeout (seconds)" +#: client/src/forms/Projects.js:184 +msgid "Cache Timeout%s (seconds)%s" msgstr "" -#: client/src/controllers/Projects.js:264 +#: client/src/controllers/Projects.js:157 msgid "Call to %s failed. DELETE returned status:" msgstr "" -#: client/src/controllers/Projects.js:309 -#: client/src/controllers/Projects.js:325 +#: client/src/controllers/Projects.js:202 +#: client/src/controllers/Projects.js:218 msgid "Call to %s failed. GET status:" msgstr "" -#: client/src/controllers/Projects.js:288 +#: client/src/controllers/Projects.js:181 msgid "Call to %s failed. POST status:" msgstr "" -#: client/src/controllers/Projects.js:334 +#: client/src/controllers/Projects.js:227 msgid "Call to get project failed. GET status:" msgstr "" -#: client/src/shared/form-generator.js:1740 +#: client/src/shared/form-generator.js:1625 msgid "Cancel" msgstr "" -#: client/src/controllers/Projects.js:304 +#: client/src/controllers/Projects.js:197 msgid "Cancel Not Allowed" msgstr "" -#: client/src/lists/Projects.js:122 +#: client/src/lists/Projects.js:114 msgid "Cancel the SCM update" msgstr "" -#: client/src/controllers/Projects.js:66 +#: client/src/controllers/Projects.js:53 msgid "Canceled. Click for details" msgstr "" -#: client/src/shared/form-generator.js:1169 +#: client/src/shared/form-generator.js:1091 msgid "Choose a %s" msgstr "" @@ -485,11 +269,11 @@ msgstr "" msgid "Choose your license file, agree to the End User License Agreement, and click submit." msgstr "" -#: client/src/forms/Projects.js:156 +#: client/src/forms/Projects.js:152 msgid "Clean" msgstr "" -#: client/src/forms/Credentials.js:326 +#: client/src/forms/Credentials.js:320 msgid "Client ID" msgstr "" @@ -497,27 +281,27 @@ msgstr "" msgid "Client Identifier" msgstr "" -#: client/src/forms/Credentials.js:335 +#: client/src/forms/Credentials.js:329 msgid "Client Secret" msgstr "" -#: client/src/shared/form-generator.js:1744 +#: client/src/shared/form-generator.js:1629 msgid "Close" msgstr "" -#: client/src/forms/JobTemplates.js:152 -#: client/src/forms/JobTemplates.js:162 +#: client/src/forms/JobTemplates.js:161 +#: client/src/forms/JobTemplates.js:173 msgid "Cloud Credential" msgstr "" -#: client/src/lists/Inventories.js:62 -msgid "Cloud sourced?" -msgstr "" - #: client/src/helpers/Credentials.js:158 msgid "CloudForms Host" msgstr "" +#: client/src/notifications/notificationTemplates.form.js:295 +msgid "Color can be one of %s." +msgstr "" + #: client/src/lists/CompletedJobs.js:18 msgid "Completed Jobs" msgstr "" @@ -526,15 +310,24 @@ msgstr "" msgid "Configure Notifications" msgstr "" -#: client/src/forms/Users.js:87 +#: client/src/forms/Users.js:82 msgid "Confirm Password" msgstr "" -#: client/src/lists/JobTemplates.js:85 +#: client/src/forms/JobTemplates.js:252 +#: client/src/forms/JobTemplates.js:270 +msgid "Consult the Ansible documentation for further details on the usage of tags." +msgstr "" + +#: client/src/forms/JobTemplates.js:238 +msgid "Control the level of output ansible will produce as the playbook executes." +msgstr "" + +#: client/src/lists/JobTemplates.js:81 msgid "Copy" msgstr "" -#: client/src/lists/JobTemplates.js:88 +#: client/src/lists/JobTemplates.js:84 msgid "Copy template" msgstr "" @@ -542,7 +335,7 @@ msgstr "" msgid "Create Credential" msgstr "" -#: client/src/lists/Credentials.js:60 +#: client/src/lists/Credentials.js:57 msgid "Create a new credential" msgstr "" @@ -551,7 +344,7 @@ msgstr "" msgid "Create a new custom inventory" msgstr "" -#: client/src/lists/Inventories.js:93 +#: client/src/lists/Inventories.js:67 msgid "Create a new inventory" msgstr "" @@ -563,7 +356,7 @@ msgstr "" msgid "Create a new organization" msgstr "" -#: client/src/lists/Projects.js:66 +#: client/src/lists/Projects.js:58 msgid "Create a new project" msgstr "" @@ -571,11 +364,11 @@ msgstr "" msgid "Create a new team" msgstr "" -#: client/src/lists/JobTemplates.js:57 +#: client/src/lists/JobTemplates.js:53 msgid "Create a new template" msgstr "" -#: client/src/lists/Users.js:46 +#: client/src/lists/Users.js:56 msgid "Create a new user" msgstr "" @@ -587,7 +380,7 @@ msgstr "" msgid "Create templates for sending notifications with Email, HipChat, Slack, and SMS." msgstr "" -#: client/src/forms/JobTemplates.js:142 +#: client/src/forms/JobTemplates.js:151 msgid "Credential" msgstr "" @@ -598,31 +391,31 @@ msgid "Credentials" msgstr "" #: client/src/inventory-scripts/inventory-scripts.form.js:50 -#: client/src/inventory-scripts/inventory-scripts.form.js:61 +#: client/src/inventory-scripts/inventory-scripts.form.js:60 msgid "Custom Script" msgstr "" -#: client/src/app.js:264 +#: client/src/app.js:407 msgid "DASHBOARD" msgstr "" -#: client/src/controllers/Projects.js:269 -#: client/src/controllers/Projects.js:880 +#: client/src/controllers/Projects.js:162 +#: client/src/controllers/Projects.js:646 #: client/src/inventory-scripts/inventory-scripts.list.js:74 -#: client/src/lists/Credentials.js:92 -#: client/src/lists/Inventories.js:119 -#: client/src/lists/JobTemplates.js:109 +#: client/src/lists/Credentials.js:90 +#: client/src/lists/Inventories.js:93 +#: client/src/lists/JobTemplates.js:105 #: client/src/lists/Teams.js:78 -#: client/src/lists/Users.js:77 +#: client/src/lists/Users.js:87 #: client/src/notifications/notificationTemplates.list.js:89 msgid "Delete" msgstr "" -#: client/src/lists/Credentials.js:94 +#: client/src/lists/Credentials.js:92 msgid "Delete credential" msgstr "" -#: client/src/lists/Inventories.js:121 +#: client/src/lists/Inventories.js:95 msgid "Delete inventory" msgstr "" @@ -634,7 +427,7 @@ msgstr "" msgid "Delete notification" msgstr "" -#: client/src/forms/Projects.js:168 +#: client/src/forms/Projects.js:162 msgid "Delete on Update" msgstr "" @@ -642,35 +435,43 @@ msgstr "" msgid "Delete team" msgstr "" -#: client/src/lists/JobTemplates.js:112 +#: client/src/lists/JobTemplates.js:108 msgid "Delete template" msgstr "" -#: client/src/lists/Projects.js:116 +#: client/src/forms/Projects.js:164 +msgid "Delete the local repository in its entirety prior to performing an update." +msgstr "" + +#: client/src/lists/Projects.js:108 msgid "Delete the project" msgstr "" -#: client/src/lists/ScheduledJobs.js:95 +#: client/src/lists/ScheduledJobs.js:80 msgid "Delete the schedule" msgstr "" -#: client/src/lists/Users.js:81 +#: client/src/lists/Users.js:91 msgid "Delete user" msgstr "" -#: client/src/forms/Credentials.js:40 -#: client/src/forms/Inventories.js:35 -#: client/src/forms/JobTemplates.js:36 +#: client/src/forms/Projects.js:164 +msgid "Depending on the size of the repository this may significantly increase the amount of time required to complete an update." +msgstr "" + +#: client/src/forms/Credentials.js:41 +#: client/src/forms/Inventories.js:37 +#: client/src/forms/JobTemplates.js:39 #: client/src/forms/Organizations.js:33 #: client/src/forms/Projects.js:38 -#: client/src/forms/Teams.js:33 -#: client/src/inventory-scripts/inventory-scripts.form.js:31 +#: client/src/forms/Teams.js:34 +#: client/src/inventory-scripts/inventory-scripts.form.js:32 #: client/src/inventory-scripts/inventory-scripts.list.js:25 #: client/src/lists/Credentials.js:34 #: client/src/lists/JobTemplates.js:30 -#: client/src/lists/PortalJobTemplates.js:30 +#: client/src/lists/PortalJobTemplates.js:29 #: client/src/lists/Teams.js:31 -#: client/src/notifications/notificationTemplates.form.js:34 +#: client/src/notifications/notificationTemplates.form.js:36 msgid "Description" msgstr "" @@ -692,43 +493,51 @@ msgid "Destination SMS Number" msgstr "" #: client/src/license/license.partial.html:5 -#: client/src/shared/form-generator.js:1561 +#: client/src/shared/form-generator.js:1477 msgid "Details" msgstr "" -#: client/src/forms/Teams.js:145 +#: client/src/forms/Teams.js:148 msgid "Dissasociate permission from team" msgstr "" -#: client/src/forms/Users.js:204 +#: client/src/forms/Users.js:217 msgid "Dissasociate permission from user" msgstr "" -#: client/src/forms/Credentials.js:391 +#: client/src/forms/Credentials.js:383 #: client/src/helpers/Credentials.js:133 msgid "Domain Name" msgstr "" +#: client/src/inventory-scripts/inventory-scripts.form.js:58 +msgid "Drag and drop your custom inventory script file here or create one in the field to import your custom inventory." +msgstr "" + +#: client/src/forms/Projects.js:175 +msgid "Each time a job runs using this project, perform an update to the local repository prior to starting the job." +msgstr "" + #: client/src/inventory-scripts/inventory-scripts.list.js:57 -#: client/src/lists/Credentials.js:73 -#: client/src/lists/Inventories.js:105 -#: client/src/lists/JobTemplates.js:93 +#: client/src/lists/Credentials.js:71 +#: client/src/lists/Inventories.js:79 +#: client/src/lists/JobTemplates.js:89 #: client/src/lists/Teams.js:61 -#: client/src/lists/Users.js:58 +#: client/src/lists/Users.js:68 #: client/src/notifications/notificationTemplates.list.js:63 #: client/src/notifications/notificationTemplates.list.js:72 msgid "Edit" msgstr "" -#: client/src/shared/form-generator.js:1756 +#: client/src/shared/form-generator.js:1641 msgid "Edit Survey" msgstr "" -#: client/src/lists/Credentials.js:75 +#: client/src/lists/Credentials.js:73 msgid "Edit credential" msgstr "" -#: client/src/lists/Inventories.js:107 +#: client/src/lists/Inventories.js:81 msgid "Edit inventory" msgstr "" @@ -744,64 +553,91 @@ msgstr "" msgid "Edit team" msgstr "" -#: client/src/lists/JobTemplates.js:95 +#: client/src/lists/JobTemplates.js:91 msgid "Edit template" msgstr "" -#: client/src/lists/Projects.js:103 +#: client/src/lists/Projects.js:95 msgid "Edit the project" msgstr "" -#: client/src/lists/ScheduledJobs.js:81 +#: client/src/lists/ScheduledJobs.js:66 msgid "Edit the schedule" msgstr "" -#: client/src/lists/Users.js:62 +#: client/src/lists/Users.js:72 msgid "Edit user" msgstr "" -#: client/src/forms/Credentials.js:193 +#: client/src/controllers/Projects.js:197 +msgid "Either you do not have access or the SCM update process completed. Click the %sRefresh%s button to view the latest status." +msgstr "" + +#: client/src/forms/Credentials.js:192 #: client/src/forms/Users.js:42 msgid "Email" msgstr "" -#: client/src/forms/JobTemplates.js:279 +#: client/src/forms/JobTemplates.js:285 msgid "Enable Privilege Escalation" msgstr "" +#: client/src/forms/JobTemplates.js:300 +msgid "Enables creation of a provisioning callback URL. Using the URL a host can contact Tower and request a configuration update using this job template." +msgstr "" + #: client/src/license/license.partial.html:108 msgid "End User License Agreement" msgstr "" +#: client/src/forms/Inventories.js:60 +msgid "Enter inventory variables using either JSON or YAML syntax. Use the radio button to toggle between the two." +msgstr "" + #: client/src/helpers/Credentials.js:159 -msgid "Enter the hostname or IP address for the virtual
machine which is hosting the CloudForm appliance." +msgid "Enter the hostname or IP address for the virtual %s machine which is hosting the CloudForm appliance." msgstr "" #: client/src/helpers/Credentials.js:150 -msgid "Enter the hostname or IP address name which
corresponds to your Red Hat Satellite 6 server." +msgid "Enter the hostname or IP address name which %scorresponds to your Red Hat Satellite 6 server." msgstr "" #: client/src/helpers/Credentials.js:128 msgid "Enter the hostname or IP address which corresponds to your VMware vCenter." msgstr "" -#: client/src/controllers/Projects.js:242 -#: client/src/controllers/Projects.js:263 -#: client/src/controllers/Projects.js:288 -#: client/src/controllers/Projects.js:309 -#: client/src/controllers/Projects.js:324 -#: client/src/controllers/Projects.js:333 -#: client/src/controllers/Projects.js:513 -#: client/src/controllers/Projects.js:778 +#: client/src/controllers/Projects.js:134 +#: client/src/controllers/Projects.js:156 +#: client/src/controllers/Projects.js:181 +#: client/src/controllers/Projects.js:202 +#: client/src/controllers/Projects.js:217 +#: client/src/controllers/Projects.js:226 +#: client/src/controllers/Projects.js:364 +#: client/src/controllers/Projects.js:557 msgid "Error!" msgstr "" +#: client/src/controllers/Projects.js:382 +#: client/src/controllers/Projects.js:664 +msgid "Example URLs for GIT SCM include:" +msgstr "" + +#: client/src/controllers/Projects.js:395 +#: client/src/controllers/Projects.js:676 +msgid "Example URLs for Mercurial SCM include:" +msgstr "" + +#: client/src/controllers/Projects.js:390 +#: client/src/controllers/Projects.js:671 +msgid "Example URLs for Subversion SCM include:" +msgstr "" + #: client/src/license/license.partial.html:39 msgid "Expires On" msgstr "" -#: client/src/forms/JobTemplates.js:351 -#: client/src/forms/JobTemplates.js:365 +#: client/src/forms/JobTemplates.js:349 +#: client/src/forms/JobTemplates.js:361 msgid "Extra Variables" msgstr "" @@ -817,15 +653,11 @@ msgstr "" msgid "Failed Hosts" msgstr "" -#: client/src/lists/Inventories.js:69 -msgid "Failed hosts?" -msgstr "" - -#: client/src/controllers/Projects.js:514 +#: client/src/controllers/Projects.js:365 msgid "Failed to create new project. POST returned status:" msgstr "" -#: client/src/controllers/Projects.js:779 +#: client/src/controllers/Projects.js:558 msgid "Failed to retrieve project:" msgstr "" @@ -833,26 +665,43 @@ msgstr "" msgid "Failure" msgstr "" -#: client/src/lists/CompletedJobs.js:72 -#: client/src/lists/PortalJobs.js:43 +#: client/src/lists/CompletedJobs.js:56 +#: client/src/lists/PortalJobs.js:37 msgid "Finished" msgstr "" -#: client/src/forms/Users.js:26 -#: client/src/lists/Users.js:31 +#: client/src/forms/Users.js:28 +#: client/src/lists/Users.js:41 msgid "First Name" msgstr "" -#: client/src/forms/JobTemplates.js:183 -#: client/src/forms/JobTemplates.js:197 +#: client/src/helpers/Credentials.js:142 +msgid "For example, %s" +msgstr "" + +#: client/src/notifications/notificationTemplates.form.js:142 +#: client/src/notifications/notificationTemplates.form.js:159 +#: client/src/notifications/notificationTemplates.form.js:213 +#: client/src/notifications/notificationTemplates.form.js:333 +#: client/src/notifications/notificationTemplates.form.js:371 +#: client/src/notifications/notificationTemplates.form.js:98 +msgid "For example:" +msgstr "" + +#: client/src/forms/JobTemplates.js:220 +msgid "For more information and examples see %sthe Patterns topic at docs.ansible.com%s." +msgstr "" + +#: client/src/forms/JobTemplates.js:196 +#: client/src/forms/JobTemplates.js:209 msgid "Forks" msgstr "" -#: client/src/forms/Teams.js:115 +#: client/src/forms/Teams.js:118 msgid "Granted Permissions" msgstr "" -#: client/src/forms/Users.js:176 +#: client/src/forms/Users.js:183 msgid "Granted permissions" msgstr "" @@ -864,7 +713,7 @@ msgstr "" msgid "HTTP Headers" msgstr "" -#: client/src/forms/Credentials.js:141 +#: client/src/forms/Credentials.js:140 #: client/src/notifications/notificationTemplates.form.js:72 msgid "Host" msgstr "" @@ -919,22 +768,38 @@ msgstr "" msgid "IRC Server Port" msgstr "" +#: client/src/forms/JobTemplates.js:288 +msgid "If enabled, run this playbook as an administrator. This is the equivalent of passing the %s option to the %s command." +msgstr "" + +#: client/src/forms/Credentials.js:54 +msgid "If no organization is given, the credential can only be used by the user that creates the credential. Organization admins and system administrators can assign an organization so that roles for the credential can be assigned to users and teams in that organization." +msgstr "" + #: client/src/license/license.partial.html:70 msgid "If you are ready to upgrade, please contact us by clicking the button below" msgstr "" +#: client/src/forms/JobTemplates.js:55 +msgid "Instead, %s will check playbook syntax, test environment setup and report problems." +msgstr "" + #: client/src/license/license.partial.html:11 msgid "Invalid License" msgstr "" +#: client/src/login/loginModal/loginModal.partial.html:30 +msgid "Invalid username and/or password. Please try again." +msgstr "" + #: client/src/dashboard/counts/dashboard-counts.directive.js:50 #: client/src/lists/Inventories.js:16 #: client/src/lists/Inventories.js:17 msgid "Inventories" msgstr "" -#: client/src/forms/JobTemplates.js:67 -#: client/src/forms/JobTemplates.js:79 +#: client/src/forms/JobTemplates.js:70 +#: client/src/forms/JobTemplates.js:83 msgid "Inventory" msgstr "" @@ -944,7 +809,6 @@ msgid "Inventory Scripts" msgstr "" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:46 -#: client/src/lists/ScheduledJobs.js:56 msgid "Inventory Sync" msgstr "" @@ -952,7 +816,7 @@ msgstr "" msgid "Inventory Sync Failures" msgstr "" -#: client/src/forms/Inventories.js:68 +#: client/src/forms/Inventories.js:67 msgid "Inventory Variables" msgstr "" @@ -965,15 +829,15 @@ msgstr "" msgid "JOB TEMPLATES" msgstr "" -#: client/src/app.js:284 +#: client/src/app.js:427 #: client/src/dashboard/graphs/job-status/job-status-graph.directive.js:113 #: client/src/main-menu/main-menu.partial.html:122 #: client/src/main-menu/main-menu.partial.html:43 msgid "JOBS" msgstr "" -#: client/src/forms/JobTemplates.js:235 #: client/src/forms/JobTemplates.js:245 +#: client/src/forms/JobTemplates.js:253 msgid "Job Tags" msgstr "" @@ -985,18 +849,14 @@ msgid "Job Templates" msgstr "" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:32 -#: client/src/forms/JobTemplates.js:44 -#: client/src/forms/JobTemplates.js:56 +#: client/src/forms/JobTemplates.js:45 +#: client/src/forms/JobTemplates.js:59 msgid "Job Type" msgstr "" -#: client/src/lists/CompletedJobs.js:81 -msgid "Job failed?" -msgstr "" - #: client/src/lists/PortalJobs.js:15 #: client/src/lists/PortalJobs.js:19 -#: client/src/partials/jobs.html:10 +#: client/src/partials/jobs.html:7 msgid "Jobs" msgstr "" @@ -1009,23 +869,23 @@ msgid "Label to be shown with notification" msgstr "" #: client/src/forms/JobTemplates.js:337 -#: client/src/forms/JobTemplates.js:344 -#: client/src/lists/JobTemplates.js:42 +#: client/src/forms/JobTemplates.js:342 +#: client/src/lists/JobTemplates.js:41 msgid "Labels" msgstr "" -#: client/src/forms/Users.js:34 -#: client/src/lists/Users.js:35 +#: client/src/forms/Users.js:35 +#: client/src/lists/Users.js:45 msgid "Last Name" msgstr "" -#: client/src/lists/Projects.js:53 +#: client/src/lists/Projects.js:46 msgid "Last Updated" msgstr "" -#: client/src/lists/JobTemplates.js:69 -#: client/src/lists/PortalJobTemplates.js:40 -#: client/src/shared/form-generator.js:1748 +#: client/src/lists/JobTemplates.js:65 +#: client/src/lists/PortalJobTemplates.js:39 +#: client/src/shared/form-generator.js:1633 msgid "Launch" msgstr "" @@ -1054,24 +914,24 @@ msgstr "" msgid "License Type" msgstr "" -#: client/src/forms/JobTemplates.js:203 -#: client/src/forms/JobTemplates.js:211 +#: client/src/forms/JobTemplates.js:215 +#: client/src/forms/JobTemplates.js:222 msgid "Limit" msgstr "" -#: client/src/shared/Socket.js:59 +#: client/src/shared/socket/socket.service.js:170 msgid "Live events: attempting to connect to the Tower server." msgstr "" -#: client/src/shared/Socket.js:62 +#: client/src/shared/socket/socket.service.js:174 msgid "Live events: connected. Pages containing job status information will automatically update in real-time." msgstr "" -#: client/src/shared/Socket.js:56 +#: client/src/shared/socket/socket.service.js:178 msgid "Live events: error connecting to the Tower server." msgstr "" -#: client/src/shared/list-generator/list-generator.factory.js:584 +#: client/src/shared/form-generator.js:1887 msgid "Loading..." msgstr "" @@ -1079,7 +939,15 @@ msgstr "" msgid "Log Out" msgstr "" -#: client/src/forms/JobTemplates.js:129 +#: client/src/management-jobs/card/card.route.js:21 +msgid "MANAGEMENT JOBS" +msgstr "" + +#: client/src/forms/Credentials.js:68 +msgid "Machine" +msgstr "" + +#: client/src/forms/JobTemplates.js:134 msgid "Machine Credential" msgstr "" @@ -1091,23 +959,24 @@ msgstr "" msgid "Management Certificate" msgstr "" -#: client/src/lists/ScheduledJobs.js:59 -msgid "Management Job" -msgstr "" - #: client/src/management-jobs/card/card.partial.html:4 #: client/src/setup-menu/setup-menu.partial.html:28 msgid "Management Jobs" msgstr "" -#: client/src/controllers/Projects.js:79 +#: client/src/controllers/Projects.js:62 msgid "Manual projects do not require a schedule" msgstr "" -#: client/src/controllers/Projects.js:78 +#: client/src/controllers/Projects.js:548 +#: client/src/controllers/Projects.js:61 msgid "Manual projects do not require an SCM update" msgstr "" +#: client/src/login/loginModal/loginModal.partial.html:24 +msgid "Maximum per-user sessions reached. Please sign in." +msgstr "" + #: client/src/portal-mode/portal-mode-jobs.partial.html:4 msgid "My Jobs" msgstr "" @@ -1122,36 +991,44 @@ msgstr "" #: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:14 #: client/src/dashboard/lists/jobs/jobs-list.partial.html:13 -#: client/src/forms/Credentials.js:32 -#: client/src/forms/Inventories.js:26 -#: client/src/forms/JobTemplates.js:28 -#: client/src/forms/Organizations.js:25 -#: client/src/forms/Projects.js:30 -#: client/src/forms/Teams.js:123 -#: client/src/forms/Teams.js:25 -#: client/src/forms/Users.js:183 -#: client/src/inventory-scripts/inventory-scripts.form.js:23 +#: client/src/forms/Credentials.js:34 +#: client/src/forms/Inventories.js:29 +#: client/src/forms/JobTemplates.js:32 +#: client/src/forms/Organizations.js:26 +#: client/src/forms/Projects.js:31 +#: client/src/forms/Teams.js:126 +#: client/src/forms/Teams.js:27 +#: client/src/forms/Users.js:190 +#: client/src/inventory-scripts/inventory-scripts.form.js:25 #: client/src/inventory-scripts/inventory-scripts.list.js:20 -#: client/src/lists/CompletedJobs.js:55 +#: client/src/lists/CompletedJobs.js:43 #: client/src/lists/Credentials.js:29 #: client/src/lists/Inventories.js:47 #: client/src/lists/JobTemplates.js:26 #: client/src/lists/PortalJobTemplates.js:24 -#: client/src/lists/PortalJobs.js:36 -#: client/src/lists/Projects.js:41 -#: client/src/lists/ScheduledJobs.js:33 +#: client/src/lists/PortalJobs.js:32 +#: client/src/lists/Projects.js:36 +#: client/src/lists/ScheduledJobs.js:32 #: client/src/lists/Teams.js:26 -#: client/src/notifications/notificationTemplates.form.js:26 +#: client/src/notifications/notificationTemplates.form.js:29 #: client/src/notifications/notificationTemplates.list.js:33 #: client/src/notifications/notifications.list.js:26 msgid "Name" msgstr "" -#: client/src/forms/JobTemplates.js:168 -#: client/src/forms/JobTemplates.js:177 +#: client/src/forms/Credentials.js:72 +msgid "Network" +msgstr "" + +#: client/src/forms/JobTemplates.js:179 +#: client/src/forms/JobTemplates.js:190 msgid "Network Credential" msgstr "" +#: client/src/forms/JobTemplates.js:189 +msgid "Network credentials are used by Ansible networking modules to connect to and manage networking devices." +msgstr "" + #: client/src/inventory-scripts/inventory-scripts.form.js:16 msgid "New Custom Inventory" msgstr "" @@ -1184,23 +1061,19 @@ msgstr "" msgid "New User" msgstr "" -#: client/src/lists/ScheduledJobs.js:64 +#: client/src/lists/ScheduledJobs.js:50 msgid "Next Run" msgstr "" -#: client/src/lists/Inventories.js:82 -msgid "No" -msgstr "" - #: client/src/lists/Credentials.js:24 msgid "No Credentials Have Been Created" msgstr "" -#: client/src/controllers/Projects.js:232 +#: client/src/controllers/Projects.js:124 msgid "No SCM Configuration" msgstr "" -#: client/src/controllers/Projects.js:223 +#: client/src/controllers/Projects.js:115 msgid "No Updates Available" msgstr "" @@ -1222,8 +1095,8 @@ msgstr "" msgid "No jobs were recently run." msgstr "" -#: client/src/forms/Teams.js:120 -#: client/src/forms/Users.js:180 +#: client/src/forms/Teams.js:123 +#: client/src/forms/Users.js:187 msgid "No permissions have been granted" msgstr "" @@ -1235,7 +1108,7 @@ msgstr "" msgid "Normal User" msgstr "" -#: client/src/controllers/Projects.js:81 +#: client/src/controllers/Projects.js:64 msgid "Not configured for SCM" msgstr "" @@ -1256,23 +1129,35 @@ msgstr "" msgid "Notify Channel" msgstr "" +#: client/src/notifications/notificationTemplates.form.js:198 +msgid "Number associated with the \"Messaging Service\" in Twilio." +msgstr "" + #: client/src/organizations/list/organizations-list.partial.html:6 msgid "ORGANIZATIONS" msgstr "" -#: client/src/forms/JobTemplates.js:275 +#: client/src/forms/Credentials.js:378 +msgid "OpenStack domains define administrative boundaries. It is only needed for Keystone v3 authentication URLs. Common scenarios include:" +msgstr "" + +#: client/src/forms/JobTemplates.js:344 +msgid "Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs in the Tower display." +msgstr "" + +#: client/src/forms/JobTemplates.js:281 #: client/src/notifications/notificationTemplates.form.js:391 msgid "Options" msgstr "" -#: client/src/forms/Credentials.js:50 -#: client/src/forms/Credentials.js:56 +#: client/src/forms/Credentials.js:49 +#: client/src/forms/Credentials.js:55 #: client/src/forms/Inventories.js:42 -#: client/src/forms/Projects.js:45 -#: client/src/forms/Projects.js:54 -#: client/src/forms/Teams.js:40 -#: client/src/forms/Users.js:60 -#: client/src/inventory-scripts/inventory-scripts.form.js:38 +#: client/src/forms/Projects.js:43 +#: client/src/forms/Projects.js:49 +#: client/src/forms/Teams.js:39 +#: client/src/forms/Users.js:59 +#: client/src/inventory-scripts/inventory-scripts.form.js:37 #: client/src/inventory-scripts/inventory-scripts.list.js:30 #: client/src/lists/Inventories.js:53 #: client/src/lists/Teams.js:36 @@ -1280,12 +1165,16 @@ msgstr "" msgid "Organization" msgstr "" -#: client/src/forms/Users.js:131 +#: client/src/forms/Users.js:129 #: client/src/setup-menu/setup-menu.partial.html:4 msgid "Organizations" msgstr "" -#: client/src/lists/Credentials.js:47 +#: client/src/forms/Credentials.js:80 +msgid "Others (Cloud Providers)" +msgstr "" + +#: client/src/lists/Credentials.js:45 msgid "Owners" msgstr "" @@ -1293,8 +1182,8 @@ msgstr "" msgid "PASSWORD" msgstr "" -#: client/src/organizations/list/organizations-list.partial.html:26 -#: client/src/shared/list-generator/list-generator.factory.js:415 +#: client/src/organizations/list/organizations-list.partial.html:44 +#: client/src/shared/list-generator/list-generator.factory.js:245 msgid "PLEASE ADD ITEMS TO THIS LIST" msgstr "" @@ -1302,7 +1191,6 @@ msgstr "" msgid "PORTAL MODE" msgstr "" -#: client/src/app.js:297 #: client/src/main-menu/main-menu.partial.html:19 #: client/src/main-menu/main-menu.partial.html:95 msgid "PROJECTS" @@ -1312,8 +1200,12 @@ msgstr "" msgid "Pagerduty subdomain" msgstr "" -#: client/src/forms/Credentials.js:228 -#: client/src/forms/Users.js:75 +#: client/src/forms/JobTemplates.js:355 +msgid "Pass extra command line variables to the playbook. This is the %s or %s command line parameter for %s. Provide key/value pairs using either YAML or JSON." +msgstr "" + +#: client/src/forms/Credentials.js:227 +#: client/src/forms/Users.js:70 #: client/src/helpers/Credentials.js:119 #: client/src/helpers/Credentials.js:127 #: client/src/helpers/Credentials.js:147 @@ -1355,32 +1247,31 @@ msgid "Paste the contents of the SSH private key file." msgstr "" #: client/src/helpers/Credentials.js:41 -msgid "Paste the contents of the SSH private key file.
esc or click to close
" +msgid "Paste the contents of the SSH private key file.%s or click to close%s" msgstr "" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:8 msgid "Period" msgstr "" -#: client/src/forms/Credentials.js:442 -#: client/src/forms/Inventories.js:97 -#: client/src/forms/JobTemplates.js:418 -#: client/src/forms/Organizations.js:63 -#: client/src/forms/Projects.js:236 +#: client/src/forms/Credentials.js:433 +#: client/src/forms/Inventories.js:142 +#: client/src/forms/JobTemplates.js:417 +#: client/src/forms/Organizations.js:64 +#: client/src/forms/Projects.js:228 msgid "Permissions" msgstr "" -#: client/src/forms/JobTemplates.js:112 -#: client/src/forms/JobTemplates.js:123 +#: client/src/forms/JobTemplates.js:117 +#: client/src/forms/JobTemplates.js:128 msgid "Playbook" msgstr "" -#: client/src/forms/Projects.js:94 +#: client/src/forms/Projects.js:89 msgid "Playbook Directory" msgstr "" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:52 -#: client/src/lists/ScheduledJobs.js:57 msgid "Playbook Run" msgstr "" @@ -1388,18 +1279,26 @@ msgstr "" msgid "Please click the button below to visit Ansible's website to get a Tower license key." msgstr "" -#: client/src/shared/form-generator.js:1026 -#: client/src/shared/form-generator.js:896 +#: client/src/shared/form-generator.js:835 +#: client/src/shared/form-generator.js:960 msgid "Please enter a URL that begins with ssh, http or https. The URL may not contain the '@' character." msgstr "" -#: client/src/shared/form-generator.js:1014 -#: client/src/shared/form-generator.js:884 +#: client/src/login/loginModal/loginModal.partial.html:74 +msgid "Please enter a password." +msgstr "" + +#: client/src/login/loginModal/loginModal.partial.html:54 +msgid "Please enter a username." +msgstr "" + +#: client/src/shared/form-generator.js:825 +#: client/src/shared/form-generator.js:950 msgid "Please enter a valid email address." msgstr "" -#: client/src/shared/form-generator.js:1009 -#: client/src/shared/form-generator.js:879 +#: client/src/shared/form-generator.js:820 +#: client/src/shared/form-generator.js:945 msgid "Please enter a value." msgstr "" @@ -1411,24 +1310,25 @@ msgstr "" msgid "Please save before adding notifications" msgstr "" -#: client/src/forms/Teams.js:74 +#: client/src/forms/Teams.js:69 msgid "Please save before adding users" msgstr "" -#: client/src/forms/Inventories.js:93 -#: client/src/forms/JobTemplates.js:414 -#: client/src/forms/Organizations.js:60 -#: client/src/forms/Projects.js:232 -#: client/src/forms/Teams.js:112 +#: client/src/forms/Inventories.js:138 +#: client/src/forms/Inventories.js:91 +#: client/src/forms/JobTemplates.js:410 +#: client/src/forms/Organizations.js:57 +#: client/src/forms/Projects.js:220 +#: client/src/forms/Teams.js:110 msgid "Please save before assigning permissions" msgstr "" -#: client/src/forms/Users.js:128 -#: client/src/forms/Users.js:172 +#: client/src/forms/Users.js:122 +#: client/src/forms/Users.js:179 msgid "Please save before assigning to organizations" msgstr "" -#: client/src/forms/Users.js:151 +#: client/src/forms/Users.js:148 msgid "Please save before assigning to teams" msgstr "" @@ -1436,18 +1336,18 @@ msgstr "" msgid "Port" msgstr "" -#: client/src/forms/Credentials.js:260 +#: client/src/forms/Credentials.js:257 #: client/src/helpers/Credentials.js:36 #: client/src/helpers/Credentials.js:60 msgid "Private Key" msgstr "" -#: client/src/forms/Credentials.js:267 +#: client/src/forms/Credentials.js:264 msgid "Private Key Passphrase" msgstr "" -#: client/src/forms/Credentials.js:284 -#: client/src/forms/Credentials.js:288 +#: client/src/forms/Credentials.js:279 +#: client/src/forms/Credentials.js:283 msgid "Privilege Escalation" msgstr "" @@ -1459,8 +1359,8 @@ msgstr "" msgid "Privilege Escalation Username" msgstr "" -#: client/src/forms/JobTemplates.js:106 -#: client/src/forms/JobTemplates.js:90 +#: client/src/forms/JobTemplates.js:111 +#: client/src/forms/JobTemplates.js:94 #: client/src/helpers/Credentials.js:103 msgid "Project" msgstr "" @@ -1469,16 +1369,16 @@ msgstr "" msgid "Project (Tenant Name)" msgstr "" -#: client/src/forms/Projects.js:80 -#: client/src/forms/Projects.js:88 +#: client/src/forms/Projects.js:75 +#: client/src/forms/Projects.js:83 msgid "Project Base Path" msgstr "" -#: client/src/forms/Credentials.js:370 +#: client/src/forms/Credentials.js:364 msgid "Project Name" msgstr "" -#: client/src/forms/Projects.js:106 +#: client/src/forms/Projects.js:101 msgid "Project Path" msgstr "" @@ -1486,7 +1386,7 @@ msgstr "" msgid "Project Sync Failures" msgstr "" -#: client/src/controllers/Projects.js:243 +#: client/src/controllers/Projects.js:135 msgid "Project lookup failed. GET returned:" msgstr "" @@ -1496,15 +1396,26 @@ msgstr "" msgid "Projects" msgstr "" -#: client/src/forms/JobTemplates.js:147 -#: client/src/forms/JobTemplates.js:216 -#: client/src/forms/JobTemplates.js:250 -#: client/src/forms/JobTemplates.js:270 -#: client/src/forms/JobTemplates.js:370 +#: client/src/forms/JobTemplates.js:156 +#: client/src/forms/JobTemplates.js:227 +#: client/src/forms/JobTemplates.js:258 +#: client/src/forms/JobTemplates.js:276 +#: client/src/forms/JobTemplates.js:366 +#: client/src/forms/JobTemplates.js:65 +#: client/src/forms/JobTemplates.js:89 msgid "Prompt on launch" msgstr "" -#: client/src/forms/JobTemplates.js:308 +#: client/src/forms/JobTemplates.js:250 +#: client/src/forms/JobTemplates.js:268 +msgid "Provide a comma separated list of tags." +msgstr "" + +#: client/src/forms/JobTemplates.js:218 +msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns can be separated by %s %s or %s" +msgstr "" + +#: client/src/forms/JobTemplates.js:310 #: client/src/forms/JobTemplates.js:318 msgid "Provisioning Callback URL" msgstr "" @@ -1522,8 +1433,8 @@ msgstr "" msgid "RECENTLY USED JOB TEMPLATES" msgstr "" -#: client/src/lists/Projects.js:77 -#: client/src/partials/jobs.html:20 +#: client/src/lists/Projects.js:69 +#: client/src/partials/jobs.html:15 #: client/src/portal-mode/portal-mode-jobs.partial.html:12 msgid "REFRESH" msgstr "" @@ -1538,38 +1449,42 @@ msgid "Recipient List" msgstr "" #: client/src/bread-crumb/bread-crumb.partial.html:6 -#: client/src/lists/Projects.js:73 -#: client/src/partials/jobs.html:19 +#: client/src/lists/Projects.js:65 msgid "Refresh the page" msgstr "" -#: client/src/forms/Teams.js:141 -#: client/src/forms/Users.js:201 +#: client/src/forms/Teams.js:144 +#: client/src/forms/Users.js:214 msgid "Remove" msgstr "" +#: client/src/forms/Projects.js:154 +msgid "Remove any local modifications prior to performing an update." +msgstr "" + #: client/src/license/license.partial.html:89 msgid "Request License" msgstr "" -#: client/src/forms/Credentials.js:466 -#: client/src/forms/Inventories.js:121 -#: client/src/forms/Organizations.js:87 -#: client/src/forms/Teams.js:101 -#: client/src/forms/Teams.js:134 -#: client/src/forms/Users.js:194 +#: client/src/forms/Credentials.js:455 +#: client/src/forms/Inventories.js:120 +#: client/src/forms/Inventories.js:166 +#: client/src/forms/Organizations.js:88 +#: client/src/forms/Teams.js:137 +#: client/src/forms/Teams.js:99 +#: client/src/forms/Users.js:201 msgid "Role" msgstr "" -#: client/src/forms/Projects.js:161 +#: client/src/forms/Projects.js:155 msgid "SCM Clean" msgstr "" -#: client/src/forms/Projects.js:138 +#: client/src/forms/Projects.js:131 msgid "SCM Credential" msgstr "" -#: client/src/forms/Projects.js:174 +#: client/src/forms/Projects.js:166 msgid "SCM Delete" msgstr "" @@ -1577,25 +1492,25 @@ msgstr "" msgid "SCM Private Key" msgstr "" -#: client/src/forms/Projects.js:60 +#: client/src/forms/Projects.js:56 msgid "SCM Type" msgstr "" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:49 -#: client/src/forms/Projects.js:186 -#: client/src/lists/ScheduledJobs.js:58 +#: client/src/forms/Projects.js:176 msgid "SCM Update" msgstr "" -#: client/src/controllers/Projects.js:284 +#: client/src/controllers/Projects.js:177 msgid "SCM Update Cancel" msgstr "" -#: client/src/forms/Projects.js:150 +#: client/src/forms/Projects.js:146 msgid "SCM Update Options" msgstr "" -#: client/src/controllers/Projects.js:70 +#: client/src/controllers/Projects.js:544 +#: client/src/controllers/Projects.js:57 msgid "SCM update currently running" msgstr "" @@ -1607,7 +1522,11 @@ msgstr "" msgid "SIGN IN" msgstr "" -#: client/src/app.js:518 +#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.partial.html:2 +msgid "SIGN IN WITH" +msgstr "" + +#: client/src/app.js:507 msgid "SOCKETS" msgstr "" @@ -1615,7 +1534,7 @@ msgstr "" msgid "SSH Key" msgstr "" -#: client/src/forms/Credentials.js:258 +#: client/src/forms/Credentials.js:255 msgid "SSH key description" msgstr "" @@ -1623,8 +1542,8 @@ msgstr "" msgid "SSL Connection" msgstr "" -#: client/src/forms/Credentials.js:122 -#: client/src/forms/Credentials.js:129 +#: client/src/forms/Credentials.js:120 +#: client/src/forms/Credentials.js:128 msgid "STS Token" msgstr "" @@ -1636,7 +1555,7 @@ msgstr "" msgid "Satellite 6 Host" msgstr "" -#: client/src/shared/form-generator.js:1736 +#: client/src/shared/form-generator.js:1621 msgid "Save" msgstr "" @@ -1644,7 +1563,7 @@ msgstr "" msgid "Save successful!" msgstr "" -#: client/src/lists/JobTemplates.js:77 +#: client/src/lists/JobTemplates.js:73 msgid "Schedule" msgstr "" @@ -1652,11 +1571,11 @@ msgstr "" msgid "Schedule Management Job" msgstr "" -#: client/src/controllers/Projects.js:62 +#: client/src/controllers/Projects.js:49 msgid "Schedule future SCM updates" msgstr "" -#: client/src/lists/JobTemplates.js:80 +#: client/src/lists/JobTemplates.js:76 msgid "Schedule future job template runs" msgstr "" @@ -1664,14 +1583,46 @@ msgstr "" msgid "Scheduled Jobs" msgstr "" -#: client/src/partials/jobs.html:15 +#: client/src/partials/jobs.html:10 msgid "Schedules" msgstr "" -#: client/src/forms/Credentials.js:107 +#: client/src/inventory-scripts/inventory-scripts.form.js:59 +msgid "Script must begin with a hashbang sequence: i.e.... %s" +msgstr "" + +#: client/src/forms/Credentials.js:105 msgid "Secret Key" msgstr "" +#: client/src/forms/Credentials.js:125 +msgid "Security Token Service (STS) is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users." +msgstr "" + +#: client/src/forms/Projects.js:98 +msgid "Select from the list of directories found in the base path.Together the base path and the playbook directory provide the full path used to locate playbooks." +msgstr "" + +#: client/src/forms/JobTemplates.js:149 +msgid "Select the credential you want the job to use when accessing the remote hosts. Choose the credential containing the username and SSH key or password that Ansible will need to log into the remote hosts." +msgstr "" + +#: client/src/forms/JobTemplates.js:82 +msgid "Select the inventory containing the hosts you want this job to manage." +msgstr "" + +#: client/src/forms/JobTemplates.js:127 +msgid "Select the playbook to be executed by this job." +msgstr "" + +#: client/src/forms/JobTemplates.js:110 +msgid "Select the project containing the playbook you want this job to execute." +msgstr "" + +#: client/src/forms/JobTemplates.js:171 +msgid "Selecting an optional cloud credential in the job template will pass along the access credentials to the running playbook, allowing provisioning into the cloud without manually passing parameters to the included modules." +msgstr "" + #: client/src/notifications/notificationTemplates.form.js:83 msgid "Sender Email" msgstr "" @@ -1680,20 +1631,50 @@ msgstr "" msgid "Service Account Email Address" msgstr "" +#: client/src/forms/JobTemplates.js:54 +msgid "Setting the type to %scheck%s will not execute the playbook." +msgstr "" + +#: client/src/forms/JobTemplates.js:57 +msgid "Setting the type to %sscan%s will execute the playbook and store any scanned facts for use with Tower's System Tracking feature." +msgstr "" + #: client/src/main-menu/main-menu.partial.html:147 msgid "Settings" msgstr "" -#: client/src/shared/form-generator.js:912 +#: client/src/shared/form-generator.js:850 msgid "Show" msgstr "" -#: client/src/forms/JobTemplates.js:255 -#: client/src/forms/JobTemplates.js:265 +#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:34 +#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:45 +#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:66 +msgid "Sign in with %s" +msgstr "" + +#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:53 +msgid "Sign in with %s Organizations" +msgstr "" + +#: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:51 +msgid "Sign in with %s Teams" +msgstr "" + +#: client/src/forms/JobTemplates.js:263 +#: client/src/forms/JobTemplates.js:271 msgid "Skip Tags" msgstr "" -#: client/src/forms/Projects.js:24 +#: client/src/forms/JobTemplates.js:269 +msgid "Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task." +msgstr "" + +#: client/src/forms/Credentials.js:76 +msgid "Source Control" +msgstr "" + +#: client/src/forms/Projects.js:27 msgid "Source Details" msgstr "" @@ -1701,16 +1682,25 @@ msgstr "" msgid "Source Phone Number" msgstr "" +#: client/src/notifications/notificationTemplates.form.js:332 +msgid "Specify HTTP Headers in JSON format" +msgstr "" + +#: client/src/forms/Credentials.js:286 +msgid "Specify a method for 'become' operations. This is equivalent to specifying the --become-method=BECOME_METHOD parameter, where BECOME_METHOD could be %s" +msgstr "" + #: client/src/setup-menu/setup-menu.partial.html:17 msgid "Split up your organization to associate content and control permissions for groups." msgstr "" -#: client/src/lists/JobTemplates.js:72 -#: client/src/lists/PortalJobTemplates.js:43 +#: client/src/lists/JobTemplates.js:68 +#: client/src/lists/PortalJobTemplates.js:42 msgid "Start a job using this template" msgstr "" -#: client/src/controllers/Projects.js:61 +#: client/src/controllers/Projects.js:48 +#: client/src/controllers/Projects.js:541 msgid "Start an SCM update" msgstr "" @@ -1722,11 +1712,15 @@ msgstr "" msgid "Subscription" msgstr "" -#: client/src/forms/Credentials.js:153 -#: client/src/forms/Credentials.js:164 +#: client/src/forms/Credentials.js:152 +#: client/src/forms/Credentials.js:163 msgid "Subscription ID" msgstr "" +#: client/src/forms/Credentials.js:162 +msgid "Subscription ID is an Azure construct, which is mapped to a username." +msgstr "" + #: client/src/notifications/notifications.list.js:38 msgid "Success" msgstr "" @@ -1735,10 +1729,6 @@ msgstr "" msgid "Successful" msgstr "" -#: client/src/lists/Inventories.js:76 -msgid "Sync failures?" -msgstr "" - #: client/src/controllers/Users.js:18 msgid "System Administrator" msgstr "" @@ -1747,7 +1737,7 @@ msgstr "" msgid "System Auditor" msgstr "" -#: client/src/app.js:346 +#: client/src/app.js:329 msgid "TEAMS" msgstr "" @@ -1755,24 +1745,29 @@ msgstr "" msgid "TIME" msgstr "" +#: client/src/forms/JobTemplates.js:251 +msgid "Tags are useful when you have a large playbook, and you want to run a specific part of a play or task." +msgstr "" + #: client/src/notifications/notificationTemplates.form.js:313 msgid "Target URL" msgstr "" -#: client/src/forms/Credentials.js:473 -#: client/src/forms/Inventories.js:128 -#: client/src/forms/Organizations.js:94 +#: client/src/forms/Credentials.js:462 +#: client/src/forms/Inventories.js:126 +#: client/src/forms/Inventories.js:173 +#: client/src/forms/Organizations.js:95 msgid "Team Roles" msgstr "" -#: client/src/forms/Users.js:154 +#: client/src/forms/Users.js:155 #: client/src/lists/Teams.js:16 #: client/src/lists/Teams.js:17 #: client/src/setup-menu/setup-menu.partial.html:16 msgid "Teams" msgstr "" -#: client/src/forms/Credentials.js:342 +#: client/src/forms/Credentials.js:336 msgid "Tenant ID" msgstr "" @@ -1780,11 +1775,35 @@ msgstr "" msgid "Test notification" msgstr "" -#: client/src/controllers/Projects.js:927 +#: client/src/helpers/Credentials.js:105 +msgid "The Project ID is the GCE assigned identification. It is constructed as two words followed by a three digit number. Such as:" +msgstr "" + +#: client/src/controllers/Projects.js:693 msgid "The SCM update process is running." msgstr "" -#: client/src/controllers/Projects.js:232 +#: client/src/forms/Credentials.js:191 +msgid "The email address assigned to the Google Compute Engine %sservice account." +msgstr "" + +#: client/src/helpers/Credentials.js:141 +msgid "The host to authenticate with." +msgstr "" + +#: client/src/helpers/Credentials.js:75 +msgid "The host value" +msgstr "" + +#: client/src/forms/JobTemplates.js:205 +msgid "The number of parallel or simultaneous processes to use while executing the playbook. 0 signifies the default value from the %sansible configuration file%s." +msgstr "" + +#: client/src/helpers/Credentials.js:74 +msgid "The project value" +msgstr "" + +#: client/src/controllers/Projects.js:124 msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings, and then run an update." msgstr "" @@ -1796,12 +1815,20 @@ msgstr "" msgid "There are no jobs to display at this time" msgstr "" -#: client/src/controllers/Projects.js:223 +#: client/src/controllers/Projects.js:115 msgid "There is no SCM update information available for this project. An update has not yet been completed. If you have not already done so, start an update for this project." msgstr "" -#: client/src/shared/form-generator.js:1020 -#: client/src/shared/form-generator.js:890 +#: client/src/helpers/Credentials.js:138 +msgid "This is the tenant name. This value is usually the same as the username." +msgstr "" + +#: client/src/notifications/notificationTemplates.form.js:199 +msgid "This must be of the form %s." +msgstr "" + +#: client/src/shared/form-generator.js:830 +#: client/src/shared/form-generator.js:955 msgid "This value does not match the password you entered previously. Please confirm that password." msgstr "" @@ -1813,7 +1840,15 @@ msgstr "" msgid "Time Remaining" msgstr "" -#: client/src/shared/form-generator.js:929 +#: client/src/forms/Projects.js:192 +msgid "Time in seconds to consider a project to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest project update. If it is older than Cache Timeout, it is not considered current, and a new project update will be performed." +msgstr "" + +#: client/src/forms/Credentials.js:126 +msgid "To learn more about the IAM STS Token, refer to the %sAmazon documentation%s." +msgstr "" + +#: client/src/shared/form-generator.js:855 msgid "Toggle the display of plaintext." msgstr "" @@ -1822,38 +1857,54 @@ msgstr "" msgid "Token" msgstr "" -#: client/src/forms/Credentials.js:62 -#: client/src/forms/Credentials.js:87 -#: client/src/forms/Teams.js:129 -#: client/src/forms/Users.js:189 -#: client/src/lists/CompletedJobs.js:63 +#: client/src/forms/Credentials.js:61 +#: client/src/forms/Credentials.js:85 +#: client/src/forms/Teams.js:132 +#: client/src/forms/Users.js:196 +#: client/src/lists/CompletedJobs.js:50 #: client/src/lists/Credentials.js:39 -#: client/src/lists/Projects.js:46 -#: client/src/lists/ScheduledJobs.js:44 -#: client/src/notifications/notificationTemplates.form.js:53 +#: client/src/lists/Projects.js:41 +#: client/src/lists/ScheduledJobs.js:42 +#: client/src/notifications/notificationTemplates.form.js:54 #: client/src/notifications/notificationTemplates.list.js:38 #: client/src/notifications/notifications.list.js:31 msgid "Type" msgstr "" -#: client/src/forms/Credentials.js:23 -#: client/src/notifications/notificationTemplates.form.js:21 +#: client/src/forms/Credentials.js:25 +#: client/src/notifications/notificationTemplates.form.js:23 msgid "Type Details" msgstr "" +#: client/src/notifications/notificationTemplates.form.js:212 +#: client/src/notifications/notificationTemplates.form.js:97 +msgid "Type an option on each line." +msgstr "" + +#: client/src/notifications/notificationTemplates.form.js:141 +#: client/src/notifications/notificationTemplates.form.js:158 +#: client/src/notifications/notificationTemplates.form.js:370 +msgid "Type an option on each line. The pound symbol (#) is not required." +msgstr "" + +#: client/src/controllers/Projects.js:403 +#: client/src/controllers/Projects.js:684 +msgid "URL popover text" +msgstr "" + #: client/src/login/loginModal/loginModal.partial.html:45 msgid "USERNAME" msgstr "" -#: client/src/app.js:468 +#: client/src/app.js:353 msgid "USERS" msgstr "" -#: client/src/controllers/Projects.js:328 +#: client/src/controllers/Projects.js:221 msgid "Update Not Found" msgstr "" -#: client/src/forms/Projects.js:181 +#: client/src/forms/Projects.js:173 msgid "Update on Launch" msgstr "" @@ -1861,6 +1912,11 @@ msgstr "" msgid "Upgrade" msgstr "" +#: client/src/forms/Projects.js:100 +#: client/src/forms/Projects.js:82 +msgid "Use %s in your environment settings file to determine the base path value." +msgstr "" + #: client/src/notifications/notificationTemplates.form.js:404 msgid "Use SSL" msgstr "" @@ -1869,30 +1925,39 @@ msgstr "" msgid "Use TLS" msgstr "" -#: client/src/forms/Credentials.js:461 -#: client/src/forms/Inventories.js:116 -#: client/src/forms/Organizations.js:82 -#: client/src/forms/Teams.js:96 +#: client/src/forms/Credentials.js:77 +msgid "Used to check out and synchronize playbook repositories with a remote source control management system such as Git, Subversion (svn), or Mercurial (hg). These credentials are used by Projects." +msgstr "" + +#: client/src/forms/Credentials.js:450 +#: client/src/forms/Inventories.js:115 +#: client/src/forms/Inventories.js:161 +#: client/src/forms/Organizations.js:83 +#: client/src/forms/Teams.js:94 msgid "User" msgstr "" -#: client/src/forms/Users.js:99 +#: client/src/forms/Users.js:94 msgid "User Type" msgstr "" -#: client/src/forms/Users.js:50 +#: client/src/forms/Users.js:49 #: client/src/helpers/Credentials.js:117 #: client/src/helpers/Credentials.js:32 #: client/src/helpers/Credentials.js:56 #: client/src/helpers/Credentials.js:88 -#: client/src/lists/Users.js:27 +#: client/src/lists/Users.js:37 #: client/src/notifications/notificationTemplates.form.js:64 msgid "Username" msgstr "" -#: client/src/forms/Teams.js:77 -#: client/src/lists/Users.js:16 -#: client/src/lists/Users.js:17 +#: client/src/forms/Credentials.js:81 +msgid "Usernames, passwords, and access keys for authenticating to the specified cloud or infrastructure provider. These are used for dynamic inventory sources and for cloud provisioning and deployment in playbook runs." +msgstr "" + +#: client/src/forms/Teams.js:75 +#: client/src/lists/Users.js:26 +#: client/src/lists/Users.js:27 #: client/src/setup-menu/setup-menu.partial.html:10 msgid "Users" msgstr "" @@ -1914,16 +1979,16 @@ msgstr "" msgid "Valid License" msgstr "" -#: client/src/forms/Inventories.js:54 +#: client/src/forms/Inventories.js:55 msgid "Variables" msgstr "" -#: client/src/forms/Credentials.js:400 +#: client/src/forms/Credentials.js:390 msgid "Vault Password" msgstr "" -#: client/src/forms/JobTemplates.js:221 -#: client/src/forms/JobTemplates.js:229 +#: client/src/forms/JobTemplates.js:232 +#: client/src/forms/JobTemplates.js:239 msgid "Verbosity" msgstr "" @@ -1934,11 +1999,11 @@ msgstr "" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:58 #: client/src/inventory-scripts/inventory-scripts.list.js:65 -#: client/src/lists/Credentials.js:82 -#: client/src/lists/Inventories.js:112 -#: client/src/lists/JobTemplates.js:101 +#: client/src/lists/Credentials.js:80 +#: client/src/lists/Inventories.js:86 +#: client/src/lists/JobTemplates.js:97 #: client/src/lists/Teams.js:70 -#: client/src/lists/Users.js:68 +#: client/src/lists/Users.js:78 #: client/src/notifications/notificationTemplates.list.js:80 msgid "View" msgstr "" @@ -1947,10 +2012,18 @@ msgstr "" msgid "View Documentation" msgstr "" -#: client/src/shared/form-generator.js:1760 +#: client/src/forms/Inventories.js:65 +msgid "View JSON examples at %s" +msgstr "" + +#: client/src/shared/form-generator.js:1645 msgid "View Survey" msgstr "" +#: client/src/forms/Inventories.js:66 +msgid "View YAML examples at %s" +msgstr "" + #: client/src/setup-menu/setup-menu.partial.html:47 msgid "View Your License" msgstr "" @@ -1959,15 +2032,15 @@ msgstr "" msgid "View and edit your license information." msgstr "" -#: client/src/lists/Credentials.js:84 +#: client/src/lists/Credentials.js:82 msgid "View credential" msgstr "" -#: client/src/setup-menu/setup-menu.partial.html:54 +#: client/src/setup-menu/setup-menu.partial.html:60 msgid "View information about this version of Ansible Tower." msgstr "" -#: client/src/lists/Inventories.js:114 +#: client/src/lists/Inventories.js:88 msgid "View inventory" msgstr "" @@ -1983,19 +2056,19 @@ msgstr "" msgid "View team" msgstr "" -#: client/src/lists/JobTemplates.js:103 +#: client/src/lists/JobTemplates.js:99 msgid "View template" msgstr "" -#: client/src/lists/Projects.js:109 +#: client/src/lists/Projects.js:101 msgid "View the project" msgstr "" -#: client/src/lists/ScheduledJobs.js:88 +#: client/src/lists/ScheduledJobs.js:73 msgid "View the schedule" msgstr "" -#: client/src/lists/Users.js:71 +#: client/src/lists/Users.js:81 msgid "View user" msgstr "" @@ -2007,35 +2080,51 @@ msgstr "" msgid "Welcome to Ansible Tower! Please complete the steps below to acquire a license." msgstr "" -#: client/src/lists/Inventories.js:79 -msgid "Yes" +#: client/src/forms/JobTemplates.js:52 +msgid "When this template is submitted as a job, setting the type to run will execute the playbook, running tasks on the selected hosts." msgstr "" -#: client/src/shared/form-generator.js:1034 +#: client/src/shared/form-generator.js:967 msgid "Your password must be %d characters long." msgstr "" -#: client/src/shared/form-generator.js:1040 +#: client/src/shared/form-generator.js:972 msgid "Your password must contain a lowercase letter." msgstr "" -#: client/src/shared/form-generator.js:1052 +#: client/src/shared/form-generator.js:982 msgid "Your password must contain a number." msgstr "" -#: client/src/shared/form-generator.js:1046 +#: client/src/shared/form-generator.js:977 msgid "Your password must contain an uppercase letter." msgstr "" -#: client/src/shared/form-generator.js:1058 +#: client/src/shared/form-generator.js:987 msgid "Your password must contain one of the following characters: %s" msgstr "" -#: client/src/controllers/Projects.js:284 +#: client/src/controllers/Projects.js:177 msgid "Your request to cancel the update was submitted to the task manager." msgstr "" -#: client/src/forms/Credentials.js:140 -#: client/src/forms/Credentials.js:369 +#: client/src/login/loginModal/loginModal.partial.html:18 +msgid "Your session timed out due to inactivity. Please sign in." +msgstr "" + +#: client/src/forms/Credentials.js:139 +#: client/src/forms/Credentials.js:363 msgid "set in helpers/credentials" msgstr "" + +#: client/src/forms/Credentials.js:380 +msgid "v2 URLs%s - leave blank" +msgstr "" + +#: client/src/forms/Credentials.js:381 +msgid "v3 default%s - set to 'default'" +msgstr "" + +#: client/src/forms/Credentials.js:382 +msgid "v3 multi-domain%s - your domain name" +msgstr "" diff --git a/awx/ui/webpack.config.js b/awx/ui/webpack.config.js index 0b279d7fbf..067ba50dca 100644 --- a/awx/ui/webpack.config.js +++ b/awx/ui/webpack.config.js @@ -39,6 +39,7 @@ var vendorPkgs = [ 'ng-toast', 'nvd3', 'select2', + 'sprintf-js', 'reconnectingwebsocket' ]; From 1db697e4ebefb27a86575c2f06de422a97a63865 Mon Sep 17 00:00:00 2001 From: Chris Church Date: Thu, 17 Nov 2016 09:09:19 -0500 Subject: [PATCH 07/11] Add multiprocessing RLock around event data output to ensure only one process is writing to stdout at a time. --- awx/lib/tower_display_callback/display.py | 16 ++++++++++------ awx/lib/tower_display_callback/events.py | 17 +++++++++++------ awx/lib/tower_display_callback/module.py | 23 ++++++++++++----------- awx/main/signals.py | 1 - 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/awx/lib/tower_display_callback/display.py b/awx/lib/tower_display_callback/display.py index 7f32ca9379..128c9349c7 100644 --- a/awx/lib/tower_display_callback/display.py +++ b/awx/lib/tower_display_callback/display.py @@ -77,17 +77,21 @@ def display_with_context(f): def wrapper(*args, **kwargs): log_only = args[5] if len(args) >= 6 else kwargs.get('log_only', False) stderr = args[3] if len(args) >= 4 else kwargs.get('stderr', False) - fileobj = sys.stderr if stderr else sys.stdout event_uuid = event_context.get().get('uuid', None) - try: - if not log_only and not event_uuid: + with event_context.display_lock: + # If writing only to a log file or there is already an event UUID + # set (from a callback module method), skip dumping the event data. + if log_only or event_uuid: + return f(*args, **kwargs) + try: + fileobj = sys.stderr if stderr else sys.stdout event_context.add_local(uuid=str(uuid.uuid4())) event_context.dump_begin(fileobj) - return f(*args, **kwargs) - finally: - if not log_only and not event_uuid: + return f(*args, **kwargs) + finally: event_context.dump_end(fileobj) event_context.remove_local(uuid=None) + return wrapper diff --git a/awx/lib/tower_display_callback/events.py b/awx/lib/tower_display_callback/events.py index 009c0c8efc..f85da9c233 100644 --- a/awx/lib/tower_display_callback/events.py +++ b/awx/lib/tower_display_callback/events.py @@ -22,6 +22,7 @@ import base64 import contextlib import datetime import json +import multiprocessing import os import threading import uuid @@ -35,6 +36,9 @@ class EventContext(object): events and other display output methods. ''' + def __init__(self): + self.display_lock = multiprocessing.RLock() + def add_local(self, **kwargs): if not hasattr(self, '_local'): self._local = threading.local() @@ -121,12 +125,13 @@ class EventContext(object): def dump(self, fileobj, data, max_width=78): b64data = base64.b64encode(json.dumps(data)) - fileobj.write(u'\x1b[K') - for offset in xrange(0, len(b64data), max_width): - chunk = b64data[offset:offset + max_width] - escaped_chunk = u'{}\x1b[{}D'.format(chunk, len(chunk)) - fileobj.write(escaped_chunk) - fileobj.write(u'\x1b[K') + with self.display_lock: + fileobj.write(u'\x1b[K') + for offset in xrange(0, len(b64data), max_width): + chunk = b64data[offset:offset + max_width] + escaped_chunk = u'{}\x1b[{}D'.format(chunk, len(chunk)) + fileobj.write(escaped_chunk) + fileobj.write(u'\x1b[K') def dump_begin(self, fileobj): self.dump(fileobj, self.get_begin_dict()) diff --git a/awx/lib/tower_display_callback/module.py b/awx/lib/tower_display_callback/module.py index daa2bb8d4a..457455e513 100644 --- a/awx/lib/tower_display_callback/module.py +++ b/awx/lib/tower_display_callback/module.py @@ -121,17 +121,18 @@ class BaseCallbackModule(CallbackBase): else: task = None - try: - event_context.add_local(event=event, **event_data) - if task: - self.set_task(task, local=True) - event_context.dump_begin(sys.stdout) - yield - finally: - event_context.dump_end(sys.stdout) - if task: - self.clear_task(local=True) - event_context.remove_local(event=None, **event_data) + with event_context.display_lock: + try: + event_context.add_local(event=event, **event_data) + if task: + self.set_task(task, local=True) + event_context.dump_begin(sys.stdout) + yield + finally: + event_context.dump_end(sys.stdout) + if task: + self.clear_task(local=True) + event_context.remove_local(event=None, **event_data) def set_playbook(self, playbook): # NOTE: Ansible doesn't generate a UUID for playbook_on_start so do it for them. diff --git a/awx/main/signals.py b/awx/main/signals.py index 7f3f8aee66..ceda8899b1 100644 --- a/awx/main/signals.py +++ b/awx/main/signals.py @@ -36,7 +36,6 @@ logger = logging.getLogger('awx.main.signals') def emit_job_event_detail(sender, **kwargs): instance = kwargs['instance'] created = kwargs['created'] - print("before created job_event_detail") if created: event_serialized = JobEventSerializer(instance).data event_serialized['id'] = instance.id From d9821dbb6c340063d2120cc41780a42bda1d0339 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Thu, 17 Nov 2016 10:29:34 -0500 Subject: [PATCH 08/11] in the api, finish renaming wfjt -> job relation related to #4052 related to #3976 --- awx/api/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 2148ed5ac2..4fea827ec0 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2208,7 +2208,7 @@ class WorkflowJobTemplateSerializer(LabelsListMixin, UnifiedJobTemplateSerialize def get_related(self, obj): res = super(WorkflowJobTemplateSerializer, self).get_related(obj) res.update(dict( - jobs = reverse('api:workflow_job_template_jobs_list', args=(obj.pk,)), + workflow_jobs = reverse('api:workflow_job_template_jobs_list', args=(obj.pk,)), schedules = reverse('api:workflow_job_template_schedules_list', args=(obj.pk,)), launch = reverse('api:workflow_job_template_launch', args=(obj.pk,)), workflow_nodes = reverse('api:workflow_job_template_workflow_nodes_list', args=(obj.pk,)), From df5e3288c40076bb5ace2c1433e45adcd30316b0 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Thu, 17 Nov 2016 10:39:17 -0500 Subject: [PATCH 09/11] Revert "in the api, finish renaming wfjt -> job relation" This reverts commit 8ee469ceeb0d9e7514f930c6325d1577bf5505c8. --- awx/api/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 4fea827ec0..2148ed5ac2 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2208,7 +2208,7 @@ class WorkflowJobTemplateSerializer(LabelsListMixin, UnifiedJobTemplateSerialize def get_related(self, obj): res = super(WorkflowJobTemplateSerializer, self).get_related(obj) res.update(dict( - workflow_jobs = reverse('api:workflow_job_template_jobs_list', args=(obj.pk,)), + jobs = reverse('api:workflow_job_template_jobs_list', args=(obj.pk,)), schedules = reverse('api:workflow_job_template_schedules_list', args=(obj.pk,)), launch = reverse('api:workflow_job_template_launch', args=(obj.pk,)), workflow_nodes = reverse('api:workflow_job_template_workflow_nodes_list', args=(obj.pk,)), From 07996abf645ebcafa8e6be843b47629bb5eb3a05 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Thu, 17 Nov 2016 10:29:34 -0500 Subject: [PATCH 10/11] in the api, finish renaming wfjt -> job relation related to #4052 related to #3976 --- awx/api/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 2148ed5ac2..4fea827ec0 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2208,7 +2208,7 @@ class WorkflowJobTemplateSerializer(LabelsListMixin, UnifiedJobTemplateSerialize def get_related(self, obj): res = super(WorkflowJobTemplateSerializer, self).get_related(obj) res.update(dict( - jobs = reverse('api:workflow_job_template_jobs_list', args=(obj.pk,)), + workflow_jobs = reverse('api:workflow_job_template_jobs_list', args=(obj.pk,)), schedules = reverse('api:workflow_job_template_schedules_list', args=(obj.pk,)), launch = reverse('api:workflow_job_template_launch', args=(obj.pk,)), workflow_nodes = reverse('api:workflow_job_template_workflow_nodes_list', args=(obj.pk,)), From ef0df1fefdb1a491fd0f35e3dce5744afef410fc Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Thu, 17 Nov 2016 10:47:04 -0500 Subject: [PATCH 11/11] more j -> workflow_job renaming --- awx/api/urls.py | 2 +- awx/api/views.py | 2 +- .../tests/unit/api/serializers/test_workflow_serializers.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/awx/api/urls.py b/awx/api/urls.py index 8e349008e6..f0bc97e99e 100644 --- a/awx/api/urls.py +++ b/awx/api/urls.py @@ -260,7 +260,7 @@ system_job_urls = patterns('awx.api.views', workflow_job_template_urls = patterns('awx.api.views', url(r'^$', 'workflow_job_template_list'), url(r'^(?P[0-9]+)/$', 'workflow_job_template_detail'), - url(r'^(?P[0-9]+)/jobs/$', 'workflow_job_template_jobs_list'), + url(r'^(?P[0-9]+)/workflow_jobs/$', 'workflow_job_template_jobs_list'), url(r'^(?P[0-9]+)/launch/$', 'workflow_job_template_launch'), url(r'^(?P[0-9]+)/schedules/$', 'workflow_job_template_schedules_list'), url(r'^(?P[0-9]+)/survey_spec/$', 'workflow_job_template_survey_spec'), diff --git a/awx/api/views.py b/awx/api/views.py index 213581b253..79445dacd0 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -2984,7 +2984,7 @@ class WorkflowJobTemplateJobsList(SubListAPIView): model = WorkflowJob serializer_class = WorkflowJobListSerializer parent_model = WorkflowJobTemplate - relationship = 'jobs' + relationship = 'workflow_jobs' parent_key = 'workflow_job_template' diff --git a/awx/main/tests/unit/api/serializers/test_workflow_serializers.py b/awx/main/tests/unit/api/serializers/test_workflow_serializers.py index 4f11ce64be..b444531206 100644 --- a/awx/main/tests/unit/api/serializers/test_workflow_serializers.py +++ b/awx/main/tests/unit/api/serializers/test_workflow_serializers.py @@ -26,7 +26,7 @@ class TestWorkflowJobTemplateSerializerGetRelated(): return wfjt @pytest.mark.parametrize("related_resource_name", [ - 'jobs', + 'workflow_jobs', 'launch', 'workflow_nodes', ])