diff --git a/.bowerrc b/.bowerrc deleted file mode 100644 index ae055b85cc..0000000000 --- a/.bowerrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "directory" : "seed/static/vendors/bower_components", - "registry": "https://registry.bower.io" -} diff --git a/.dockerignore b/.dockerignore index 9e469f5d0a..d8e4135c8a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,11 +1,14 @@ # .git # For now add in the .git repo so that the version is parsed on the page correctly +.dockerignore .idea .tox +./docker-compose*.yml +./deploy.sh +**/*.pyc collected_static +docs media node_modules -seed/static/vendors +vendors/node_modules config/settings/local_untracked.py config/settings/local_untracked.py.dist -/deploy.sh -/docker-*.yml diff --git a/.eslintrc b/.eslintrc index 1a90ce5351..74d4eff3a8 100755 --- a/.eslintrc +++ b/.eslintrc @@ -18,6 +18,7 @@ "moment": true, "protractor": true, "qq": true, + "saveAs": true, "Spinner": true }, "plugins": ["angular", "lodash", "protractor"], diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 906e25ae8a..667712efea 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,4 +7,4 @@ - [ ] Is there appropriate test coverage? (e.g. ChefSpec, Mocha/Chai, Python, etc.) - [ ] Does this PR require a Selenium test? (e.g. Browser-specific bugs or complicated UI bugs) - [ ] Does this PR require a regression test? All fixes require a regression test. -- [ ] Does this add new dependencies? If so, does PIP, npm, bower requirements need to be updated? \ No newline at end of file +- [ ] Does this add new dependencies? If so, do pip or npm requirements need to be updated? diff --git a/.gitignore b/.gitignore index 9e33041c82..820adb608c 100644 --- a/.gitignore +++ b/.gitignore @@ -43,8 +43,7 @@ bpd/data/BEDES* lin/migrations/disabled htmlcov/ src/ -*node_modules* -bower_components/ +node_modules/ # JetBrainz tends to suggest a venv directory in the project root for virtual environments venv/ @@ -77,3 +76,9 @@ docs/scripts/.python-version docs/scripts/seed_issues.csv lokalise.cfg + +# Docker-based files +docker-compose.*.yml +!docker-compose.yml +!docker-compose.local.yml +!docker-compose.deploy.yml diff --git a/.travis.yml b/.travis.yml index 0a09da6122..ff72a0230d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ group: deprecated-2017Q4 cache: directories: - node_modules - - seed/static/vendors/bower_components + - vendors/node_modules - "$HOME/.pip-cache/" - "$HOME/.nvm" - ".tox" diff --git a/CHANGELOG.md b/CHANGELOG.md index 86c8ee0a66..1553732c1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ +# SEED Version 2.4.2 + +Date Range: 01/05/19 - 02/19/19 + +Closed Issues: +- Fixed [#421]( https://github.com/SEED-platform/seed/issues/421 ), Reports - Message saying why there is no data +- Fixed [#1124]( https://github.com/SEED-platform/seed/issues/1124 ), Linux install instructions +- Fixed [#1626]( https://github.com/SEED-platform/seed/issues/1626 ), 403 Error deleting Inventory from Org in Admin +- Fixed [#1730]( https://github.com/SEED-platform/seed/issues/1730 ), Error importing BuildingSync File +- Fixed [#1738]( https://github.com/SEED-platform/seed/issues/1738 ), No email sent to set password when I created a new organization +- Feature [#1741]( https://github.com/SEED-platform/seed/issues/1741 ), BuildingSync batch import from UI +- Feature [#1782]( https://github.com/SEED-platform/seed/issues/1782 ), Add OEI to docker deployment +- Fixed [#1797]( https://github.com/SEED-platform/seed/issues/1797 ), Ability to remove user who only belongs to a single organization +- Fixed [#1800]( https://github.com/SEED-platform/seed/issues/1800 ), Add managed task for adding user to organization via cli +- Feature [#1801]( https://github.com/SEED-platform/seed/issues/1801 ), Add dropdown for actions on inventory detail page +- Fixed [#1807]( https://github.com/SEED-platform/seed/issues/1807 ), Only fields in property or tax lot DB are shown in mapping screen (not showing Extra Data fields) +- Fixed [#1812]( https://github.com/SEED-platform/seed/issues/1812 ), Merge screen doesn't show extra data fields +- Fixed [#1813]( https://github.com/SEED-platform/seed/issues/1813 ), When merging records, the merged records don't show up in the detail view, only the final Master Record +- Fixed [#1814]( https://github.com/SEED-platform/seed/issues/1814 ), Export contains (internal db?) ID + # SEED Version 2.4.1 Date Range: 10/06/18 - 01/04/19: diff --git a/Dockerfile b/Dockerfile index a051a41d7e..4988cd1016 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,14 +48,15 @@ RUN pip install -r requirements/aws.txt ### Install JavaScript requirements - do this first because they take awhile ### and the dependencies will probably change slower than python packages. ### README.md stops the no readme warning -COPY ./bower.json /seed/bower.json -COPY ./.bowerrc /seed/.bowerrc COPY ./package.json /seed/package.json +COPY ./vendors/package.json /seed/vendors/package.json COPY ./README.md /seed/README.md -COPY ./bin/install_javascript_dependencies.sh /seed/bin/install_javascript_dependencies.sh -RUN npm update && /seed/bin/install_javascript_dependencies.sh +RUN npm update && npm install +WORKDIR /seed/vendors +RUN npm install ### Copy over the remaining part of the SEED application and some helpers +WORKDIR /seed COPY . /seed/ COPY ./docker/wait-for-it.sh /usr/local/wait-for-it.sh diff --git a/Gruntfile.js b/Gruntfile.js index adde8f5d2c..fa621b4ff8 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,125 +1,124 @@ - var tmp = require('tmp'); -module.exports = function(grunt) { - grunt.initConfig({ - // connect: { - // options: { - // port: 8000, - // hostname: 'localhost' - // }, - // runtime: { - // options: { - // middleware: function (connect) { - // return [ - // lrSnippet, - // mountFolder(connect, 'protractorInstrumented'), - // mountFolder(connect, '.......') - // ]; - // } - // } - // } +module.exports = function (grunt) { + grunt.initConfig({ + // connect: { + // options: { + // port: 8000, + // hostname: 'localhost' + // }, + // runtime: { + // options: { + // middleware: function (connect) { + // return [ + // lrSnippet, + // mountFolder(connect, 'protractorInstrumented'), + // mountFolder(connect, '.......') + // ]; + // } + // } + // } + // + // // Before generating any new files, remove any previously-created files. + // }, + clean: { + options: { + force: true + }, + tests: ['tmp', 'build', 'protractorInstrumented', 'protractorCoverage', 'protractorReports', 'protractorSaved'] + }, + connect: { + server: { + options: { + port: 3000, + base: 'protractorInstrumented/seed/static/seed/js' + } + } + }, + instrument: { + files: ['seed/static/seed/js/**/*.js', '!seed/static/seed/js/decorators/**/*.js', '!seed/static/seed/js/seed.js'], + options: { + lazy: true, + basePath: "protractorInstrumented" + } + }, + copy: { + save: { + expand: true, + cwd: 'seed/static/seed/js', + src: '**', + dest: 'protractorSaved/' + }, + instrument: { + expand: true, + cwd: 'protractorInstrumented/seed/static/seed/js', + src: '**', + dest: 'seed/static/seed/js/' + }, + copyBack: { + expand: true, + cwd: 'protractorSaved', + src: '**', + dest: 'seed/static/seed/js/' + } + }, + protractor_coverage: { + options: { + keepAlive: false, // If false, the grunt process stops when the test fails. + noColor: false, + coverageDir: 'protractorCoverage', + args: { + baseUrl: 'http://localhost:8000' + } + }, + local: { + options: { + configFile: 'seed/static/seed/tests/protractor-tests/protractorConfigCoverage.js' + } + } + }, + makeReport: { + src: 'protractorCoverage/**/*.json', + options: { + type: 'lcov', + dir: 'protractorReports', + print: '' + } + }, + coveralls: { + main: { + src: 'protractorReports/**/*.info', + options: { + force: true + } + } + } + }); - // Before generating any new files, remove any previously-created files. - // }, - clean: { - options: { - force:true - }, - tests: ['tmp', 'build', 'protractorInstrumented', 'protractorCoverage', 'protractorReports', 'protractorSaved'], - }, - connect: { - server: { - options: { - port: 3000, - base: 'protractorInstrumented/seed/static/seed/js' - } - }, - }, - instrument: { - files: ['seed/static/seed/js/**/*.js','!seed/static/seed/js/decorators/**/*.js', '!seed/static/seed/js/seed.js'], - options: { - lazy: true, - basePath: "protractorInstrumented" - } - }, - copy: { - 'save': { - expand: true, - cwd: 'seed/static/seed/js', - src: '**', - dest: 'protractorSaved/' - }, - 'instrument': { - expand: true, - cwd: 'protractorInstrumented/seed/static/seed/js', - src: '**', - dest: 'seed/static/seed/js/' - }, - 'copyBack': { - expand: true, - cwd: 'protractorSaved', - src: '**', - dest: 'seed/static/seed/js/' - }, - }, - protractor_coverage: { - options: { - keepAlive: false, // If false, the grunt process stops when the test fails. - noColor: false, - coverageDir: 'protractorCoverage', - args: { - baseUrl: 'http://localhost:8000' - } - }, - local: { - options: { - configFile: 'seed/static/seed/tests/protractor-tests/protractorConfigCoverage.js' - } - } - }, - makeReport: { - src: 'protractorCoverage/**/*.json', - options: { - type: 'lcov', - dir: 'protractorReports', - print: '' - } - }, - coveralls: { - main:{ - src: 'protractorReports/**/*.info', - options: { - force: true - }, - }, - }, - }); + // Actually load this plugin's task(s). + // grunt.loadTasks('tasks'); - // Actually load this plugin's task(s). - // grunt.loadTasks('tasks'); + // These plugins provide necessary tasks. + grunt.loadNpmTasks('grunt-protractor-coverage'); + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-copy'); + grunt.loadNpmTasks('grunt-istanbul'); + grunt.loadNpmTasks('grunt-coveralls'); - // These plugins provide necessary tasks. - grunt.loadNpmTasks('grunt-protractor-coverage'); - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.loadNpmTasks('grunt-contrib-copy'); - grunt.loadNpmTasks('grunt-istanbul'); - grunt.loadNpmTasks('grunt-coveralls'); + // Whenever the "test" task is run, first clean the "tmp" dir, then run this + // plugin's task(s), then test the result. - // Whenever the "test" task is run, first clean the "tmp" dir, then run this - // plugin's task(s), then test the result. + //same as npm test more or less + // grunt.registerTask('coverage', ['protractor_coverage:local']); - //same as npm test more or less - // grunt.registerTask('coverage', ['protractor_coverage:local']); - - //don't use instrumented code - // grunt.registerTask('coverage', ['clean', 'copy:save', 'instrument', 'protractor_coverage:local', 'copy:copyBack']); + //don't use instrumented code + // grunt.registerTask('coverage', ['clean', 'copy:save', 'instrument', 'protractor_coverage:local', 'copy:copyBack']); - //without coveralls - grunt.registerTask('coverage', ['clean', 'copy:save', 'instrument', 'copy:instrument', 'protractor_coverage:local', 'copy:copyBack', 'makeReport']); - grunt.registerTask('report', ['makeReport']); + //without coveralls + grunt.registerTask('coverage', ['clean', 'copy:save', 'instrument', 'copy:instrument', 'protractor_coverage:local', 'copy:copyBack', 'makeReport']); + grunt.registerTask('report', ['makeReport']); - //with coveralls - // grunt.registerTask('coverage', ['clean', 'copy:save', 'instrument', 'copy:instrument', 'protractor_coverage:local', 'copy:copyBack', 'makeReport', 'coveralls']); + //with coveralls + // grunt.registerTask('coverage', ['clean', 'copy:save', 'instrument', 'copy:instrument', 'protractor_coverage:local', 'copy:copyBack', 'makeReport', 'coveralls']); - grunt.registerTask('test', ['coverage']); + grunt.registerTask('test', ['coverage']); }; diff --git a/LICENSE b/LICENSE index a7eba411d0..3e2f7becb1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2014 – 2018, The Regents of the University of California, through +Copyright (c) 2014 – 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. diff --git a/README.md b/README.md index 3739d85436..8e54b23cf3 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ celery -A seed worker -l info -c 4 --maxtasksperchild 1000 --events * Running tests: See [Testing Notes][developer-testing-notes] ### Copyright -Copyright © 2014 - 2018, The Regents of the University of California, through +Copyright © 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. diff --git a/bin/check_compressed.py b/bin/check_compressed.py index 21e4d42866..b490408b1b 100644 --- a/bin/check_compressed.py +++ b/bin/check_compressed.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ #!/usr/bin/env python diff --git a/bin/install_javascript_dependencies.sh b/bin/install_javascript_dependencies.sh index 7092055ae7..bf09a49295 100755 --- a/bin/install_javascript_dependencies.sh +++ b/bin/install_javascript_dependencies.sh @@ -1,8 +1,6 @@ #!/usr/bin/env bash -# installs npm and bower dependencies +# installs npm dependencies # assumes npm is installed -echo "Installing npm dependencies from packages.json" +echo "Installing npm dependencies from package.json" npm install -echo -e "\n\n\nInstalling bower dependencies from bower.json" -$(npm bin)/bower install --config.interactive=false --allow-root diff --git a/bin/install_nodejs b/bin/install_nodejs deleted file mode 100644 index 8a380cfa35..0000000000 --- a/bin/install_nodejs +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash - -if [ ! -f ~/.heroku/vendor/node/bin/npm ]; -then - NODE_VERSION=0.8.9 - NODE_BASENAME=node-v${NODE_VERSION}-linux-x64 - NODE_ARCHIVE="http://nodejs.org/dist/v0.8.9/${NODE_BASENAME}.tar.gz" - - # make a temp directory - tempdir="$( mktemp -t node_XXXX )" - rm -rf $tempdir - mkdir -p $tempdir - - pushd $tempdir > /dev/null - curl -s -L -o tmp-nodejs.tar.gz $NODE_ARCHIVE - tar -zxvf tmp-nodejs.tar.gz > /dev/null - rm tmp-nodejs.tar.gz - popd > /dev/null - - mkdir -p ~/.heroku/vendor - pushd ~/.heroku/vendor > /dev/null - rm -rf node - mv $tempdir/$NODE_BASENAME node - popd > /dev/null - - mkdir -p ~/.heroku/vendor/bin - ln -s ~/.heroku/vendor/node/bin/node ~/.heroku/vendor/bin/node - ln -s ~/.heroku/vendor/node/bin/node-waf ~/.heroku/vendor/bin/node-waf - ln -s ~/.heroku/vendor/node/bin/npm ~/.heroku/vendor/bin/npm -fi diff --git a/bin/post_compile b/bin/post_compile index 2c5d679420..d360b0a2b7 100755 --- a/bin/post_compile +++ b/bin/post_compile @@ -4,9 +4,6 @@ echo "-----> downloading and installing JS dependencies..." bash bin/install_javascript_dependencies.sh 2>&1 | sed "s/^/ /" -echo "-----> Compiling Sass..." -npm run gulp sass - echo "-----> Making the s3 bucket..." python manage.py create_s3_bucket 2>&1 | sed "s/^/ /" diff --git a/bower.json b/bower.json deleted file mode 100644 index 798ecd3877..0000000000 --- a/bower.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "seed-core", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "seed/static/vendors/bower_components", - "test", - "tests" - ], - "dependencies": { - "angular": "~1.6.10", - "angular-animate": "~1.6.10", - "angular-aria": "~1.6.10", - "angular-bootstrap": "~1.3.3", - "angular-cookies": "~1.6.10", - "angular-mocks": "~1.6.10", - "angular-sanitize": "~1.6.10", - "angular-ui-grid": "=4.0.6", - "angular-ui-notification": "~0.3.5", - "angular-ui-router": "~1.0.20", - "angular-ui-router.stateHelper": "~1.3.1", - "angular-ui-sortable": "~0.13.4", - "angular-ui-tree": "~2.10.0", - "angular-xeditable": "~0.1.9", - "bootstrap": "~3.3.7", - "d3": "=3.5.2", - "dimple": "=2.2.0", - "file-saver": "=1.3.3", - "fine-uploader": "https://github.com/FineUploader/fine-uploader/releases/download/5.16.2/all.fine-uploader.zip", - "font-awesome": "~4.4.0", - "jasmine-core": "=1.3.1", - "jquery": "~2.2.4", - "jquery-ui": "~1.12.1", - "lodash": "~4.17.2", - "moment": "~2.17.1", - "ng-tags-input": "~3.0.0", - "spin.js": "~2.3.2", - "ui-grid-draggable-rows": "~0.3.2", - "angular-dragula": "~1.2.8", - "ng-focus-if": "~1.0.7", - "angular-translate": "~2.16.0", - "angular-translate-loader-static-files": "~2.16.0", - "angular-translate-interpolation-messageformat": "~2.16.0", - "raven-js": "~3.22.1" - }, - "resolutions": { - "angular": "~1.6.10", - "angular-ui-router": "~1.0.20", - "angular-translate": "~2.16.0" - } -} diff --git a/config/__init__.py b/config/__init__.py index ec29c463bc..b9a2ca09f2 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -1,4 +1,4 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/config/management/__init__.py b/config/management/__init__.py index ec29c463bc..b9a2ca09f2 100644 --- a/config/management/__init__.py +++ b/config/management/__init__.py @@ -1,4 +1,4 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/config/management/commands/__init__.py b/config/management/commands/__init__.py index ec29c463bc..b9a2ca09f2 100644 --- a/config/management/commands/__init__.py +++ b/config/management/commands/__init__.py @@ -1,4 +1,4 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/config/management/commands/create_s3_bucket.py b/config/management/commands/create_s3_bucket.py index 67998198f7..4c40bc7c99 100644 --- a/config/management/commands/create_s3_bucket.py +++ b/config/management/commands/create_s3_bucket.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from django.conf import settings diff --git a/config/management/commands/grab_manifest.py b/config/management/commands/grab_manifest.py index c79a8c126a..7785c4e8b2 100644 --- a/config/management/commands/grab_manifest.py +++ b/config/management/commands/grab_manifest.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import urllib2 diff --git a/config/management/commands/sync_static.py b/config/management/commands/sync_static.py index 0e0315920e..f676f5ca97 100644 --- a/config/management/commands/sync_static.py +++ b/config/management/commands/sync_static.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ """ diff --git a/config/settings/__init__.py b/config/settings/__init__.py index ec29c463bc..b9a2ca09f2 100644 --- a/config/settings/__init__.py +++ b/config/settings/__init__.py @@ -1,4 +1,4 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/config/settings/aws.py b/config/settings/aws.py index bbb7e19b48..a9874ee3ab 100644 --- a/config/settings/aws.py +++ b/config/settings/aws.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import absolute_import diff --git a/config/settings/aws/__init__.py b/config/settings/aws/__init__.py index ec29c463bc..b9a2ca09f2 100644 --- a/config/settings/aws/__init__.py +++ b/config/settings/aws/__init__.py @@ -1,4 +1,4 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/config/settings/aws/aws.py b/config/settings/aws/aws.py index 02a3c8cf78..8d892605f7 100644 --- a/config/settings/aws/aws.py +++ b/config/settings/aws/aws.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import boto.elasticache diff --git a/config/settings/common.py b/config/settings/common.py index cef8ae3744..e48a5b0418 100644 --- a/config/settings/common.py +++ b/config/settings/common.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA @@ -120,10 +120,9 @@ INSTALLED_APPS = HIGH_DEPENDENCY_APPS + INSTALLED_APPS + SEED_CORE_APPS -# apps to auto load name spaced URLs for JS use (see seed.urls and seed.main.views.home) +# apps to auto load name spaced URLs for JS use (see seed.urls) SEED_URL_APPS = ( 'seed', - 'audit_logs', ) MEDIA_URL = '/media/' @@ -131,13 +130,23 @@ STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static') +COMPRESS_AUTOPREFIXER_BINARY = 'node_modules/.bin/postcss' +COMPRESS_CSS_FILTERS = [ + 'compressor.filters.css_default.CssAbsoluteFilter', + 'django_compressor_autoprefixer.AutoprefixerFilter', + 'compressor.filters.cssmin.CSSMinFilter' +] +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, 'seed/landing/static'), + os.path.join(BASE_DIR, 'seed/static'), + os.path.join(BASE_DIR, 'vendors') +] STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 'compressor.finders.CompressorFinder', ) COMPRESS_PRECOMPILERS = ( - ('text/less', 'lessc {infile} {outfile}'), + ('text/x-scss', 'django_libsass.SassCompiler'), ) AWS_QUERYSTRING_AUTH = False @@ -193,9 +202,6 @@ APPEND_SLASH = True -PASSWORD_RESET_EMAIL = 'reset@seed-platform.org' -SERVER_EMAIL = 'no-reply@seed-platform.org' - CELERY_WORKER_MAX_TASKS_PER_CHILD = 1 # Default queue @@ -223,6 +229,8 @@ LOG_FILE = os.path.join(BASE_DIR, '../logs/py.log/') EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' +SERVER_EMAIL = 'info@seed-platform.org' +PASSWORD_RESET_EMAIL = SERVER_EMAIL # Added By Gavin on 1/27/2014 TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' @@ -230,7 +238,6 @@ 'nose_exclude.NoseExclude', ] -# Django 1.5+ way of doing user profiles AUTH_USER_MODEL = 'landing.SEEDUser' AUTH_PASSWORD_VALIDATORS = [ { @@ -286,7 +293,7 @@ } SWAGGER_SETTINGS = { - "exclude_namespaces": ["app"], # List URL namespaces to ignore + 'exclude_namespaces': ['app'], # List URL namespaces to ignore 'APIS_SORTER': 'alpha', 'LOGOUT_URL': '/accounts/logout', } diff --git a/config/settings/dev.py b/config/settings/dev.py index 62acc01acc..7027ef27ad 100644 --- a/config/settings/dev.py +++ b/config/settings/dev.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import absolute_import @@ -10,10 +10,13 @@ from django.conf import settings DEBUG = True -COMPRESS_ENABLED = False +compress = False SESSION_COOKIE_SECURE = False CSRF_COOKIE_SECURE = False +COMPRESS_ENABLED = compress +COMPRESS_OFFLINE = compress + # override this in local_untracked.py DATABASES = { 'default': { diff --git a/config/settings/docker.py b/config/settings/docker.py index 91c518deab..bdc34ad3c1 100644 --- a/config/settings/docker.py +++ b/config/settings/docker.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author nicholas.long@nrel.gov File contains settings needed to run SEED with docker @@ -11,7 +11,11 @@ # Gather all the settings from the docker environment variables ENV_VARS = ['POSTGRES_DB', 'POSTGRES_USER', 'POSTGRES_PASSWORD', ] -for loc in ENV_VARS: +# The optional vars will set the SERVER_EMAIL information as needed +OPTIONAL_ENV_VARS = ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SES_REGION_NAME', + 'AWS_SES_REGION_ENDPOINT', 'SERVER_EMAIL', 'SENTRY_JS_DSN', 'SENTRY_RAVEN_DSN'] + +for loc in ENV_VARS + OPTIONAL_ENV_VARS: locals()[loc] = os.environ.get(loc) for loc in ENV_VARS: @@ -19,10 +23,20 @@ raise Exception("%s Not defined as env variables" % loc) DEBUG = False -COMPRESS_ENABLED = True +# Do not compress files in docker +COMPRESS_ENABLED = False + +# Make sure to disable secure cooking and csrf when usign Cloudflare +SESSION_COOKIE_SECURE = False +CSRF_COOKIE_SECURE = False ALLOWED_HOSTS = ['*'] +# By default we are using SES as our email client. If you would like to use +# another backend (e.g. SMTP), then please update this model to support both and +# create a pull request. +EMAIL_BACKEND = 'django_ses.SESBackend' + # PostgreSQL DB config DATABASES = { 'default': { @@ -45,7 +59,9 @@ } } CELERY_BROKER_TRANSPORT = 'redis' -CELERY_BROKER_URL = "redis://db-redis:6379/1" +CELERY_BROKER_URL = 'redis://%s/%s' % ( + CACHES['default']['LOCATION'], CACHES['default']['OPTIONS']['DB'] +) CELERY_RESULT_BACKEND = CELERY_BROKER_URL CELERY_TASK_DEFAULT_QUEUE = 'seed-docker' CELERY_TASK_QUEUES = ( @@ -75,3 +91,14 @@ if 'default' in SECRET_KEY: print("WARNING: SECRET_KEY is defaulted. Makes sure to override SECKET_KEY in local_untracked or env var") + +if 'SENTRY_RAVEN_DSN' in os.environ: + import raven + RAVEN_CONFIG = { + 'dsn': SENTRY_RAVEN_DSN, + # If you are using git, you can also automatically configure the + # release based on the git info. + 'release': raven.fetch_git_sha(os.path.abspath(os.curdir)), + } +# SENTRY_JS_DSN is directly passed through to the Sentry configuration for JS. + diff --git a/config/settings/local_untracked.py.dist b/config/settings/local_untracked.py.dist index 2ce7d4616f..28f71ec461 100644 --- a/config/settings/local_untracked.py.dist +++ b/config/settings/local_untracked.py.dist @@ -1,22 +1,41 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author :license: see LICENSE for more details. seed local_untracked.py For this to work with dev settings: - - run with dev settings (add this line to the .bashrc): + - run with dev settings: $ export DJANGO_SETTINGS_MODULE=config.settings.dev or $ ./manage.py runserver --settings=config.settings.dev - - add your setting to the DATABASES, AWS S3 config, - CACHES, and CELERY_BROKER_URL - i.e. everything here starting with 'your-' + - add your settings. Make sure to update the DATABASES, AWS related configurations, and + CACHES (i.e. everything here starting with 'your-') For local dev, all these services can run locally on localhost or 127.0.0.1 except for S3. """ +from __future__ import absolute_import + import os +from kombu import Exchange, Queue + + +# ============================ General settings and flags =========================== +COMPRESS_ENABLED = False +DOMAIN_URLCONFS = {'default': 'config.urls'} +DEBUG = True # Set to False if this is being used in production mode. If this is set as false, then +# you will need to configure nginx to serve the static assets. Deploying with docker is recommended +# and handles setting up nginx. +INTERNAL_IPS = ('127.0.0.1',) + +# MapQuestAPI key for geocoding +MAPQUEST_API_KEY = os.environ.get('MAPQUEST_API_KEY', 'a-mapquest-api-key') + +# SECRET_KEY is set here (or in your env variable) +# You can create a key from https://www.miniwebtool.com/django-secret-key-generator/ +#SECRET_KEY = 'default-your-secret-key-here' + # Optional AWS Settings (if using RDS, SES, S3, etc) #AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID', '') #AWS_UPLOAD_CLIENT_KEY = AWS_ACCESS_KEY_ID @@ -27,10 +46,12 @@ import os # email through SES (django-ses) #EMAIL_BACKEND = 'django_ses.SESBackend' +#AWS_SES_REGION_NAME = 'us-west-2' +#AWS_SES_REGION_ENDPOINT = 'email.us-west-2.amazonaws.com' +#SERVER_EMAIL = 'info@seed-platform.org' -# Optional Sentry Configuration +# Sentry Configuration (Optional) # import raven - # RAVEN_CONFIG = { # 'dsn': 'https://:@sentry.io/', # # If you are using git, you can also automatically configure the @@ -39,7 +60,18 @@ import os # } # SENTRY_JS_DSN = 'https://@sentry.io/' -# postgres DB config +# OAuth2 Configuration (Optional) +# Token request Url is a common choice for audience +# see https://tools.ietf.org/html/rfc7523#section-3 and +# https://github.com/GreenBuildingRegistry/jwt-oauth2 for additional details +# OAUTH2_JWT_PROVIDER = { +# 'JWT_AUDIENCE': 'https://example.com/oauth/token/', +# 'DEVELOPER_GROUP': 'developers', +# 'TRUSTED_OAUTH_GROUP': 'trusted_developers', +# } + + +# ================================= Database settings =============================== DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', @@ -51,31 +83,34 @@ DATABASES = { } } -# Make sure to set a SECRET_KEY here or in your env variable -# Go here to generate a secret key: https://www.miniwebtool.com/django-secret-key-generator/ -# SECRET_KEY = 'default-your-secret-key-here' - # Redis cache config. # If using AWS ElastiCache redis, the LOCATION setting looks something like: # 'xx-yy-zzrr0aax9a.ntmprk.0001.usw2.cache.amazonaws.com:6379' CACHES = { 'default': { 'BACKEND': 'redis_cache.cache.RedisCache', - 'LOCATION': "your-cache-url:your-cache-port", + 'LOCATION': 'your-cache-url:your-cache-port', 'OPTIONS': {'DB': 1}, 'TIMEOUT': 300 } } -CELERY_BROKER_URL = 'redis://your-cache-url:your-cache-port/1' -# If using AWS S3 for filesystem storage, then uncomment this, otherwise, leave it commented -# out to keep the media files in the correct location. -# DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' -# STATICFILES_STORAGE = DEFAULT_FILE_STORAGE -# STATIC_URL = "https://%s.s3.amazonaws.com/" % AWS_STORAGE_BUCKET_NAME -INTERNAL_IPS = ('127.0.0.1',) +# =============================== Celery Settings =================================== +# redis celery/message broker config. If using AWS, then the URL will look like the following: +# 'redis://xx-yy-zzrr0aax9a.ntmprk.0001.usw2.cache.amazonaws.com:6379/1' +CELERY_BROKER_URL = 'redis://%s/%s' % (CACHES['default']['LOCATION'], CACHES['default']['OPTIONS']['DB']) +CELERY_TASK_DEFAULT_QUEUE = 'seed-local' +CELERY_TASK_QUEUES = ( + Queue( + CELERY_TASK_DEFAULT_QUEUE, + Exchange(CELERY_TASK_DEFAULT_QUEUE), + routing_key=CELERY_TASK_DEFAULT_QUEUE + ), +) + +# =================================== Logging ======================================= LOGGING = { 'version': 1, 'disable_existing_loggers': False, @@ -92,12 +127,3 @@ LOGGING = { }, }, } - -# Token request Url is a common choice for audience -# see https://tools.ietf.org/html/rfc7523#section-3 and -# https://github.com/GreenBuildingRegistry/jwt-oauth2 for additional details -OAUTH2_JWT_PROVIDER = { - 'JWT_AUDIENCE': 'https://example.com/oauth/token/', - 'DEVELOPER_GROUP': 'developers', - 'TRUSTED_OAUTH_GROUP': 'trusted_developers', -} diff --git a/config/settings/prod.py b/config/settings/prod.py index 36014d9c16..7ba25327b2 100644 --- a/config/settings/prod.py +++ b/config/settings/prod.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ @@ -14,6 +14,8 @@ DEBUG = False COMPRESS_ENABLED = True +COMPRESS_STORAGE = 'compressor.storage.GzipCompressorFileStorage' +COMPRESS_OFFLINE = True # Need to test with cloudflare SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True diff --git a/config/settings/test.py b/config/settings/test.py index e2c4937672..ee65c8d868 100644 --- a/config/settings/test.py +++ b/config/settings/test.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import absolute_import diff --git a/config/settings/test_local_untracked.py b/config/settings/test_local_untracked.py index 2de491bca8..b961b98432 100644 --- a/config/settings/test_local_untracked.py +++ b/config/settings/test_local_untracked.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author :license: see LICENSE for more details. diff --git a/config/settings/travis.py b/config/settings/travis.py index f6b51a4818..ae13302557 100644 --- a/config/settings/travis.py +++ b/config/settings/travis.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author settings for travis (travis-ci.org) diff --git a/config/storage.py b/config/storage.py index e82e852904..4314188eb8 100644 --- a/config/storage.py +++ b/config/storage.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from django.core.files.storage import get_storage_class diff --git a/config/template_context.py b/config/template_context.py index b9753e4485..a279cb0189 100644 --- a/config/template_context.py +++ b/config/template_context.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/config/tests/test_commands.py b/config/tests/test_commands.py index 4e494f6f62..97f8b0d621 100644 --- a/config/tests/test_commands.py +++ b/config/tests/test_commands.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ @@ -19,14 +19,14 @@ def test_create_default_user(self): # check default case call_command('create_default_user') self.assertTrue(User.objects.filter( - username='demo@seed.lbl.gov').exists()) + username='demo@seed-platform.org').exists()) self.assertTrue(Organization.objects.filter(name='demo').exists()) self.assertTrue(OrganizationUser.objects.filter( - user__username='demo@seed.lbl.gov', + user__username='demo@seed-platform.org', organization__name='demo' ).exists()) - u = User.objects.get(username='demo@seed.lbl.gov') + u = User.objects.get(username='demo@seed-platform.org') u.check_password('demo') # check custom user case diff --git a/config/urls.py b/config/urls.py index d9bb59dfc3..2f8aec2dc1 100644 --- a/config/urls.py +++ b/config/urls.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from django.conf import settings diff --git a/config/utils.py b/config/utils.py index f2eebc506f..4207f724e4 100644 --- a/config/utils.py +++ b/config/utils.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import logging diff --git a/config/views.py b/config/views.py index 1e20ee6324..fe5fb3c7e3 100644 --- a/config/views.py +++ b/config/views.py @@ -1,5 +1,5 @@ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from django.http import HttpResponse diff --git a/config/wsgi.py b/config/wsgi.py index d8495cc422..610f7d96f4 100644 --- a/config/wsgi.py +++ b/config/wsgi.py @@ -15,7 +15,7 @@ """ """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/deploy.sh b/deploy.sh index 31c981f88a..e6db98e422 100755 --- a/deploy.sh +++ b/deploy.sh @@ -5,7 +5,11 @@ # will not be updated. : << 'arguments' -POSTGRES_DB (optional), defaults to seed +There is only one optional argument and that is the name of the docker compose file to load. +For example: ./deploy.sh docker-compose.local.oep.yml + +There are several required environment variables that need to be set in order to launch seed: +POSTGRES_DB (required), name of the POSTGRES DB DJANGO_SETTINGS_MODULE (optional), defaults to config.settings.docker POSTGRES_USER (required), admin user of postgres database POSTGRES_PASSWORD (required), admin password for postgres database @@ -13,6 +17,13 @@ SEED_ADMIN_USER (required), admin user for SEED SEED_ADMIN_PASSWORD (required), admin password for SEED SEED_ADMIN_ORG (required), default organization for admin user in SEED SECRET_KEY (required), unique key for SEED web application +AWS_ACCESS_KEY (optional), Access key for AWS +AWS_SECRET_ACCESS_KEY, Secret key for AWS +AWS_SES_REGION_NAME (optional), AWS Region for SES +AWS_SES_REGION_ENDPOINT (optional), AWS endpoint for SES +SERVER_EMAIL (optional), Email that is used by the server to send messages +SENTRY_JS_DSN (optional), Sentry JavaScript DSN +SENTRY_RAVEN_DSN (optional), Sentry Django DSN (Raven-based) # example (do not use these values in production). export POSTGRES_USER=seed @@ -21,9 +32,23 @@ export SEED_ADMIN_USER=user@seed-platform.org export SEED_ADMIN_PASSWORD=super-secret-password export SEED_ADMIN_ORG=default export SECRET_KEY=ARQV8qGuJKH8sGnBf6ZeEdJQRKLTUhsvEcp8qG9X9sCPXvGLhdxqnNXpZcy6HEyf +# If using SES for email, then you need to also pass in the following optional arguments (change as +# needed): +export AWS_ACCESS_KEY_ID=key +export AWS_SECRET_ACCESS_KEY=secret_key +export AWS_SES_REGION_NAME=us-west-2 +export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com +export SERVER_EMAIL=info@seed-platform.org +export SENTRY_JS_DSN=https://bcde@sentry.io/123456789 +export SENTRY_RAVEN_DSN=https://abcd:1234@sentry.io/123456789 arguments # Verify that env vars are set +if [ -z ${POSTGRES_DB+x} ]; then + echo "POSTGRES_DB is not set" + exit 1 +fi + if [ -z ${POSTGRES_USER+x} ]; then echo "POSTGRES_USER is not set" exit 1 @@ -59,6 +84,14 @@ if [ -z ${SECRET_KEY+x} ]; then exit 1 fi +DOCKER_COMPOSE_FILE=docker-compose.local.yml +if [ -z "$1" ]; then + echo "There are no arguments, defaulting to use '${DOCKER_COMPOSE_FILE}'." +else + DOCKER_COMPOSE_FILE=$1 + echo "Using passed docker-compose file of ${DOCKER_COMPOSE_FILE}" +fi + if docker exec $(docker ps -qf "name=registry") true > /dev/null 2>&1; then echo "Registry is already running" else @@ -74,22 +107,27 @@ else fi echo "Building lasest version of SEED" -docker-compose build --pull +# explicitly pull images from docker-compose. Note that you will need to keep the +# versions consistent between the compose file and what is below. +docker-compose pull +docker-compose build echo "Tagging local containers" docker tag seedplatform/seed:latest 127.0.0.1:5000/seed -docker tag postgres:latest 127.0.0.1:5000/postgres -docker tag redis:latest 127.0.0.1:5000/redis +docker tag postgres:11.1 127.0.0.1:5000/postgres +docker tag redis:5.0.1 127.0.0.1:5000/redis +docker tag seedplatform/oep:1.0.0-SNAPSHOT 127.0.0.1:5000/oep sleep 3 echo "Pushing tagged versions to local registry" docker push 127.0.0.1:5000/seed docker push 127.0.0.1:5000/postgres docker push 127.0.0.1:5000/redis +docker push 127.0.0.1:5000/oep echo "Deploying" # check if the stack is running, and if so then shut it down -docker stack deploy seed --compose-file=docker-compose.local.yml & +docker stack deploy seed --compose-file=${DOCKER_COMPOSE_FILE} & wait $! while ( nc -zv 127.0.0.1 80 3>&1 1>&2- 2>&3- ) | awk -F ":" '$3 != " Connection refused" {exit 1}'; do echo -n "."; sleep 5; done echo 'SEED stack redeployed' diff --git a/docker-compose.deploy.yml b/docker-compose.deploy.yml index e326fce988..fd00cafddf 100644 --- a/docker-compose.deploy.yml +++ b/docker-compose.deploy.yml @@ -1,6 +1,10 @@ # Docker Compose for deployment. This removes the hard coded usernames and # passwords and pulls Docker Hub seedplatform/seed for the latest version. -# Must set the following environment variables +# It is recommended that you use docker stack to deploy which defaults to using +# the docker-compose.local.yml file. This file is intended to support simple +# production-based docker-compose deployments (not docker stack). +# Must set the following environment variables. +# POSTGRES_DB # POSTGRES_USER # POSTGRES_PASSWORD # SEED_ADMIN_USER @@ -11,25 +15,32 @@ version: '3' services: db-postgres: - image: postgres + image: postgres:11.1 environment: - - POSTGRES_DB=seed + - POSTGRES_DB - POSTGRES_USER - POSTGRES_PASSWORD volumes: - seed_pgdata:/var/lib/postgresql/data db-redis: - image: redis + image: redis:5.0.1 web: image: seedplatform/seed environment: - - POSTGRES_DB=seed + - AWS_ACCESS_KEY_ID + - AWS_SECRET_ACCESS_KEY + - AWS_SES_REGION_NAME + - AWS_SES_REGION_ENDPOINT + - SERVER_EMAIL + - POSTGRES_DB - POSTGRES_USER - POSTGRES_PASSWORD - SEED_ADMIN_USER - SEED_ADMIN_PASSWORD - SEED_ADMIN_ORG - SECRET_KEY + - SENTRY_JS_DSN + - SENTRY_RAVEN_DSN - DJANGO_SETTINGS_MODULE=config.settings.docker depends_on: - db-redis @@ -42,10 +53,12 @@ services: command: /seed/docker/start_celery_docker.sh image: seedplatform/seed environment: - - POSTGRES_DB=seed + - POSTGRES_DB - POSTGRES_USER - POSTGRES_PASSWORD - SECRET_KEY + - SENTRY_JS_DSN + - SENTRY_RAVEN_DSN - DJANGO_SETTINGS_MODULE=config.settings.docker - NUMBER_OF_WORKERS depends_on: @@ -54,6 +67,11 @@ services: - web volumes: - seed_media:/seed/media + oep-city-1: + # This is a placeholder. If needed, follow the instructions to enable: https://cloud.docker.com/u/seedplatform/repository/docker/seedplatform/oep + image: seedplatform/oep:1.0.0-SNAPSHOT + environment: + - OEP_DISABLED=true volumes: seed_pgdata: external: true diff --git a/docker-compose.local.yml b/docker-compose.local.yml index a84c83076e..6d68f88f9e 100644 --- a/docker-compose.local.yml +++ b/docker-compose.local.yml @@ -1,5 +1,6 @@ # Docker Compose for deployment using a local registry. # Must set the following environment variables +# POSTGRES_DB # POSTGRES_USER # POSTGRES_PASSWORD # SEED_ADMIN_USER @@ -12,7 +13,7 @@ services: db-postgres: image: 127.0.0.1:5000/postgres environment: - - POSTGRES_DB=seed + - POSTGRES_DB - POSTGRES_USER - POSTGRES_PASSWORD volumes: @@ -35,13 +36,20 @@ services: web: image: 127.0.0.1:5000/seed environment: - - POSTGRES_DB=seed + - AWS_ACCESS_KEY_ID + - AWS_SECRET_ACCESS_KEY + - AWS_SES_REGION_NAME + - AWS_SES_REGION_ENDPOINT + - SERVER_EMAIL + - POSTGRES_DB - POSTGRES_USER - POSTGRES_PASSWORD - SEED_ADMIN_USER - SEED_ADMIN_PASSWORD - SEED_ADMIN_ORG - SECRET_KEY + - SENTRY_JS_DSN + - SENTRY_RAVEN_DSN - DJANGO_SETTINGS_MODULE=config.settings.docker depends_on: - db-redis @@ -59,10 +67,12 @@ services: web-celery: image: 127.0.0.1:5000/seed environment: - - POSTGRES_DB=seed + - POSTGRES_DB - POSTGRES_USER - POSTGRES_PASSWORD - SECRET_KEY + - SENTRY_JS_DSN + - SENTRY_RAVEN_DSN - DJANGO_SETTINGS_MODULE=config.settings.docker - NUMBER_OF_WORKERS depends_on: @@ -78,6 +88,11 @@ services: delay: 5s max_attempts: 3 window: 120s + oep-city-1: + # This is a placeholder. If needed, follow the instructions to enable: https://cloud.docker.com/u/seedplatform/repository/docker/seedplatform/oep + image: 127.0.0.1:5000/oep + environment: + - OEP_DISABLED=true volumes: seed_pgdata: external: true diff --git a/docker-compose.yml b/docker-compose.yml index bf7bd7c330..6fbb04942b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ version: '3' services: db-postgres: - image: postgres + image: postgres:11.1 environment: - POSTGRES_DB=seed - POSTGRES_USER=seed @@ -11,11 +11,16 @@ services: volumes: - seed_pgdata:/var/lib/postgresql/data db-redis: - image: redis + image: redis:5.0.1 web: image: seedplatform/seed:latest build: . environment: + - AWS_ACCESS_KEY_ID + - AWS_SECRET_ACCESS_KEY + - AWS_SES_REGION_NAME + - AWS_SES_REGION_ENDPOINT + - SERVER_EMAIL - POSTGRES_DB=seed - POSTGRES_USER=seed - POSTGRES_PASSWORD=super-secret-password @@ -48,6 +53,13 @@ services: - web volumes: - seed_media:/seed/media + oep-city-1: + # This is a placeholder. If needed, follow the instructions to enable: https://cloud.docker.com/u/seedplatform/repository/docker/seedplatform/oep + image: seedplatform/oep:1.0.0-SNAPSHOT + depends_on: + - web + environment: + - OEP_DISABLED=true volumes: seed_pgdata: external: true diff --git a/docker/README.md b/docker/README.md index 8e340943cb..aaee0f928a 100644 --- a/docker/README.md +++ b/docker/README.md @@ -33,7 +33,13 @@ Add user to docker group. sudo usermod -a -G docker ubuntu ``` - The preferred way to deploy with Docker is using docker swarm and docker stack. Look at the deploy.sh script in the root of this repository. +The short version is to simply run the command below. Note that the passing of the docker-compose yml filename is not required if using docker-compose.local.yml. + +```bash +./deploy.sh docker-compose.local.yml +``` + +If deploying using a custom docker-compose yml file, then simple replace the name in the command above. This would be required if using the Open Efficiency Platform work (connecting SEED to Salesforce). diff --git a/docker/seed-entrypoint.sh b/docker/seed-entrypoint.sh index 804e211208..da2d8b8efe 100644 --- a/docker/seed-entrypoint.sh +++ b/docker/seed-entrypoint.sh @@ -5,4 +5,7 @@ mkdir -p /seed/collected_static && chmod 775 /seed/collected_static mkdir -p /seed/media && chmod 777 /seed/media +# set the owner to uwsgi +chown -R uwsgi /seed/collected_static + exec "$@" diff --git a/docker/start_uwsgi_docker.sh b/docker/start_uwsgi_docker.sh index 16aa0d7e5e..b72f79cee7 100755 --- a/docker/start_uwsgi_docker.sh +++ b/docker/start_uwsgi_docker.sh @@ -12,6 +12,9 @@ echo "Waiting for redis to start" ./manage.py collectstatic --no-input ./manage.py compress --force +# set the permissions in the /seed/collected_static folder +chown -R uwsgi /seed/collected_static + # Run any migrations before starting -- always for now ./manage.py migrate diff --git a/docs/source/aws.rst b/docs/source/aws.rst index d3f4a1509f..4e8ea396ad 100644 --- a/docs/source/aws.rst +++ b/docs/source/aws.rst @@ -70,9 +70,7 @@ enter the repo and install the python dependencies from `requirements`_ JavaScript Dependencies ^^^^^^^^^^^^^^^^^^^^^^^ -``npm`` is required to install the JS dependencies. The ``bin/install_javascript_dependencies.sh`` script will -download all JavaScript dependencies and build them. ``bower`` and ``gulp`` should be installed globally for -convenience. +``npm`` is required to install the JS dependencies. .. code-block:: console @@ -82,8 +80,7 @@ convenience. .. code-block:: console - $ sudo npm install -g bower gulp - $ bin/install_javascript_dependencies.sh + $ npm install Database Configuration @@ -111,8 +108,8 @@ instance you have manually installed within your infrastructure. .. note:: -In the above database configuration, ``seed`` is the database name, this -is arbitrary and any valid name can be used as long as the database exists. + In the above database configuration, ``seed`` is the database name, this + is arbitrary and any valid name can be used as long as the database exists. create the database within the postgres ``psql`` shell: @@ -229,3 +226,5 @@ override default Django settings. export DEBUG=False export ONLY_HTTPS=True +.. _`JSON Type`: https://www.postgresql.org/docs/9.4/datatype-json.html + diff --git a/docs/source/conf.py b/docs/source/conf.py index 271473c29c..66a2f6ae54 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -41,6 +41,7 @@ 'sphinx.ext.todo', 'sphinxcontrib.spelling', 'sphinx.ext.inheritance_diagram', + 'sphinx.ext.intersphinx', ] # Add any paths that contain templates here, relative to this directory. @@ -62,7 +63,7 @@ # General information about the project. project = 'SEED Platform' -copyright = '2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory' +copyright = '2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory' author = 'The Regents of the University of California, through Lawrence Berkeley National Laboratory' # The version info for the project you're documenting, acts as replacement for diff --git a/docs/source/deployment.rst b/docs/source/deployment.rst index 5af275da31..2fd9391ae6 100644 --- a/docs/source/deployment.rst +++ b/docs/source/deployment.rst @@ -1,9 +1,7 @@ Deployment Guide ================ -SEED is intended to be installed on Linux instances in the cloud (e.g. AWS), -and on local hardware. SEED Platform does not officially support Windows for -production deployment. If this is desired, see the Django `notes`_. +SEED is intended to be installed on Linux instances in the cloud (e.g. AWS), and on local hardware. SEED Platform does not officially support Windows for production deployment. If this is desired, see the Django `notes`_. .. _notes: https://docs.djangoproject.com/en/1.7/howto/windows/ @@ -13,6 +11,12 @@ production deployment. If this is desired, see the Django `notes`_. aws linux +Migrations +---------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information. + + Monitoring ---------- diff --git a/docs/source/developer_resources.rst b/docs/source/developer_resources.rst index 2f99c476ee..f09389bd7e 100644 --- a/docs/source/developer_resources.rst +++ b/docs/source/developer_resources.rst @@ -39,13 +39,14 @@ Adding New Fields to Database Adding new fields to SEED can be complicated since SEED has a mix of typed fields (database fields) and extra data fields. Follow the steps below to add new fields to the SEED database: -1. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot is more -complicated and not documented yet. -2. Add field to list in the following locations: - * models/columns.py: Column.DATABASE_COLUMNS - * TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields -3. Run `./manage.py makemigrations` -4. Add in a Python script in the new migration to add in the new column into every organizations list of columns +#. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot models is more complicated and not documented yet. +#. Add field to list in the following locations: + +- models/columns.py: Column.DATABASE_COLUMNS +- TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields + +#. Run `./manage.py makemigrations` +#. Add in a Python script in the new migration to add in the new column into every organizations list of columns .. code-block:: python @@ -93,33 +94,15 @@ complicated and not documented yet. ] -5. Run migrations `./manage.py migrate` -6. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list): - * test_mapping_data.py:test_keys - * test_columns.py:test_column_retrieve_schema - * test_columns.py:test_column_retrieve_db_fields -7. (Optional) Update example files to include new fields -8. Test import workflow with mapping to new fields - - -AWS S3 -^^^^^^ - -Amazon AWS S3 Expires headers should be set on the AngularJS partials if using S3 with the management command: -set_s3_expires_headers_for_angularjs_partials - -Example:: - - python manage.py set_s3_expires_headers_for_angularjs_partials --verbosity=3 +#. Run migrations `./manage.py migrate` +#. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list) -The default user invite reply-to email can be overridden in the config/settings/common.py file. The `SERVER_EMAIL` -settings var is the reply-to email sent along with new account emails. +- test_mapping_data.py:test_keys +- test_columns.py:test_column_retrieve_schema +- test_columns.py:test_column_retrieve_db_fields -.. code-block:: console - - # config/settings/common.py - PASSWORD_RESET_EMAIL = 'reset@seed.lbl.gov' - SERVER_EMAIL = 'no-reply@seed.lbl.gov' +#. (Optional) Update example files to include new fields +#. Test import workflow with mapping to new fields AngularJS Integration Notes @@ -259,10 +242,17 @@ user: psql -c 'ALTER USER seeduser CREATEROLE;' ./manage.py migrate ./manage.py create_default_user \ - --username=testuser@seed.org \ + --username=demo@seed-platform.org \ --password=password \ --organization=testorg + +Migrating the Database +---------------------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information based on the version of SEED. + + Testing ------- @@ -300,21 +290,18 @@ Release Instructions To make a release do the following: -1. Github admin user, on develop branch: update the ``package.json`` and ``setup.py`` file with the - most recent version number. Always use MAJOR.MINOR.RELEASE. -2. Run the ``docs/scripts/change_log.py`` script and add the changes to the CHANGELOG.md file for - the range of time between last release and this release. Only add the *Closed Issues*. Also make - sure that all the pull requests have a related Issue in order to be included in the change log. +1. Github admin user, on develop branch: update the ``package.json`` and ``setup.py`` file with the most recent version number. Always use MAJOR.MINOR.RELEASE. +2. Update the ``docs/sources/migrations.rst`` file with any required actions. +3. Run the ``docs/scripts/change_log.py`` script and add the changes to the CHANGELOG.md file for the range of time between last release and this release. Only add the *Closed Issues*. Also make sure that all the pull requests have a related Issue in order to be included in the change log. .. code-block:: console python docs/scripts/change_log.py –k GITHUB_API_TOKEN –s 2018-02-26 –e 2018-05-30 -3. Paste the results (remove unneeded Accepted Pull Requests) into the CHANGELOG.md. Make sure to cleanup the formatting. -4. Make sure that any new UI needing localization has been tagged for - translation, and that any new translation keys exist in the lokalise.co project (see ``/docs/translation.md``). -5. Once develop passes, then create a new PR from develop to master. -6. Draft new Release from Github (https://github.com/SEED-platform/seed/releases). -7. Include list of changes since previous release (i.e. the content in the CHANGELOG.md) -8. Verify that the Docker versions are built and pushed to Docker hub (https://hub.docker.com/r/seedplatform/seed/tags/). -9. Go to Read the Docs and enable the latest version to be active (https://readthedocs.org/dashboard/seed-platform/versions/) +4. Paste the results (remove unneeded Accepted Pull Requests) into the CHANGELOG.md. Make sure to cleanup the formatting. +5. Make sure that any new UI needing localization has been tagged for translation, and that any new translation keys exist in the lokalise.co project. (see :doc:`translation documentation `). +6. Once develop passes, then create a new PR from develop to master. +7. Draft new Release from Github (https://github.com/SEED-platform/seed/releases). +8. Include list of changes since previous release (i.e. the content in the CHANGELOG.md) +9. Verify that the Docker versions are built and pushed to Docker hub (https://hub.docker.com/r/seedplatform/seed/tags/). +10. Go to Read the Docs and enable the latest version to be active (https://readthedocs.org/dashboard/seed-platform/versions/) diff --git a/docs/source/faq.rst b/docs/source/faq.rst index a80b82732e..cb268e2620 100644 --- a/docs/source/faq.rst +++ b/docs/source/faq.rst @@ -48,7 +48,7 @@ Why is the domain set to example.com? If you see example.com in the emails that are sent from your hosted version of SEED then you will need to update your django sites object in the database. -.. code-block:: +.. code-block:: bash $ ./manage.py shell @@ -59,7 +59,7 @@ need to update your django sites object in the database. one.save() -.. _staticfiles: +.. _staticfiles: Why aren't the static assets being served correctly? ---------------------------------------------------- diff --git a/docs/source/license.rst b/docs/source/license.rst index 9ac0f9b313..794c3b2558 100644 --- a/docs/source/license.rst +++ b/docs/source/license.rst @@ -2,7 +2,7 @@ License ======= -Copyright (c) 2014 – 2018, The Regents of the University of California, through +Copyright (c) 2014 – 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. diff --git a/docs/source/linux.rst b/docs/source/linux.rst index c196126a27..bf26927443 100644 --- a/docs/source/linux.rst +++ b/docs/source/linux.rst @@ -16,19 +16,19 @@ is an excellent place to general understanding of this project's layout. Prerequisites ^^^^^^^^^^^^^^ -Ubuntu server 14.04 or newer +Ubuntu server/desktop 16.04 or newer (18.04 recommended) Install the following base packages to run SEED: .. code-block:: console - sudo apt-get update - sudo apt-get upgrade - sudo apt-get install libpq-dev python-dev python-pip libatlas-base-dev \ - gfortran build-essential g++ npm libxml2-dev libxslt1-dev git mercurial \ + sudo apt update + sudo apt upgrade + sudo apt install libpq-dev python3-dev python3-pip libatlas-base-dev \ + gfortran build-essential nodejs npm libxml2-dev libxslt1-dev git \ libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python - sudo apt-get install redis-server - sudo apt-get install postgresql postgresql-contrib + sudo apt install redis-server + sudo apt install postgresql postgresql-contrib .. note:: postgresql ``>=9.3`` is required to support `JSON Type`_ @@ -38,20 +38,20 @@ Install the following base packages to run SEED: Configure PostgreSQL ^^^^^^^^^^^^^^^^^^^^ +Replace 'seeddb', 'seeduser' with desired db/user. By +default use password `seedpass` when prompted + .. code-block:: console $ sudo su - postgres - $ createdb "seed-deploy" - $ createuser -P DBUsername + $ createuser -P "seeduser" + $ createdb "seeddb" --owner="seeduser" $ psql - postgres=# GRANT ALL PRIVILEGES ON DATABASE "seed-deploy" TO DBUsername; + postgres=# GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO "seeduser"; + postgres=# ALTER USER "seeduser" CREATEDB CREATEROLE SUPERUSER; postgres=# \q $ exit -.. note:: Any database name and username can be used here in place of "seed-deploy" and DBUsername - - - Python Dependencies ^^^^^^^^^^^^^^^^^^^ @@ -69,26 +69,15 @@ enter the repo and install the python dependencies from `requirements`_ .. code-block:: console $ cd seed - $ sudo pip install -r requirements/local.txt + $ pip3 install -r requirements/local.txt JavaScript Dependencies ^^^^^^^^^^^^^^^^^^^^^^^ -``npm`` is required to install the JS dependencies. The ``bin/install_javascript_dependencies.sh`` script will -download all JavaScript dependencies and build them. ``bower`` and ``gulp`` should be installed globally for -convenience. - .. code-block:: console - $ curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash - - $ sudo apt-get install -y nodejs - $ sudo npm install -g bower gulp - - -.. code-block:: console - - $ bin/install_javascript_dependencies.sh + $ npm install Django Database Configuration @@ -104,10 +93,10 @@ you have manually installed within your infrastructure. # Database DATABASES = { 'default': { - 'ENGINE':'django.db.backends.postgresql_psycopg2', - 'NAME': 'seed-deploy', - 'USER': 'DBUsername', - 'PASSWORD': '', + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': '', 'HOST': 'localhost', 'PORT': '5432', } @@ -122,21 +111,21 @@ you have manually installed within your infrastructure. In in the above database configuration, ``seed`` is the database name, this is arbitrary and any valid name can be used as long as the database exists. Enter the database name, user, password you set above. -The database settings can be tested using the Django management command, ``./manage.py dbshell`` to connect to the +The database settings can be tested using the Django management command, ``python3 manage.py dbshell`` to connect to the configured database. create the database tables and migrations: .. code-block:: console - $ python manage.py migrate + $ python3 manage.py migrate Cache and Message Broker ^^^^^^^^^^^^^^^^^^^^^^^^ The SEED project relies on `redis`_ for both cache and message brokering, and is available as an AWS `ElastiCache`_ service or with the ``redis-server`` -Linux package. (``sudo apt-get install redis-server``) +Linux package. (``sudo apt install redis-server``) ``local_untracked.py`` should be updated with the ``CACHES`` and ``CELERY_BROKER_URL`` settings. @@ -151,7 +140,7 @@ settings. CACHES = { 'default': { 'BACKEND': 'redis_cache.cache.RedisCache', - 'LOCATION': "127.0.0.1:6379", + 'LOCATION': '127.0.0.1:6379', 'OPTIONS': {'DB': 1}, 'TIMEOUT': 300 } @@ -166,11 +155,14 @@ create a superuser to access the system .. code-block:: console - $ python manage.py create_default_user --username=demo@example.com --organization=example --password=demo123 + $ python3 manage.py create_default_user --username=admin@my.org --organization=lbnl --password=badpass .. note:: + Of course, you need to save this user/password somewhere, since this is what + you will use to login to the SEED website. + Every user must be tied to an organization, visit ``/app/#/profile/admin`` as the superuser to create parent organizations and add users to them. @@ -185,7 +177,7 @@ project directory, ``celery`` can be started: .. code-block:: console - celery -A seed worker -l INFO -c 2 -B --events --maxtasksperchild 1000 + DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l info -c 2 -B --events --maxtasksperchild=1000 .. _Celery: http://www.celeryproject.org/ @@ -202,7 +194,7 @@ options. .. code-block:: console - $ python manage.py runserver --settings=config.settings.dev + $ python3 manage.py runserver --settings=config.settings.dev Running a production web server @@ -220,14 +212,14 @@ to load static files. .. code-block:: console - $ sudo pip install uwsgi dj-static + $ pip3 install uwsgi dj-static Generate static files: .. code-block:: console - $ sudo ./manage.py collectstatic --settings=config.settings.dev + $ python3 manage.py collectstatic --settings=config.settings.prod Update ``config/settings/local_untracked.py``: @@ -252,8 +244,8 @@ Start the web server (this also starts celery): -Environmental Variables -^^^^^^^^^^^^^^^^^^^^^^^ +Environment Variables +^^^^^^^^^^^^^^^^^^^^^ The following environment variables can be set within the ``~/.bashrc`` file to override default Django settings. @@ -265,25 +257,39 @@ override default Django settings. export ONLY_HTTPS=True -SMTP service -^^^^^^^^^^^^ +Mail Services +^^^^^^^^^^^^^ + +AWS SES Service +--------------- In the AWS setup, we can use SES to provide an email service for Django. The service is -configured in the config/settings/main.py: +configured in the config/settings/local_untracked.py: .. code-block:: python EMAIL_BACKEND = 'django_ses.SESBackend' -Many options for setting up your own SMTP service/server or using other SMTP -third party services are available and compatible including `gmail`_. -.. _gmail: http://stackoverflow.com/questions/19264907/python-django-gmail-smtp-setup +In general, the following steps are needed to configure SES: -Django can likewise send emails via python's smtplib with sendmail or postfix -installed. See their `docs`_ for more info. +1. Access Amazon SES Console - `Quickstart `_ +2. Login to Amazon SES Console. Verify which region we are using (e.g., us-east-1) +3. Decide on email address that will be sending the emails and add them to the `SES Verified Emails `_. +4. Test that SES works as expected (while in the SES sandbox). Note that you will need to add the sender and recipient emails to the verified emails while in the sandbox. +5. Update the local_untracked.py file or set the environment variables for the docker file. +6. Once ready, move the SES instance out of the sandbox. Following instructions `here `_ +7. (Optional) Set up Amazon Simple Notification Service (Amazon SNS) to notify you of bounced emails and other issues. +8. (Optional) Use the AWS Management Console to set up Easy DKIM, which is a way to authenticate your emails. Amazon SES console will have the values for SPF and DKIM that you need to put into your DNS. -.. _docs: https://docs.djangoproject.com/en/1.6/topics/email/ +SMTP service +------------ + +Many options for setting up your own `SMTP`_ service/server or using other SMTP +third party services are available and compatible including `gmail`_. SMTP is not configured for working within Docker at the moment. + +.. _SMTP: https://docs.djangoproject.com/en/2.0/ref/settings/#email-backend +.. _gmail: http://stackoverflow.com/questions/19264907/python-django-gmail-smtp-setup .. code-block:: python @@ -307,13 +313,12 @@ local_untracked.py } # config for local storage backend - DOMAIN_URLCONFS = {} - DOMAIN_URLCONFS['default'] = 'urls.main' + DOMAIN_URLCONFS = {'default': 'config.urls'} CACHES = { 'default': { 'BACKEND': 'redis_cache.cache.RedisCache', - 'LOCATION': "127.0.0.1:6379", + 'LOCATION': '127.0.0.1:6379', 'OPTIONS': {'DB': 1}, 'TIMEOUT': 300 } diff --git a/docs/source/migrations.rst b/docs/source/migrations.rst new file mode 100644 index 0000000000..4c2410cdd9 --- /dev/null +++ b/docs/source/migrations.rst @@ -0,0 +1,35 @@ +Migrations +========== + +Django handles the migration of the database very well; however, there are various changes to SEED that may require some custom (manual) migrations. The migration documenation includes the required changes based on deployment and development for each release. + +Version 2.5.0 +------------- + +Docker-based Deployment +^^^^^^^^^^^^^^^^^^^^^^^ + +- Add your MapQuest Key to the docker-compose file that is used for deployment. `MAPQUEST_API_KEY`. + +Development +^^^^^^^^^^^ + +- **Delete** your bower directory `rm -rf seed/static/vendors`. +- **Delete** your css directory `rm -rf seed/static/seed/css`. +- **Remove** these lines from `local_untracked.py` if you have them. + +.. code-block:: python + + DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' + STATICFILES_STORAGE = DEFAULT_FILE_STORAGE + +- Run `pip3 install -r requirements/local.txt`. +- Run `npm install` from root checkout of SEED. + +- If testing geocoding, then sign up for as a `MapQuest Developer`_ and create a new `MapQuest Key`_. +- Add the key to either your local_untracked.py file or as an environment variables `MAPQUEST_API_KEY`. + + +.. _`MapQuest Developer`: https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register + +.. _`MapQuest Key`: https://developer.mapquest.com/user/me/apps diff --git a/docs/source/modules.rst b/docs/source/modules.rst index c541a4300d..7de69c5fe6 100644 --- a/docs/source/modules.rst +++ b/docs/source/modules.rst @@ -5,7 +5,6 @@ Modules .. toctree:: :maxdepth: 3 - modules/seed.audit_logs modules/config modules/seed.data modules/seed.data_importer diff --git a/docs/source/modules/seed.audit_logs.rst b/docs/source/modules/seed.audit_logs.rst deleted file mode 100644 index 4aa23abd8c..0000000000 --- a/docs/source/modules/seed.audit_logs.rst +++ /dev/null @@ -1,37 +0,0 @@ -Audit Logs Package -======================= - -Submodules ----------- - -Models ------- - -.. automodule:: seed.audit_logs.models - :members: - :undoc-members: - :show-inheritance: - -Tests ------ - -.. automodule:: seed.audit_logs.tests - :members: - :undoc-members: - :show-inheritance: - -URLs ----- - -.. automodule:: seed.audit_logs.urls - :members: - :undoc-members: - :show-inheritance: - -Views ------ - -.. automodule:: seed.audit_logs.views - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/modules/seed.tests.functional.rst b/docs/source/modules/seed.tests.functional.rst index 5c3df46016..774c544728 100644 --- a/docs/source/modules/seed.tests.functional.rst +++ b/docs/source/modules/seed.tests.functional.rst @@ -4,10 +4,6 @@ Tests (Functional) Package Submodules ---------- -Test Browsers -------------- -.. include:: ../../../seed/functional/tests/README.rst - Base ---- .. automodule:: seed.functional.tests.base diff --git a/docs/source/setup_docker.rst b/docs/source/setup_docker.rst index adcaa19ac0..e1c9b28d1c 100644 --- a/docs/source/setup_docker.rst +++ b/docs/source/setup_docker.rst @@ -1,5 +1,5 @@ Installation using Docker -====================== +========================= Docker works natively on Linux, Mac OSX, and Windows 10. If you are using an older version of Windows (and some older versions of Mac OSX), you will need to install Docker Toolbox. diff --git a/docs/source/setup_osx.rst b/docs/source/setup_osx.rst index f9e6a32b15..3923314fe8 100644 --- a/docs/source/setup_osx.rst +++ b/docs/source/setup_osx.rst @@ -2,6 +2,7 @@ Installation on OSX =================== .. _virtualenv: https://virtualenv.pypa.io/en/latest/ +.. _pyenv: https://github.com/pyenv/pyenv .. _virtualenvwrapper: https://virtualenvwrapper.readthedocs.io/en/latest/ .. _MacPorts: https://www.macports.org/ .. _Homebrew: http://brew.sh/ @@ -15,18 +16,20 @@ Quick Installation Instructions ------------------------------- This section is intended for developers who may already have their machine -ready for general development. If this is not the case, skip to Prerequisites. +ready for general development. If this is not the case, skip to Prerequisites. Note that SEED uses python 3. * install Postgres 9.4 and redis for cache and message broker * use a virtualenv (if desired) * `git clone git@github.com:seed-platform/seed.git` * create a `local_untracked.py` in the `config/settings` folder and add CACHE and DB config (example `local_untracked.py.dist`) -* `export DJANGO_SETTINGS_MODULE=config.settings.dev` +* `export DJANGO_SETTINGS_MODULE=config.settings.dev` in all terminals used by SEED (celery terminal and runserver terminal) * `pip install -r requirements/local.txt` + * for condas python, you way need to run this command to get pip install to succeed: `conda install -c conda-forge python-crfsuite` +* bin/install_javascript_dependencies.sh * `./manage.py migrate` * `./manage.py create_default_user` * `./manage.py runserver` -* `celery -A seed worker -l info -c 4 --maxtasksperchild 1000 --events` +* `DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l info -c 4 --maxtasksperchild=1000 --events` * navigate to `http://127.0.0.1:8000/app/#/profile/admin` in your browser to add users to organizations * main app runs at `127.0.0.1:8000/app` @@ -48,7 +51,7 @@ should have the following dependencies already installed: * git (`port install git` or `brew install git`) * Mercurial (`port install hg` or `brew install mercurial`) * graphviz (`brew install graphviz`) -* virtualenv_ and virtualenvwrapper_ (Recommended) +* pyenv_ (Recommended) .. note:: @@ -59,15 +62,11 @@ should have the following dependencies already installed: .. code-block:: bash - pip install virtualenv - pip install virtualenvwrapper + brew install pyenv + pyenv install + pyenv virtualenv seed + pyenv local seed -* Follow instructions on virtualenvwrapper_ to setup your environment. -* Once you have these installed, creating and entering a new virtualenv called "``seed``" for SEED development is by calling: - - .. code-block:: bash - - mkvirtualenv --python=python2.7 seed PostgreSQL 9.4 -------------- @@ -262,12 +261,11 @@ Homebrew:: Install JavaScript Dependencies ------------------------------- -The JS dependencies are installed using node.js package management (npm), with -a helper package called `bower`. +The JS dependencies are installed using node.js package management (npm). .. code-block:: bash - ./bin/install_javascript_dependencies.sh + npm install Start the Server ---------------- diff --git a/docs/source/translation.rst b/docs/source/translation.rst new file mode 100644 index 0000000000..2dd732f2eb --- /dev/null +++ b/docs/source/translation.rst @@ -0,0 +1,79 @@ +Translating SEED +================ + +1. Update translations on `lokalise`_. + +2. Copy lokalise.cfg.example to lokalise.cfg. Update API token. + +3. Run scripts + + .. code:: bash + + scripts/get_python_translations + script/get_angular_translations + +4. Verify and commit changes + +**Note: The lokalize website is the canonical source of data. If you +change the locale files locally, then you need to push them to +lokalize.** + +TL;DR + +SEED is localized for more than just English, so a little more care is +needed as we add new UI. All translatable strings are held in either +per-language ``.json`` files (for Angular-controlled strings, which are +the majority), or ``.mo`` files (for strings supplied by Django). + +At render time, SEED will sniff out the browser's ``Accept:`` header. +Based on that, we choose the right file. The language files themselves +are key->value mappings from a translation "key" to a translated value. +Either Angular or Django will then swap that value into the DOM wherever +it sees the key. If no translation is available, the key remains in the +DOM. (There are some wrinkles with HTML styling and pluralization that +we'll review below). + +So, the basic flow on top of any new UI features is now: + +1. Tag any user-visible strings in the UI as "translatable." There are + currently 12 (!) ways in which to do this; see below. +2. Create the translation key at `lokalise`_. We're using lokalise + because it can smooth over differences in the file formats that + Angular and Django require, and is a nice tool for managing the + process of getting translations done by a native speaker: we can put + up screenshots to clarify how the translated phrase is used, track + translation progress, etc. +3. Get a translation done. As a placeholder, lokalise can provide an + auto-filled translation from Google Translate or a few other + services, but it's fairly straightforward to order a professional + translation through lokalise. +4. Pull new translation files into the right places in the source tree + and commit them. There are scripts under ``/scripts`` to make this + mostly automatic. +5. Visually check that the containing UI looks OK with the translated + string(s). Some languages (eg. French, German) can be wordy relative + to English and cause UI elements like buttons to expand oddly. Adjust + the layout or adjust the translation as needed. + +.. _general-philosophies--style: + +General philosophies / style +---------------------------- + +Don't go crazy with indirection and interpolation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It's probably better to err on the side of too many keys than to get +clever with interpolation or Angular expressions to avoid +near-duplicates of keys. The aim should be that there is at least one +place where a competent translator can see the whole string at once. + +Compare: + +:: + +

{$:: inventory_type == 'taxlots' ? + translations['INCLUDE_SHARED_TAXLOTS'] : + translations['INCLUDE_SHARED + +.. _lokalise: https://lokalise.co/project/3537487659ca9b1dce98a7.36378626/?view=multi diff --git a/docs/translation.md b/docs/translation.md deleted file mode 100644 index 9ad1f445c5..0000000000 --- a/docs/translation.md +++ /dev/null @@ -1,295 +0,0 @@ -# Translating SEED - -1. Update translations on [lokalise](https://lokalise.co/project/3537487659ca9b1dce98a7.36378626/?view=multi). -1. Copy lokalise.cfg.example to lokalise.cfg. Update API token. -1. Run scripts - - ```bash - scripts/get_python_translations - script/get_angular_translations - ``` -1. Verify and commit changes - -**Note: The lokalize website is the canonical source of data. If you change the locale files locally, then you need to push them to lokalize.** - -TL;DR - -SEED is localized for more than just English, so a little more care is needed -as we add new UI. All translatable strings are held in either per-language `.json` files -(for Angular-controlled strings, which are the majority), or `.mo` files (for -strings supplied by Django). - -At render time, SEED will sniff out the browser's `Accept:` header. Based on -that, we choose the right file. The language files themselves are key->value -mappings from a translation "key" to a translated value. Either Angular or -Django will then swap that value into the DOM wherever it sees the key. If no -translation is available, the key remains in the DOM. (There are some wrinkles -with HTML styling and pluralization that we'll review below). - -So, the basic flow on top of any new UI features is now: - -1. Tag any user-visible strings in the UI as "translatable." There are - currently 12 (!) ways in which to do this; see below. -2. Create the translation key at - [lokalise](https://lokalise.co/project/3537487659ca9b1dce98a7.36378626/?view=multi). - We're using lokalise because it can smooth over differences in the file - formats that Angular and Django require, and is a nice tool for managing the - process of getting translations done by a native speaker: we can put up - screenshots to clarify how the translated phrase is used, track translation - progress, etc. -4. Get a translation done. As a placeholder, lokalise can provide an - auto-filled translation from Google Translate or a few other services, but - it's fairly straightforward to order a professional translation through - lokalise. -5. Pull new translation files into the right places in the source tree and - commit them. There are scripts under `/scripts` to make this mostly - automatic. -6. Visually check that the containing UI looks OK with the translated - string(s). Some languages (eg. French, German) can be wordy relative to - English and cause UI elements like buttons to expand oddly. Adjust the - layout or adjust the translation as needed. - -## General philosophies / style - -### Don't go crazy with indirection and interpolation - -It's probably better to err on the side of too many keys than to get clever -with interpolation or Angular expressions to avoid near-duplicates of keys. The -aim should be that there is at least one place where a competent translator can -see the whole string at once. - -Compare: - -``` -

{$:: inventory_type == 'taxlots' ? - translations['INCLUDE_SHARED_TAXLOTS'] : - translations['INCLUDE_SHARED_PROPERTIES'] $}

-``` - -to - -``` -

-``` - -with a translation string of - -``` -{ "SOME_KEY": "This is a phrase to {$ interpolated_value $}" } -``` - -The interpolated value is context that is invisible to the translator, who -generally won't be seeing the code. Some interpolation (eg. plurals) is -necessary. Near dupes are somewhat annoying but also fundamentally low-cost -and simple. Messy, spread-out contexts actively impede understanding. - -### English as keys - -A missing translation will simply show the "key." - -Short labels and bits of text (eg. username) should just use the English word -"Username" as the tag, and if the translation is missing the key will be shown -and the UI will effectively be in English. This isn't a great experience for -foreign-language speakers, but it probably won't actively impede their work. -The meaning is there and available. - -Longer chunks of explanatory text, though, should use a short key eg. -`MARKETING_BULLETS.BULLET_ONE` and provide the full text in the translation -file. The reason for this is that the key is the way we look up the -translation. Longer copy could have minor tweaks to it, and this will make the -system unable to look up the translation, and we'll have to reconnect the -translation in every file. Better here to use an abstract key. The downside -is that the copy is no longer available in-line in the HTML. - -There's not really a hard dividing line here. - -### Reducing duplicate keys - -Try not to pull in punctuation. Try to scope the translation key to eg. -"Username", not "Username:". This helps us get more key "hits" and minimizes -dupes in the translation file. - -### Unicode 👍, HTML entities `&thumbsdown;` - -It seems best to just put UTF-8 directly into the translated value where -possible and steer clear of angular-translate's sanitization machinery: -minimize the opportunities for double-encoding bugs. - -There are two scripts for this: `script/get_python_translations` and -`script/get_angular_translations`. - -You'll need `msgfmt` (from GNU gettext) on `$PATH` to run the python getter, as -we need to re-compile the `.po` file for Django. Note that Mac homebrew does -not put this on path by default. - -## Regarding XSS - -**There is (currently) a specific problem with XSS that will be addressed by the -time this PR merges. This temporary section is for explanation.** - -There are about 20 keys that currently contain HTML tags for styling (eg. -``, or inline icons). These should simply be included in the -translation string on the principle that otherwise we have chopped up, -decontextualized translation strings that are hard for the translators to -manage. - -Our particular problem is when we need to interpolate into a styled string. - -(see the angular translate [security guide][translate-security]). - -- If we use the escape sanitization strategy, we lose our styling. -- If we use the sanitize strategy, we keep our styling, successfully strip out any ` {% compress js %} - + {% endcompress %} {% endblock %} diff --git a/seed/landing/templates/landing/login.html b/seed/landing/templates/landing/login.html index 826ae46bb9..fa066f71bf 100644 --- a/seed/landing/templates/landing/login.html +++ b/seed/landing/templates/landing/login.html @@ -1,14 +1,5 @@ {% extends "landing/base.html" %}{% load compress %}{% load i18n %} -{% block js %}{{block.super}} - -{% endblock %} {% block content %} {% endblock %} + +{% block js %}{{block.super}} + +{% endblock %} diff --git a/seed/landing/tests.py b/seed/landing/tests.py index 2adbaf9ff0..98ffb3cccc 100644 --- a/seed/landing/tests.py +++ b/seed/landing/tests.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from django.test import TestCase diff --git a/seed/landing/urls.py b/seed/landing/urls.py index 96cf68e410..5ca9667e1f 100644 --- a/seed/landing/urls.py +++ b/seed/landing/urls.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/landing/views.py b/seed/landing/views.py index baa52c5d20..9b9a35e31a 100644 --- a/seed/landing/views.py +++ b/seed/landing/views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import logging diff --git a/seed/lib/__init__.py b/seed/lib/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/lib/__init__.py +++ b/seed/lib/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/lib/mappings/__init__.py b/seed/lib/mappings/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/lib/mappings/__init__.py +++ b/seed/lib/mappings/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/lib/mappings/data/bedes.py b/seed/lib/mappings/data/bedes.py index d0da06debe..7587ba7cc0 100644 --- a/seed/lib/mappings/data/bedes.py +++ b/seed/lib/mappings/data/bedes.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ # flake8: noqa diff --git a/seed/lib/mappings/data/pm-mapping.json b/seed/lib/mappings/data/pm-mapping.json index f5821c66a6..32f97c3b6a 100644 --- a/seed/lib/mappings/data/pm-mapping.json +++ b/seed/lib/mappings/data/pm-mapping.json @@ -125,6 +125,15 @@ "type": "date", "schema": "" }, + { + "display_name": "Gross Floor Area", + "to_field": "gross_floor_area", + "to_table_name": "PropertyState", + "from_field": "Gross Floor Area", + "units": "ft**2", + "type": "float", + "schema": "" + }, { "display_name": "Gross Floor Area", "to_field": "gross_floor_area", diff --git a/seed/lib/mappings/mapper.py b/seed/lib/mappings/mapper.py index c873050020..d917c3c98b 100644 --- a/seed/lib/mappings/mapper.py +++ b/seed/lib/mappings/mapper.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author Dan Gunter """ import json diff --git a/seed/lib/mappings/mapping_columns.py b/seed/lib/mappings/mapping_columns.py index 5ecba62733..9048b2bc5c 100644 --- a/seed/lib/mappings/mapping_columns.py +++ b/seed/lib/mappings/mapping_columns.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author Nicholas Long """ import logging diff --git a/seed/lib/mappings/test.py b/seed/lib/mappings/test.py index ea9342a822..8a42acaa18 100644 --- a/seed/lib/mappings/test.py +++ b/seed/lib/mappings/test.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import logging diff --git a/seed/lib/mcm/__init__.py b/seed/lib/mcm/__init__.py index 7f97afe58c..04a1128407 100644 --- a/seed/lib/mcm/__init__.py +++ b/seed/lib/mcm/__init__.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ VERSION = (0, 0, 1) diff --git a/seed/lib/mcm/cleaners.py b/seed/lib/mcm/cleaners.py index c3a9491264..899961da5c 100644 --- a/seed/lib/mcm/cleaners.py +++ b/seed/lib/mcm/cleaners.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import re diff --git a/seed/lib/mcm/data/SEED/__init__.py b/seed/lib/mcm/data/SEED/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/lib/mcm/data/SEED/__init__.py +++ b/seed/lib/mcm/data/SEED/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/lib/mcm/data/__init__.py b/seed/lib/mcm/data/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/lib/mcm/data/__init__.py +++ b/seed/lib/mcm/data/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/lib/mcm/mapper.py b/seed/lib/mcm/mapper.py index 859ec99e0e..32972b9458 100644 --- a/seed/lib/mcm/mapper.py +++ b/seed/lib/mcm/mapper.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/lib/mcm/matchers.py b/seed/lib/mcm/matchers.py index be1bb67a0d..8eae697982 100644 --- a/seed/lib/mcm/matchers.py +++ b/seed/lib/mcm/matchers.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from builtins import str diff --git a/seed/lib/mcm/reader.py b/seed/lib/mcm/reader.py index 2a7d5a88b4..045efd88c0 100644 --- a/seed/lib/mcm/reader.py +++ b/seed/lib/mcm/reader.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ """ diff --git a/seed/lib/mcm/tests/__init__.py b/seed/lib/mcm/tests/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/lib/mcm/tests/__init__.py +++ b/seed/lib/mcm/tests/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/lib/mcm/utils.py b/seed/lib/mcm/utils.py index ffbd843f02..474ae3e21f 100644 --- a/seed/lib/mcm/utils.py +++ b/seed/lib/mcm/utils.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from itertools import islice, chain diff --git a/seed/lib/merging/merging.py b/seed/lib/merging/merging.py index 5a2b728eb9..0c8614002e 100644 --- a/seed/lib/merging/merging.py +++ b/seed/lib/merging/merging.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author Dan Gunter """ import logging diff --git a/seed/lib/merging/tests/test_merging.py b/seed/lib/merging/tests/test_merging.py index 269f510aaa..bdaa059453 100644 --- a/seed/lib/merging/tests/test_merging.py +++ b/seed/lib/merging/tests/test_merging.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import logging diff --git a/seed/lib/progress_data/progress_data.py b/seed/lib/progress_data/progress_data.py index 1ae8a76650..712ff6dc40 100644 --- a/seed/lib/progress_data/progress_data.py +++ b/seed/lib/progress_data/progress_data.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import logging diff --git a/seed/lib/progress_data/tests/test_progress_data.py b/seed/lib/progress_data/tests/test_progress_data.py index f8ddf5407e..b4427c5553 100644 --- a/seed/lib/progress_data/tests/test_progress_data.py +++ b/seed/lib/progress_data/tests/test_progress_data.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import logging diff --git a/seed/lib/superperms/__init__.py b/seed/lib/superperms/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/lib/superperms/__init__.py +++ b/seed/lib/superperms/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/lib/superperms/orgs/__init__.py b/seed/lib/superperms/orgs/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/lib/superperms/orgs/__init__.py +++ b/seed/lib/superperms/orgs/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/lib/superperms/orgs/decorators.py b/seed/lib/superperms/orgs/decorators.py index dabcf0e53d..650533a61d 100644 --- a/seed/lib/superperms/orgs/decorators.py +++ b/seed/lib/superperms/orgs/decorators.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/lib/superperms/orgs/exceptions.py b/seed/lib/superperms/orgs/exceptions.py index 3786c74098..dd40fb521b 100644 --- a/seed/lib/superperms/orgs/exceptions.py +++ b/seed/lib/superperms/orgs/exceptions.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/lib/superperms/orgs/models.py b/seed/lib/superperms/orgs/models.py index b2ee0085f4..82197f6acc 100644 --- a/seed/lib/superperms/orgs/models.py +++ b/seed/lib/superperms/orgs/models.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import logging @@ -143,9 +143,7 @@ def is_member(self, user): def add_member(self, user, role=ROLE_OWNER): """Add a user to an organization.""" - return OrganizationUser.objects.get_or_create( - user=user, organization=self, role_level=role - ) + return OrganizationUser.objects.get_or_create(user=user, organization=self, role_level=role) def remove_member(self, user): """Remove user from organization.""" diff --git a/seed/lib/superperms/orgs/permissions.py b/seed/lib/superperms/orgs/permissions.py index 8441b8b82d..645eaaf517 100644 --- a/seed/lib/superperms/orgs/permissions.py +++ b/seed/lib/superperms/orgs/permissions.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. diff --git a/seed/lib/superperms/tests/__init__.py b/seed/lib/superperms/tests/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/lib/superperms/tests/__init__.py +++ b/seed/lib/superperms/tests/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/lib/superperms/tests/test_organizations.py b/seed/lib/superperms/tests/test_organizations.py index 84859a37cc..a9ba0de9ac 100644 --- a/seed/lib/superperms/tests/test_organizations.py +++ b/seed/lib/superperms/tests/test_organizations.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/lib/util.py b/seed/lib/util.py index afa3dabcd2..e42b07340c 100644 --- a/seed/lib/util.py +++ b/seed/lib/util.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author Dan Gunter """ diff --git a/seed/management/__init__.py b/seed/management/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/management/__init__.py +++ b/seed/management/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/management/commands/__init__.py b/seed/management/commands/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/management/commands/__init__.py +++ b/seed/management/commands/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/management/commands/_localtools.py b/seed/management/commands/_localtools.py index 14c1883158..893dbf05bc 100644 --- a/seed/management/commands/_localtools.py +++ b/seed/management/commands/_localtools.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author Nathan Addy Helper methods for a couple (possibly deprecated) management tasks diff --git a/seed/management/commands/add_member_to_org.py b/seed/management/commands/add_member_to_org.py new file mode 100644 index 0000000000..ad54eee14a --- /dev/null +++ b/seed/management/commands/add_member_to_org.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +""" +:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:author +""" +from django.core.management.base import BaseCommand + +from seed.landing.models import SEEDUser as User +from seed.lib.superperms.orgs.models import ( + Organization, + OrganizationUser, + ROLE_MEMBER, + ROLE_VIEWER, + ROLE_OWNER, +) + + +class Command(BaseCommand): + help = 'Add an existing member to an existing organization' + + def add_arguments(self, parser): + parser.add_argument('--username', + help='Name of the existing user (email address)', + action='store') + + parser.add_argument('--organization_name', + help='Organization name', + action='store') + + # type of member + parser.add_argument('--member_type', + default='member', + help='Type of member: owner, member, viewer', + action='store') + + def handle(self, *args, **options): + # verify that the user exists + org = Organization.objects.filter(name=options['organization_name']).first() + if not org: + self.stdout.write("No organization found for %s" % options['organization_name']) + exit(1) + + u = User.objects.filter(username=options['username']).first() + if not u: + self.stdout.write("No user found for %s" % options['username']) + exit(1) + + ou, _ = OrganizationUser.objects.get_or_create(user=u, organization=org) + if options['member_type'] == 'viewer': + ou.role_level = ROLE_VIEWER + elif options['member_type'] == 'owner': + ou.role_level = ROLE_OWNER + else: + ou.role_level = ROLE_MEMBER + ou.save() + + self.stdout.write('Added user %s to org %s with permissions as %s' % + (u.username, org.name, options['member_type'])) diff --git a/seed/management/commands/create_default_columns.py b/seed/management/commands/create_default_columns.py index e7cfd87680..f4b33b68bc 100644 --- a/seed/management/commands/create_default_columns.py +++ b/seed/management/commands/create_default_columns.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from django.core.management.base import BaseCommand diff --git a/seed/management/commands/create_default_user.py b/seed/management/commands/create_default_user.py index 86021bf07c..1890aa386c 100644 --- a/seed/management/commands/create_default_user.py +++ b/seed/management/commands/create_default_user.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from django.core.management.base import BaseCommand @@ -15,7 +15,7 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument('--username', - default='demo@seed.lbl.gov', + default='demo@seed-platform.org', help='Sets the default username.', action='store', dest='username') diff --git a/seed/management/commands/create_sample_data.py b/seed/management/commands/create_sample_data.py index 07beaa1091..65fad94bfe 100644 --- a/seed/management/commands/create_sample_data.py +++ b/seed/management/commands/create_sample_data.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import unicode_literals diff --git a/seed/management/commands/create_suborg_user.py b/seed/management/commands/create_suborg_user.py index 48d942683e..f4114ac4b6 100644 --- a/seed/management/commands/create_suborg_user.py +++ b/seed/management/commands/create_suborg_user.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from django.core.management.base import BaseCommand @@ -16,7 +16,7 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument('--username', - default='demo@seed.lbl.gov', + default='demo@seed-platform.org', help='Existing SEED User', action='store', dest='username') diff --git a/seed/management/commands/create_test_user_json.py b/seed/management/commands/create_test_user_json.py index 3c27bdd236..9f12661202 100644 --- a/seed/management/commands/create_test_user_json.py +++ b/seed/management/commands/create_test_user_json.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/management/commands/destroy_bluesky_data.py b/seed/management/commands/destroy_bluesky_data.py index bf36e80201..daccf75843 100644 --- a/seed/management/commands/destroy_bluesky_data.py +++ b/seed/management/commands/destroy_bluesky_data.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import unicode_literals diff --git a/seed/management/commands/erase_data_from_orgs.py b/seed/management/commands/erase_data_from_orgs.py index e67c9d5c3d..7a5a62c1da 100644 --- a/seed/management/commands/erase_data_from_orgs.py +++ b/seed/management/commands/erase_data_from_orgs.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import unicode_literals diff --git a/seed/management/commands/make_superuser.py b/seed/management/commands/make_superuser.py index 3af8ba4e1b..7902648375 100644 --- a/seed/management/commands/make_superuser.py +++ b/seed/management/commands/make_superuser.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import unicode_literals diff --git a/seed/management/commands/prune_old_organizations.py b/seed/management/commands/prune_old_organizations.py index 229474c73a..f1f794e8ab 100644 --- a/seed/management/commands/prune_old_organizations.py +++ b/seed/management/commands/prune_old_organizations.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author Delete all organizations that are not part of the main 12. diff --git a/seed/management/commands/remove_superuser.py b/seed/management/commands/remove_superuser.py index 5be9675207..2b9382970f 100644 --- a/seed/management/commands/remove_superuser.py +++ b/seed/management/commands/remove_superuser.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import unicode_literals diff --git a/seed/management/commands/set_s3_expires_headers_for_angularjs_partials.py b/seed/management/commands/set_s3_expires_headers_for_angularjs_partials.py index da882ca71a..8b8b7fa6ec 100644 --- a/seed/management/commands/set_s3_expires_headers_for_angularjs_partials.py +++ b/seed/management/commands/set_s3_expires_headers_for_angularjs_partials.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author This should be executed after S3 bucket and CORS are set as last step and called in post_compile script. diff --git a/seed/management/commands/single_org_commands.py b/seed/management/commands/single_org_commands.py deleted file mode 100644 index 148dc35f8b..0000000000 --- a/seed/management/commands/single_org_commands.py +++ /dev/null @@ -1,93 +0,0 @@ -""" -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA -:author -""" - -from __future__ import unicode_literals - -import logging - -from django.core.management.base import BaseCommand - -from _localtools import logging_info -from seed.models import PropertyState -from seed.models import TaxLotState - -logging.basicConfig(level=logging.DEBUG) - - -class Command(BaseCommand): - def add_arguments(self, parser): - parser.add_argument('--org', dest='organization', default=False) - parser.add_argument('--stats', dest='stats', default=False, action="store_true") - return - - def handle(self, *args, **options): - logging_info("RUN org_specific_commands with args={},kwds={}".format(args, options)) - if options['organization']: - core_organization = list(map(int, options['organization'].split(","))) - else: - core_organization = [20, 69] - - logging_info("Processing organization list: {}".format(core_organization)) - - for org in core_organization: - process_org(org) - - logging_info("END org_specific_commands") - return - - -def process_org(org): - if org == 20: - do_process_org_20() - elif org == 69: - do_process_org_69() - - return - - -def do_process_org_69(): - print("Single Commands for org=69") - org_pk = 69 - - tax_attrs_to_clear = ["address_line_1", "city", "state", "postal_code"] - property_attrs_to_clear = ["address_line_1", "city", "state", "postal_code"] - - for ndx, property_state in enumerate(PropertyState.objects.filter(organization_id=org_pk).all()): - for pa in property_attrs_to_clear: - setattr(property_state, pa, None) - property_state.save() - - for ndx, taxlot_state in enumerate(TaxLotState.objects.filter(organization_id=org_pk).all()): - for ta in tax_attrs_to_clear: - setattr(taxlot_state, ta, None) - taxlot_state.save() - return - - -def do_process_org_20(): - print("Single Commands for org=20") - count = PropertyState.objects.filter(organization_id=20).count() - for ndx, prop in enumerate(PropertyState.objects.filter(organization_id=20).all()): - print("Processing {}/{}".format(ndx + 1, count)) - - if prop.address_line_1: - prop.extra_data["Address 1"] = prop.address_line_1 - prop.address_line_1 = None - - if prop.address_line_2: - prop.extra_data["Address 2"] = prop.address_line_2 - prop.address_line_2 = None - - if prop.normalized_address: - prop.extra_data["Normalized Address"] = prop.normalized_address - prop.normalized_address = None - - prop.save() - - for ndx, tl in enumerate(TaxLotState.objects.filter(organization_id=20).all()): - tl.address_line_1 = None - tl.address_line_2 = None - tl.normalized_address = None - tl.save() diff --git a/seed/models/__init__.py b/seed/models/__init__.py index ddb4782762..94362198e7 100644 --- a/seed/models/__init__.py +++ b/seed/models/__init__.py @@ -2,7 +2,7 @@ # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/models/building_file.py b/seed/models/building_file.py index 04e64263da..137add45b7 100644 --- a/seed/models/building_file.py +++ b/seed/models/building_file.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author nicholas.long@nrel.gov """ from __future__ import unicode_literals @@ -192,6 +192,11 @@ def process(self, organization_id, cycle, property_view=None): # {'reference_case': 'Baseline', 'annual_savings_site_energy': None, # 'measures': [], 'id': 'Baseline', 'name': 'Baseline'} + # If the scenario does not have a name then log a warning and continue + if not s.get('name'): + messages['warnings'].append('Scenario does not have a name. ID = %s' % s.get('id')) + continue + scenario, _ = Scenario.objects.get_or_create( name=s.get('name'), property_state_id=self.property_state_id, diff --git a/seed/models/certification.py b/seed/models/certification.py index 9719b33d20..fac8f0c5a9 100644 --- a/seed/models/certification.py +++ b/seed/models/certification.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/models/column_list_settings.py b/seed/models/column_list_settings.py index d5b076956b..1a2e80f662 100644 --- a/seed/models/column_list_settings.py +++ b/seed/models/column_list_settings.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/models/column_list_settings_columns.py b/seed/models/column_list_settings_columns.py index 2217aae43a..f783fa50c8 100644 --- a/seed/models/column_list_settings_columns.py +++ b/seed/models/column_list_settings_columns.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/models/column_mappings.py b/seed/models/column_mappings.py index 54fae0f2cb..93c071c04f 100644 --- a/seed/models/column_mappings.py +++ b/seed/models/column_mappings.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/models/columns.py b/seed/models/columns.py index 24180e3ffd..4a0af33ed2 100644 --- a/seed/models/columns.py +++ b/seed/models/columns.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ @@ -900,14 +900,15 @@ def delete_all(organization): @staticmethod def retrieve_db_types(): """ - return the data types for the database columns in the format of: + Return the data types for the database columns in the format of: - Example: - { - "field_name": "data_type", - "field_name_2": "data_type_2", - "address_line_1": "string", - } + .. code-block:: json + + { + "field_name": "data_type", + "field_name_2": "data_type_2", + "address_line_1": "string", + } :return: dict """ @@ -958,7 +959,8 @@ def retrieve_db_field_table_and_names_from_db_tables(): """ Similar to keys, except it returns a list of tuples of the columns that are in the database - .. code: + .. code-block:: json + [ ('PropertyState', 'address_line_1'), ('PropertyState', 'address_line_2'), @@ -1145,24 +1147,24 @@ def retrieve_all(org_id, inventory_type=None, only_used=False): @staticmethod def retrieve_priorities(org_id): """ - Return the list of priorties for the columns + Return the list of priorties for the columns. Result will be in the form of: - Result will be in the form of: + .. code-block:: json - { - 'PropertyState': { - 'lot_number': 'Favor New', - 'owner_address': 'Favor New', - 'extra_data': { - 'data_007': 'Favor New' - } - 'TaxLotState': { - 'custom_id_1': 'Favor New', - 'block_number': 'Favor New', - 'extra_data': { - 'data_008': 'Favor New' - } - } + { + 'PropertyState': { + 'lot_number': 'Favor New', + 'owner_address': 'Favor New', + 'extra_data': { + 'data_007': 'Favor New' + } + 'TaxLotState': { + 'custom_id_1': 'Favor New', + 'block_number': 'Favor New', + 'extra_data': { + 'data_008': 'Favor New' + } + } :param org_id: organization with the columns :return: dict @@ -1190,7 +1192,8 @@ def retrieve_all_by_tuple(org_id): """ Return list of all columns for an organization as a tuple. - .. code: + .. code-block:: json + [ ('PropertyState', 'address_line_1'), ('PropertyState', 'address_line_2'), diff --git a/seed/models/cycles.py b/seed/models/cycles.py index a35c405cce..f4b5d22f3b 100644 --- a/seed/models/cycles.py +++ b/seed/models/cycles.py @@ -1,6 +1,6 @@ # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA """ from __future__ import unicode_literals diff --git a/seed/models/data_quality.py b/seed/models/data_quality.py index 6cb64eb71b..cb04a024fc 100644 --- a/seed/models/data_quality.py +++ b/seed/models/data_quality.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/models/measures.py b/seed/models/measures.py index 7140e1e594..0b26a4f74d 100644 --- a/seed/models/measures.py +++ b/seed/models/measures.py @@ -1,6 +1,6 @@ # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/models/meters.py b/seed/models/meters.py index 4f602ff8e5..ab1880e9d8 100644 --- a/seed/models/meters.py +++ b/seed/models/meters.py @@ -1,6 +1,6 @@ # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA """ from django.db import models diff --git a/seed/models/models.py b/seed/models/models.py index 924cd46812..bb8587fd3b 100644 --- a/seed/models/models.py +++ b/seed/models/models.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/models/notes.py b/seed/models/notes.py index 88468b5eec..b8ecdcecd5 100644 --- a/seed/models/notes.py +++ b/seed/models/notes.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/models/projects.py b/seed/models/projects.py index 8983dace5d..72562a547c 100644 --- a/seed/models/projects.py +++ b/seed/models/projects.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/models/properties.py b/seed/models/properties.py index 1908e150d7..85c2a6062c 100644 --- a/seed/models/properties.py +++ b/seed/models/properties.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import unicode_literals @@ -419,8 +419,8 @@ def record_dict(log): if log.parent1.name in ['Import Creation', 'Manual Edit']: record = record_dict(log.parent1) history.append(record) - elif log.parent1.name == 'System Match' and log.parent1.parent1.name == 'Import Creation' and \ - log.parent1.parent2.name == 'Import Creation': + elif log.parent1.name == 'System Match' and log.parent1.parent1 and log.parent1.parent1.name == 'Import Creation' and \ + log.parent1.parent2 and log.parent1.parent2.name == 'Import Creation': # Handle case where an import file matches within itself, and proceeds to match with # existing records record = record_dict(log.parent1.parent2) diff --git a/seed/models/property_measures.py b/seed/models/property_measures.py index 8f2cae3ae2..082cee2ac9 100644 --- a/seed/models/property_measures.py +++ b/seed/models/property_measures.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import unicode_literals diff --git a/seed/models/scenarios.py b/seed/models/scenarios.py index 86a3247349..b093fdbea0 100644 --- a/seed/models/scenarios.py +++ b/seed/models/scenarios.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import unicode_literals diff --git a/seed/models/simulations.py b/seed/models/simulations.py index c41895bc5e..bed9abab82 100644 --- a/seed/models/simulations.py +++ b/seed/models/simulations.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import unicode_literals diff --git a/seed/models/tax_lot_properties.py b/seed/models/tax_lot_properties.py index f38ad1430d..2ac9672951 100644 --- a/seed/models/tax_lot_properties.py +++ b/seed/models/tax_lot_properties.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import unicode_literals diff --git a/seed/models/tax_lots.py b/seed/models/tax_lots.py index 3bbbbdf5a9..0dbc0e421a 100644 --- a/seed/models/tax_lots.py +++ b/seed/models/tax_lots.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import absolute_import diff --git a/seed/pagination.py b/seed/pagination.py index eb4c8a80b8..1b66f905f5 100644 --- a/seed/pagination.py +++ b/seed/pagination.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from rest_framework import pagination diff --git a/seed/public/__init__.py b/seed/public/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/public/__init__.py +++ b/seed/public/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/renderers.py b/seed/renderers.py index 3343b4aa77..a0f7a208d9 100644 --- a/seed/renderers.py +++ b/seed/renderers.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/search.py b/seed/search.py index 376d70c8de..f121dd192f 100644 --- a/seed/search.py +++ b/seed/search.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author Search methods pertaining to buildings. diff --git a/seed/serializers/__init__.py b/seed/serializers/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/serializers/__init__.py +++ b/seed/serializers/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/serializers/base.py b/seed/serializers/base.py index 5860d03878..f2a596e259 100644 --- a/seed/serializers/base.py +++ b/seed/serializers/base.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/serializers/building_file.py b/seed/serializers/building_file.py index 1e5b2e5763..57800f4254 100644 --- a/seed/serializers/building_file.py +++ b/seed/serializers/building_file.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/serializers/celery.py b/seed/serializers/celery.py index 9a19535350..cfd8456d42 100644 --- a/seed/serializers/celery.py +++ b/seed/serializers/celery.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import dateutil diff --git a/seed/serializers/certification.py b/seed/serializers/certification.py index 85a130bda1..9ce555df91 100644 --- a/seed/serializers/certification.py +++ b/seed/serializers/certification.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/serializers/column_list_settings.py b/seed/serializers/column_list_settings.py index ef18f4ba83..1e32b0fcfa 100644 --- a/seed/serializers/column_list_settings.py +++ b/seed/serializers/column_list_settings.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/serializers/column_mappings.py b/seed/serializers/column_mappings.py index 494daf9ea7..747931771d 100644 --- a/seed/serializers/column_mappings.py +++ b/seed/serializers/column_mappings.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/serializers/columns.py b/seed/serializers/columns.py index 36643cf085..6220024769 100644 --- a/seed/serializers/columns.py +++ b/seed/serializers/columns.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/serializers/cycles.py b/seed/serializers/cycles.py index e739d19b53..cc80f5d5a3 100644 --- a/seed/serializers/cycles.py +++ b/seed/serializers/cycles.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from rest_framework import serializers diff --git a/seed/serializers/labels.py b/seed/serializers/labels.py index f4a5aecd62..bf1c0fcc50 100644 --- a/seed/serializers/labels.py +++ b/seed/serializers/labels.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from rest_framework import serializers diff --git a/seed/serializers/measures.py b/seed/serializers/measures.py index 3753db8f6d..ddfb4bd8a0 100644 --- a/seed/serializers/measures.py +++ b/seed/serializers/measures.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author nicholas.long@nrel.gov """ diff --git a/seed/serializers/notes.py b/seed/serializers/notes.py index cb4fd8ba7c..6cad75e30f 100644 --- a/seed/serializers/notes.py +++ b/seed/serializers/notes.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from rest_framework import serializers diff --git a/seed/serializers/projects.py b/seed/serializers/projects.py index dc0b1c3198..015e85a37c 100644 --- a/seed/serializers/projects.py +++ b/seed/serializers/projects.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from rest_framework import serializers diff --git a/seed/serializers/properties.py b/seed/serializers/properties.py index ba904e0c01..cd765f934a 100644 --- a/seed/serializers/properties.py +++ b/seed/serializers/properties.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/serializers/scenarios.py b/seed/serializers/scenarios.py index afc30dd6c0..fb77b45fd9 100644 --- a/seed/serializers/scenarios.py +++ b/seed/serializers/scenarios.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from rest_framework import serializers diff --git a/seed/serializers/tax_lot_properties.py b/seed/serializers/tax_lot_properties.py index 05913e338f..d9bbc5fc89 100644 --- a/seed/serializers/tax_lot_properties.py +++ b/seed/serializers/tax_lot_properties.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/serializers/taxlots.py b/seed/serializers/taxlots.py index 5b2617d3e7..f33e50077b 100644 --- a/seed/serializers/taxlots.py +++ b/seed/serializers/taxlots.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from rest_framework import serializers diff --git a/seed/static/seed/css/landing.css b/seed/static/seed/css/landing.css deleted file mode 100755 index 6d633faf51..0000000000 --- a/seed/static/seed/css/landing.css +++ /dev/null @@ -1,2 +0,0 @@ -body,html{height:100%;margin:0;padding:0;width:100%}.page .header .logo .logo_text .logo_text_seed,body{font-family:"PT Sans","Helvetica Neue",Helvetica,Arial,sans-serif}body{background:gray url(../images/landing/landing-bg.jpg) no-repeat;background-size:cover;font-size:16px;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;font-weight:400}.header,.marketing_text,.page_section,.section_marketing{position:relative;overflow:auto}.page{margin-left:auto;margin-right:auto;width:75%;background:#fff;border-radius:8px;box-shadow:0 0 26px rgba(0,0,0,.7)}.page .header{background-color:#f3fafb;border-top-right-radius:9px;border-top-left-radius:9px;border-bottom:1px solid #c6c8c9}.page .header .logo{float:left;width:260px}.page .header .logo .logo_text{width:260px;padding:27px 20px 18px;font-size:24px;font-family:"PT Sans Narrow","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;text-transform:uppercase}.page .header .logo .logo_text .logo_text_seed{font-weight:700}.page .header .logo .logo_text .logo_text_saving,.page .header .logo .logo_text .saving_progress{color:#428bca}.page .header .logo_DOE{float:right;padding:22px 30px 20px 0;width:274px}.page .page_section .section_marketing{float:left;width:50%;height:430px;color:#222}.page .page_section .section_marketing h1{padding:24px 30px 11px;font-size:24px;line-height:30px;font-weight:400;text-align:center}.page .page_section .section_marketing .marketing_text{padding:0 30px 20px;line-height:21px}.page .page_section .section_marketing .marketing_text .bullet{float:left;width:8%;padding-top:2px}.page .page_section .section_marketing .marketing_text .bullet div{width:20px;height:20px;background-color:#428bca;border:2px solid #fff;border-radius:18px;box-shadow:1px 1px 4px #c6c8c9}.page .page_section .section_marketing .marketing_text .bullet_text{float:right;width:91%}.page .page_section .section_marketing .asterisk .bullet_text{font-size:14px;line-height:16px}.page .page_section .section_marketing span.asterisk_color{font-size:120%;color:#fc882a}.page .page_section .section_marketing .powered_by_seed{position:absolute;width:200px;bottom:26px;left:50%;margin-left:-95px;text-align:center;font-size:14px;font-weight:700;color:#929292}.page .page_section .section_marketing .powered_by_seed .logo_SEED{width:200px}.page .page_section .section_forms{float:right;overflow:hidden;width:49%;min-height:430px;text-align:center;border-left:1px solid #c6c8c9;background:url(../images/landing/bg-paper.png);-moz-border-bottom-right-radius:8px;border-bottom-right-radius:8px}.page .page_section .section_forms .form_title{padding-top:26px}.page .page_section .section_forms .form_title h2{font-size:24px;font-weight:400;color:#606060;text-shadow:1px 1px 1px #fff}.page .page_section .section_forms .form_title p.password_note{color:#ff4d4d;text-align:left;padding:0 32px}.page .page_section .section_forms .disable_login{opacity:.5}.page .page_section .section_forms .browser_unsupported,.page .page_section .section_forms .choose_your_path,.page .page_section .section_forms .current_account_link,.page .page_section .section_forms .enter_invite_code_form,.page .page_section .section_forms .signup_form{margin-top:10px;min-height:228px}.page .page_section .section_forms .current_account_link .signup_form,.page .page_section .section_forms .enter_invite_code_form .signup_form{margin:0;min-height:0}.page .page_section .helptext,.page .page_section .section_forms .browser_unsupported,.page .page_section .section_forms .signup_form table.signup_table br{display:none}.page .page_section .section_forms .browser_unsupported .browser_unsupported_message{margin-top:26px}.page .page_section .section_forms .browser_unsupported .browser_unsupported_message h2{font-weight:700}.page .page_section .section_forms .browser_unsupported .browser_unsupported_message .message_text{width:80%;margin:6px auto;font-size:16px}.page .page_section .section_forms .browser_unsupported .browser_download_links{margin-top:20px;width:100%;overflow:auto}.page .page_section .section_forms .browser_unsupported .browser_download_links .browser_option{display:block;float:left;text-align:center;text-decoration:none;width:19%;height:94px}.page .page_section .section_forms .browser_unsupported .browser_download_links .chrome{background:url(../images/landing/logo-chrome-64.png) top center no-repeat;margin-left:63px}.page .page_section .section_forms .browser_unsupported .browser_download_links .firefox{background:url(../images/landing/logo-firefox-64.png) top center no-repeat}.page .page_section .section_forms .browser_unsupported .browser_download_links .safari{background:url(../images/landing/logo-safari-64.png) top center no-repeat}.page .page_section .section_forms .browser_unsupported .browser_download_links .ie{background:url(../images/landing/logo-ie-64.png) top center no-repeat}.page .page_section .section_forms .browser_unsupported .browser_name{position:relative;top:70px}.page .page_section .section_forms .signup_form table.signup_table{width:96%;margin:0 auto;background-color:transparent;text-align:left}.page .page_section .section_forms .signup_form table.signup_table th{padding:8px 8px 20px 0;text-align:right;display:none}.page .page_section .section_forms .signup_form table.signup_table td,.page .page_section .section_forms .signup_form table.signup_table td p{text-align:center}.page .page_section .section_forms .signup_form table.signup_table input{display:inline-block;width:94%;padding:10px;margin-top:8px;margin-bottom:2px;font-family:'PT Sans Narrow',sans-serif;font-size:16px;line-height:20px;color:#929292;background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:0 1px 1px #fff;transition:border box-shadow linear .2s}.page .page_section .section_forms .signup_form table.signup_table input:focus{border-color:rgba(82,168,236,.8);outline:thin dotted 9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.page .page_section .section_forms .signup_form table.signup_table .errorlist{text-indent:0;color:#ff4d4d;position:relative}.page .page_section .section_forms .signup_form table.signup_table .errorlist li{position:absolute;left:200px;top:15px;list-style:none}.page .page_section .section_forms .signup_form table.signup_table select{width:98%;margin-top:10px;margin-bottom:4px}.page .page_section .section_forms .signup_form table.signup_table #id_first_name,.page .page_section .section_forms .signup_form table.signup_table #id_last_name,.page .page_section .section_forms .signup_form table.signup_table #id_password1,.page .page_section .section_forms .signup_form table.signup_table #id_password2{width:88%}.page .page_section .section_forms .signup_form table.signup_table input[type=checkbox]{margin-top:0;width:20px}.page .page_section .section_forms .signup_form table.signup_table .opt-ins{padding-top:16px}.page .page_section .section_forms .signup_form p{line-height:24px}.page .page_section .section_forms .signup_form .btn{margin:30px 4px 0;display:inline-block;font-size:16px}.page .page_section .section_forms .signup_form .forgot_password{display:block;margin-top:20px;margin-bottom:20px}.page .page_section .section_forms .signup_form .already_signed_up,.page .page_section .section_forms .signup_form .already_signed_up_signup{display:block;margin-top:20px;font-size:15px}.page .page_section .section_forms .signup_form .thank_you{padding-top:20px}.page .page_section .section_forms .signup_form .thank_you .thank_you_text{margin:0 auto;width:75%;line-height:22px}.page .page_section .section_forms .signup_form span.email_me{font-size:15px}.page .page_section .signup_complete_message{margin-top:30px}.page .login_form table.signup_table{width:40%}.login.page .page_section .section_forms .signup_form table.signup_table .errorlist{margin:0 0 8px;padding:0}.login.page .page_section .section_forms .signup_form table.signup_table .errorlist li{left:0;position:relative}.terms_of_service{width:50%;padding:20px;background-color:#eee}.terms_of_service .terms{height:200px;overflow:scroll;background-color:#fff;padding:10px;border:1px solid #ccc} -/*# sourceMappingURL=landing.css.map */ diff --git a/seed/static/seed/css/landing.css.map b/seed/static/seed/css/landing.css.map deleted file mode 100644 index 705056e253..0000000000 --- a/seed/static/seed/css/landing.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["landing.scss","landing.css"],"names":[],"mappings":"AAyEA,I,CAAA,I,CACE,W,CACA,Q,CACA,S,CACA,U,CAuBF,8C,CApBA,I,CA+CU,iE,CA/CV,I,CACE,+D,CACA,qB,CAEA,c,CAEA,iC,CACA,kC,CAFA,e,CAMF,O,CC3Ec,e,CD2Ed,a,CC1EgB,kB,CD8Ed,iB,CACA,a,CAIF,K,CACE,gB,CACA,iB,CACA,S,CACA,e,CACA,iB,CAxDA,kC,CAmDF,a,CASI,wB,CAvDF,2B,CACA,0B,CAwDE,+B,CAXJ,mB,CAcM,U,CACA,W,CAfN,8B,CAkBQ,W,CACA,sB,CACA,c,CACA,wE,CAEA,e,CACA,wB,CAxBR,8C,CA4BU,e,CA5BV,gD,CAAA,+C,CAgCU,a,CAhCV,uB,CAqCM,W,CACA,wB,CACA,W,CAvCN,sC,CA6CM,U,CACA,S,CACA,Y,CACA,U,CAhDN,yC,CAmDQ,sB,CACA,c,CACA,gB,CACA,e,CACA,iB,CAvDR,sD,CA0DQ,mB,CACA,gB,CA3DR,8D,CA6DU,U,CACA,Q,CACA,e,CA/DV,kE,CAiEY,U,CACA,W,CACA,wB,CACA,qB,CACA,kB,CAxHV,8B,CAmDF,mE,CA0EU,W,CACA,S,CA3EV,6D,CAgFU,c,CACA,gB,CAjFV,0D,CAqFQ,c,CACA,a,CAtFR,uD,CAyFQ,iB,CACA,W,CACA,W,CACA,Q,CACA,iB,CACA,iB,CACA,c,CACA,e,CACA,a,CAjGR,kE,CAoGU,W,CApGV,kC,CAyGM,W,CACA,e,CACA,S,CACA,gB,CACA,iB,CACA,6B,CACA,8C,CAEA,mC,CACA,8B,CAlHN,8C,CAqHQ,gB,CArHR,iD,CAwHU,c,CACA,e,CACA,a,CACA,4B,CA3HV,8D,CA+HU,a,CACA,e,CACA,c,CAjIV,iD,CAqIQ,U,CC3G4C,uD,CD1BpD,oD,CAAA,wD,CCwB6D,0D,CACE,+C,CDoHvD,e,CACA,gB,CA9IR,qE,CAAA,uE,CAmJU,Q,CACA,Y,CApJV,6B,CAAA,uD,CAAA,qE,CAwJQ,Y,CAxJR,oF,CA2JU,e,CA3JV,uF,CA8JY,e,CA9JZ,kG,CAkKY,S,CACA,e,CACA,c,CApKZ,+E,CAwKU,e,CACA,U,CACA,a,CA1KV,+F,CA6KY,a,CACA,U,CACA,iB,CACA,oB,CACA,S,CACA,W,CAlLZ,uF,CAsLY,yE,CACA,gB,CAvLZ,wF,CA2LY,0E,CA3LZ,uF,CA+LY,yE,CA/LZ,mF,CAmMY,qE,CAnMZ,qE,CAwMU,iB,CACA,Q,CAzMV,kE,CA+MU,S,CACA,a,CACA,4B,CACA,e,CAlNV,qE,CAoNY,sB,CACA,gB,CACA,Y,CAtNZ,qE,CAAA,uE,CAyNY,iB,CAzNZ,wE,CA+NY,oB,CACA,S,CACA,Y,CACA,c,CACA,iB,CACA,uC,CACA,c,CACA,gB,CACA,a,CACA,qB,CACA,qB,CACA,iB,CA7RV,2C,CAAA,yB,CANA,uC,CAyDF,8E,CAgPY,gC,CACA,qB,CApSV,2C,CAmDF,6E,CAyPY,a,CACA,a,CACA,iB,CA3PZ,gF,CA6Pc,iB,CACA,U,CACA,Q,CACA,e,CAhQd,yE,CAqQY,S,CACA,e,CACA,iB,CAvQZ,iF,CAAA,gF,CCoHuF,gF,CACA,gF,CDwJ3E,S,CA7QZ,uF,CAgRY,Y,CACA,U,CAjRZ,2E,CAoRY,gB,CApRZ,iD,CAyRU,gB,CAzRV,oD,CA4RU,iB,CACA,oB,CACA,c,CA9RV,gE,CAkSU,a,CACA,e,CACA,kB,CApSV,kE,CAAA,yE,CAuSU,a,CACA,e,CACA,c,CAzSV,0D,CAkTU,gB,CAlTV,0E,CAoTY,a,CACA,S,CACA,gB,CAtTZ,6D,CA0TU,c,CA1TV,4C,CAmUM,e,CAnUN,oC,CAwUI,S,CAIJ,mF,CACE,c,CACA,S,CAFF,sF,CAKI,M,CACA,iB,CAKJ,iB,CACE,S,CACA,Y,CACA,qB,CAHF,wB,CAMI,Y,CACA,e,CACA,qB,CACA,Y,CACA,qB","file":"landing.css","sourcesContent":["$font-family-sans-serif: \"PT Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n$font-family-sans-serif-narrow: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n$font-family-base: $font-family-sans-serif;\n$font-family-base-narrow: $font-family-sans-serif-narrow;\n$font-size-base: 13px;\n\n$legibility: optimizeLegibility;\n$knockout: antialiased;\n\n$white: #fff;\n$black: #222;\n$gray: #4a4a52;\n$gray_dark: #2b2b32;\n$gray_lighter: #ccc;\n$gray_lightest: #eeeeee;\n$blue: #428bca;\n$beige: #f5f4ec;\n$orange: #fc882a;\n$green: #66b132;\n$yellow: #ffc40d;\n$purple: #9900ff;\n$red: #ff4d4d;\n$highlighter: #fff7d7;\n\n$be-blue: $blue;\n$be-lightblue: lighten($blue, 10%);\n$be-darkblue: darken($blue, 10%);\n$grayLight: #999;\n$grayDivider: #cecece;\n$grayLighter: $gray_lighter;\n$grayLightest: $gray_lightest;\n$be-light-grey: $gray_lighter;\n$grayDark: lighten($gray_dark, 10%);\n$landing-landing-blue: #118fa1;\n$landing-landing-dk-blue: #05414d;\n$landing-landing-lt-blue: #f3fafb;\n$bdp-landing-lt-gray: #929292;\n$bdp-landing-md-gray: #c6c8c9;\n$bdp-landing-dk-gray: #606060;\n\n// Transitions\n@mixin transition($transition) {\n -webkit-transition: $transition;\n transition: $transition;\n}\n\n// Box Shadows\n@mixin box-shadow($shadow) {\n -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1\n box-shadow: $shadow;\n}\n\n// Single side border-radius\n@mixin border-top-radius($radius) {\n border-top-right-radius: $radius;\n border-top-left-radius: $radius;\n}\n\n@mixin border-right-radius($radius) {\n border-bottom-right-radius: $radius;\n border-top-right-radius: $radius;\n}\n\n@mixin border-bottom-radius($radius) {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n}\n\n@mixin border-left-radius($radius) {\n border-bottom-left-radius: $radius;\n border-top-left-radius: $radius;\n}\n\nhtml, body {\n height: 100%;\n margin: 0;\n padding: 0;\n width: 100%;\n}\n\nbody {\n background: #808080 url(\"../images/landing/landing-bg.jpg\") no-repeat;\n background-size: cover;\n font-family: $font-family-base;\n font-size: 16px;\n font-weight: normal;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n}\n\n////////// MAKE FLOAT CONTAINERS PLAY NICE ////////////\n.header,\n.page_section,\n.marketing_text,\n.section_marketing {\n position: relative;\n overflow: auto;\n}\n\n////////// STYLE THE PAGE ////////////\n.page {\n margin-left: auto;\n margin-right: auto;\n width: 75%;\n background: $white;\n border-radius: 8px;\n @include box-shadow(0 0 26px rgba(0, 0, 0, 0.7));\n\n .header {\n background-color: $landing-landing-lt-blue;\n @include border-top-radius(9px);\n border-bottom: 1px solid $bdp-landing-md-gray;\n\n .logo {\n float: left;\n width: 260px;\n\n .logo_text {\n width: 260px;\n padding: 27px 20px 18px;\n font-size: 24px;\n font-family: $font-family-base-narrow;\n\n font-weight: normal;\n text-transform: uppercase;\n\n .logo_text_seed {\n font-family: $font-family-base;\n font-weight: bold;\n }\n .logo_text_saving,\n .saving_progress {\n color: $be-blue;\n }\n }\n }\n .logo_DOE {\n float: right;\n padding: 22px 30px 20px 0;\n width: 274px;\n }\n }\n .page_section {\n\n .section_marketing {\n float: left;\n width: 50%;\n height: 430px;\n color: $black;\n\n h1 {\n padding: 24px 30px 11px 30px;\n font-size: 24px;\n line-height: 30px;\n font-weight: normal;\n text-align: center;\n }\n .marketing_text {\n padding: 0 30px 20px 30px;\n line-height: 21px;\n .bullet {\n float: left;\n width: 8%;\n padding-top: 2px;\n div {\n width: 20px;\n height: 20px;\n background-color: $be-blue;\n border: 2px solid $white;\n border-radius: 18px;\n @include box-shadow(1px 1px 4px $bdp-landing-md-gray);\n }\n }\n .bullet_text {\n float: right;\n width: 91%;\n }\n }\n .asterisk {\n .bullet_text {\n font-size: 14px;\n line-height: 16px;\n }\n }\n span.asterisk_color {\n font-size: 120%;\n color: $orange;\n }\n .powered_by_seed {\n position: absolute;\n width: 200px;\n bottom: 26px;\n left: 50%;\n margin-left: -95px;\n text-align: center;\n font-size: 14px;\n font-weight: bold;\n color: $bdp-landing-lt-gray;\n\n .logo_SEED {\n width: 200px;\n }\n }\n }\n .section_forms {\n float: right;\n overflow: hidden;\n width: 49%;\n min-height: 430px;\n text-align: center;\n border-left: 1px solid $bdp-landing-md-gray;\n background: url('../images/landing/bg-paper.png');\n -webkit-border-bottom-right-radius: 8px;\n -moz-border-bottom-right-radius: 8px;\n border-bottom-right-radius: 8px;\n\n .form_title {\n padding-top: 26px;\n\n h2 {\n font-size: 24px;\n font-weight: normal;\n color: $bdp-landing-dk-gray;\n text-shadow: 1px 1px 1px $white;\n }\n\n p.password_note {\n color: $red;\n text-align: left;\n padding: 0px 32px;\n }\n }\n .disable_login {\n opacity: 0.5;\n }\n /////////// DEFINE THE HEIGHT OF SECTION FORM CONTAINERS. KEEP SAME. //////////////\n .choose_your_path,\n .current_account_link,\n .enter_invite_code_form,\n .signup_form,\n .browser_unsupported {\n margin-top: 10px;\n min-height: 228px;\n }\n .current_account_link,\n .enter_invite_code_form {\n .signup_form {\n margin: 0;\n min-height: 0;\n }\n }\n .browser_unsupported {\n display: none;\n\n .browser_unsupported_message {\n margin-top: 26px;\n\n h2 {\n font-weight: bold;\n }\n\n .message_text {\n width: 80%;\n margin: 6px auto;\n font-size: 16px;\n }\n }\n .browser_download_links {\n margin-top: 20px;\n width: 100%;\n overflow: auto;\n\n .browser_option {\n display: block;\n float: left;\n text-align: center;\n text-decoration: none;\n width: 19%;\n height: 94px;\n }\n\n .chrome {\n background: url('../images/landing/logo-chrome-64.png') top center no-repeat;\n margin-left: 63px;\n }\n\n .firefox {\n background: url('../images/landing/logo-firefox-64.png') top center no-repeat;\n }\n\n .safari {\n background: url('../images/landing/logo-safari-64.png') top center no-repeat;\n }\n\n .ie {\n background: url('../images/landing/logo-ie-64.png') top center no-repeat;\n }\n\n }\n .browser_name {\n position: relative;\n top: 70px;\n }\n }\n\n .signup_form {\n table.signup_table {\n width: 96%;\n margin: 0 auto;\n background-color: transparent;\n text-align: left;\n th {\n padding: 8px 8px 20px 0;\n text-align: right;\n display: none;\n }\n td {\n text-align: center;\n p {\n text-align: center;\n }\n }\n input {\n display: inline-block;\n width: 94%;\n padding: 10px;\n margin-top: 8px;\n margin-bottom: 2px;\n font-family: 'PT Sans Narrow', sans-serif;\n font-size: 16px;\n line-height: 20px;\n color: $bdp-landing-lt-gray;\n background-color: $white;\n border: 1px solid #CCC;\n border-radius: 3px;\n @include box-shadow(inset 0 1px 1px rgba(0, 0, 0, 0.075));\n @include box-shadow(0px 1px 1px $white);\n @include transition(border box-shadow linear 0.2s);\n }\n input:focus {\n border-color: rgba(82, 168, 236, 0.8);\n outline: thin dotted 9;\n @include box-shadow(inset 0 1px 1px rgba(0, 0, 0, .075) /* , 0 0 8px rgba(82,168,236,.6) */\n );\n }\n br {\n display: none;\n }\n .errorlist {\n text-indent: 0;\n color: $red;\n position: relative;\n li {\n position: absolute;\n left: 200px;\n top: 15px;\n list-style: none;\n }\n }\n\n select {\n width: 98%;\n margin-top: 10px;\n margin-bottom: 4px;\n }\n #id_first_name,\n #id_last_name,\n #id_password1,\n #id_password2 {\n width: 88%;\n }\n input[type=\"checkbox\"] {\n margin-top: 0;\n width: 20px;\n }\n .opt-ins {\n padding-top: 16px;\n }\n\n }\n p {\n line-height: 24px;\n }\n .btn {\n margin: 30px 4px 0 4px;\n display: inline-block;\n font-size: 16px;\n }\n\n .forgot_password {\n display: block;\n margin-top: 20px;\n margin-bottom: 20px;\n }\n .already_signed_up {\n display: block;\n margin-top: 20px;\n font-size: 15px;\n }\n .already_signed_up_signup {\n display: block;\n margin-top: 20px;\n font-size: 15px;\n }\n\n .thank_you {\n padding-top: 20px;\n .thank_you_text {\n margin: 0 auto;\n width: 75%;\n line-height: 22px\n }\n }\n span.email_me {\n font-size: 15px;\n }\n\n }\n }\n .helptext {\n display: none;\n }\n .signup_complete_message {\n margin-top: 30px;\n }\n }\n\n .login_form table.signup_table {\n width: 40%;\n }\n}\n\n.login.page .page_section .section_forms .signup_form table.signup_table .errorlist {\n margin: 0 0 8px 0;\n padding: 0;\n\n li {\n left: 0;\n position: relative;\n }\n\n}\n\n.terms_of_service {\n width: 50%;\n padding: 20px;\n background-color: $gray_lightest;\n\n .terms {\n height: 200px;\n overflow: scroll;\n background-color: $white;\n padding: 10px;\n border: 1px solid $gray_lighter;\n }\n}\n","html, body {\n height: 100%;\n margin: 0;\n padding: 0;\n width: 100%; }\n\nbody {\n background: #808080 url(\"../images/landing/landing-bg.jpg\") no-repeat;\n background-size: cover;\n font-family: \"PT Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 16px;\n font-weight: normal;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased; }\n\n.header,\n.page_section,\n.marketing_text,\n.section_marketing {\n position: relative;\n overflow: auto; }\n\n.page {\n margin-left: auto;\n margin-right: auto;\n width: 75%;\n background: #fff;\n border-radius: 8px;\n box-shadow: 0 0 26px rgba(0, 0, 0, 0.7); }\n .page .header {\n background-color: #f3fafb;\n border-top-right-radius: 9px;\n border-top-left-radius: 9px;\n border-bottom: 1px solid #c6c8c9; }\n .page .header .logo {\n float: left;\n width: 260px; }\n .page .header .logo .logo_text {\n width: 260px;\n padding: 27px 20px 18px;\n font-size: 24px;\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-weight: normal;\n text-transform: uppercase; }\n .page .header .logo .logo_text .logo_text_seed {\n font-family: \"PT Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-weight: bold; }\n .page .header .logo .logo_text .logo_text_saving,\n .page .header .logo .logo_text .saving_progress {\n color: #428bca; }\n .page .header .logo_DOE {\n float: right;\n padding: 22px 30px 20px 0;\n width: 274px; }\n .page .page_section .section_marketing {\n float: left;\n width: 50%;\n height: 430px;\n color: #222; }\n .page .page_section .section_marketing h1 {\n padding: 24px 30px 11px 30px;\n font-size: 24px;\n line-height: 30px;\n font-weight: normal;\n text-align: center; }\n .page .page_section .section_marketing .marketing_text {\n padding: 0 30px 20px 30px;\n line-height: 21px; }\n .page .page_section .section_marketing .marketing_text .bullet {\n float: left;\n width: 8%;\n padding-top: 2px; }\n .page .page_section .section_marketing .marketing_text .bullet div {\n width: 20px;\n height: 20px;\n background-color: #428bca;\n border: 2px solid #fff;\n border-radius: 18px;\n box-shadow: 1px 1px 4px #c6c8c9; }\n .page .page_section .section_marketing .marketing_text .bullet_text {\n float: right;\n width: 91%; }\n .page .page_section .section_marketing .asterisk .bullet_text {\n font-size: 14px;\n line-height: 16px; }\n .page .page_section .section_marketing span.asterisk_color {\n font-size: 120%;\n color: #fc882a; }\n .page .page_section .section_marketing .powered_by_seed {\n position: absolute;\n width: 200px;\n bottom: 26px;\n left: 50%;\n margin-left: -95px;\n text-align: center;\n font-size: 14px;\n font-weight: bold;\n color: #929292; }\n .page .page_section .section_marketing .powered_by_seed .logo_SEED {\n width: 200px; }\n .page .page_section .section_forms {\n float: right;\n overflow: hidden;\n width: 49%;\n min-height: 430px;\n text-align: center;\n border-left: 1px solid #c6c8c9;\n background: url(\"../images/landing/bg-paper.png\");\n -moz-border-bottom-right-radius: 8px;\n border-bottom-right-radius: 8px; }\n .page .page_section .section_forms .form_title {\n padding-top: 26px; }\n .page .page_section .section_forms .form_title h2 {\n font-size: 24px;\n font-weight: normal;\n color: #606060;\n text-shadow: 1px 1px 1px #fff; }\n .page .page_section .section_forms .form_title p.password_note {\n color: #ff4d4d;\n text-align: left;\n padding: 0px 32px; }\n .page .page_section .section_forms .disable_login {\n opacity: 0.5; }\n .page .page_section .section_forms .choose_your_path,\n .page .page_section .section_forms .current_account_link,\n .page .page_section .section_forms .enter_invite_code_form,\n .page .page_section .section_forms .signup_form,\n .page .page_section .section_forms .browser_unsupported {\n margin-top: 10px;\n min-height: 228px; }\n .page .page_section .section_forms .current_account_link .signup_form,\n .page .page_section .section_forms .enter_invite_code_form .signup_form {\n margin: 0;\n min-height: 0; }\n .page .page_section .section_forms .browser_unsupported {\n display: none; }\n .page .page_section .section_forms .browser_unsupported .browser_unsupported_message {\n margin-top: 26px; }\n .page .page_section .section_forms .browser_unsupported .browser_unsupported_message h2 {\n font-weight: bold; }\n .page .page_section .section_forms .browser_unsupported .browser_unsupported_message .message_text {\n width: 80%;\n margin: 6px auto;\n font-size: 16px; }\n .page .page_section .section_forms .browser_unsupported .browser_download_links {\n margin-top: 20px;\n width: 100%;\n overflow: auto; }\n .page .page_section .section_forms .browser_unsupported .browser_download_links .browser_option {\n display: block;\n float: left;\n text-align: center;\n text-decoration: none;\n width: 19%;\n height: 94px; }\n .page .page_section .section_forms .browser_unsupported .browser_download_links .chrome {\n background: url(\"../images/landing/logo-chrome-64.png\") top center no-repeat;\n margin-left: 63px; }\n .page .page_section .section_forms .browser_unsupported .browser_download_links .firefox {\n background: url(\"../images/landing/logo-firefox-64.png\") top center no-repeat; }\n .page .page_section .section_forms .browser_unsupported .browser_download_links .safari {\n background: url(\"../images/landing/logo-safari-64.png\") top center no-repeat; }\n .page .page_section .section_forms .browser_unsupported .browser_download_links .ie {\n background: url(\"../images/landing/logo-ie-64.png\") top center no-repeat; }\n .page .page_section .section_forms .browser_unsupported .browser_name {\n position: relative;\n top: 70px; }\n .page .page_section .section_forms .signup_form table.signup_table {\n width: 96%;\n margin: 0 auto;\n background-color: transparent;\n text-align: left; }\n .page .page_section .section_forms .signup_form table.signup_table th {\n padding: 8px 8px 20px 0;\n text-align: right;\n display: none; }\n .page .page_section .section_forms .signup_form table.signup_table td {\n text-align: center; }\n .page .page_section .section_forms .signup_form table.signup_table td p {\n text-align: center; }\n .page .page_section .section_forms .signup_form table.signup_table input {\n display: inline-block;\n width: 94%;\n padding: 10px;\n margin-top: 8px;\n margin-bottom: 2px;\n font-family: 'PT Sans Narrow', sans-serif;\n font-size: 16px;\n line-height: 20px;\n color: #929292;\n background-color: #fff;\n border: 1px solid #CCC;\n border-radius: 3px;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: 0px 1px 1px #fff;\n transition: border box-shadow linear 0.2s; }\n .page .page_section .section_forms .signup_form table.signup_table input:focus {\n border-color: rgba(82, 168, 236, 0.8);\n outline: thin dotted 9;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n .page .page_section .section_forms .signup_form table.signup_table br {\n display: none; }\n .page .page_section .section_forms .signup_form table.signup_table .errorlist {\n text-indent: 0;\n color: #ff4d4d;\n position: relative; }\n .page .page_section .section_forms .signup_form table.signup_table .errorlist li {\n position: absolute;\n left: 200px;\n top: 15px;\n list-style: none; }\n .page .page_section .section_forms .signup_form table.signup_table select {\n width: 98%;\n margin-top: 10px;\n margin-bottom: 4px; }\n .page .page_section .section_forms .signup_form table.signup_table #id_first_name,\n .page .page_section .section_forms .signup_form table.signup_table #id_last_name,\n .page .page_section .section_forms .signup_form table.signup_table #id_password1,\n .page .page_section .section_forms .signup_form table.signup_table #id_password2 {\n width: 88%; }\n .page .page_section .section_forms .signup_form table.signup_table input[type=\"checkbox\"] {\n margin-top: 0;\n width: 20px; }\n .page .page_section .section_forms .signup_form table.signup_table .opt-ins {\n padding-top: 16px; }\n .page .page_section .section_forms .signup_form p {\n line-height: 24px; }\n .page .page_section .section_forms .signup_form .btn {\n margin: 30px 4px 0 4px;\n display: inline-block;\n font-size: 16px; }\n .page .page_section .section_forms .signup_form .forgot_password {\n display: block;\n margin-top: 20px;\n margin-bottom: 20px; }\n .page .page_section .section_forms .signup_form .already_signed_up {\n display: block;\n margin-top: 20px;\n font-size: 15px; }\n .page .page_section .section_forms .signup_form .already_signed_up_signup {\n display: block;\n margin-top: 20px;\n font-size: 15px; }\n .page .page_section .section_forms .signup_form .thank_you {\n padding-top: 20px; }\n .page .page_section .section_forms .signup_form .thank_you .thank_you_text {\n margin: 0 auto;\n width: 75%;\n line-height: 22px; }\n .page .page_section .section_forms .signup_form span.email_me {\n font-size: 15px; }\n .page .page_section .helptext {\n display: none; }\n .page .page_section .signup_complete_message {\n margin-top: 30px; }\n .page .login_form table.signup_table {\n width: 40%; }\n\n.login.page .page_section .section_forms .signup_form table.signup_table .errorlist {\n margin: 0 0 8px 0;\n padding: 0; }\n .login.page .page_section .section_forms .signup_form table.signup_table .errorlist li {\n left: 0;\n position: relative; }\n\n.terms_of_service {\n width: 50%;\n padding: 20px;\n background-color: #eeeeee; }\n .terms_of_service .terms {\n height: 200px;\n overflow: scroll;\n background-color: #fff;\n padding: 10px;\n border: 1px solid #ccc; }\n"]} \ No newline at end of file diff --git a/seed/static/seed/css/style.css b/seed/static/seed/css/style.css deleted file mode 100755 index aab67e3725..0000000000 --- a/seed/static/seed/css/style.css +++ /dev/null @@ -1,2 +0,0 @@ -@keyframes fadein{0%{opacity:0}to{opacity:1}}*{outline:none!important}.red{color:#ff4d4d}.green{color:#66b132}.yellow{color:#ffc40d}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{content:"";line-height:0;display:table}.clearfix:after{clear:both}.hide_transition{transition:none!important;-webkit-transition:none!important;animation:none!important;-webkit-animation:none!important;-moz-animation:none!important;-o-animation:none!important}body{margin:0;font-size:13px;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:#222}.h1,.h2,.h3,.h4,.h5,.h6,body,h1,h2,h3,h4,h5,h6{font-family:"PT Sans","Helvetica Neue",Helvetica,Arial,sans-serif}a:not([href]){cursor:pointer}.label{padding:2.6px 7.8px;font-size:100%}.btn{-webkit-font-smoothing:initial}.btn.btn-default-gray{background-color:#999;color:#fff}.btn.btn-default-gray .caret{border-top-color:#fff}.pointer,.section_tab_container .nav-tabs li a{cursor:pointer}.app{width:100vw;margin-left:0}.ui-view-container{height:calc(100vh - 55px);max-height:calc(100vh - 55px);min-height:calc(100vh - 55px);overflow-x:auto}.sidebar{margin-left:0;position:fixed;float:none;height:100%;background-color:#4a4a52;white-space:nowrap;width:56px;z-index:10}.sidebar .menu{margin:0;position:relative}.sidebar .menu #sidebar-profile{text-overflow:ellipsis}.sidebar .menu .item{position:relative;overflow:hidden;display:block;padding:16px;width:100%;height:53px;color:#fff;cursor:pointer;text-decoration:none}.sidebar .menu .item:hover{color:#fff;background-color:#3e3e45;transition:all .2s ease}.sidebar .menu .item.active{font-weight:700;color:#fff;background-color:#2b2b32}.sidebar .menu .item .icon{position:relative;float:left;width:20px;text-align:center}.sidebar .menu .item i{font-size:20px}.sidebar .menu .item .item_name{position:relative;top:1px;margin-top:0;margin-left:16px;line-height:0;text-transform:uppercase;font-weight:700;letter-spacing:2px}.sidebar .menu .item .badge{position:absolute;top:17px;right:15px}.sidebar .menu .divider{margin:0;height:1px;background-color:#2b2b32}.sidebar.collapsed{margin-left:0;width:56px;transition:.5s}.sidebar.collapsed .badge,.sidebar.collapsed .item_name{display:none;visibility:hidden}.sidebar.expanded{width:260px;transition:.5s}.sidebar.expanded .badge,.sidebar.expanded .item_name{font-size:13px;visibility:visible;display:inline;animation:fadein .5s}.display{width:100%}.display .content{margin-left:56px}.display .content.narrow{margin-left:260px;transition:.5s}.display .content.wide{margin-left:56px;transition:.5s}.display .content .header{position:relative;width:100%;height:54px;border-bottom:1px solid #ccc}.display .content .header .logo_container,.display .content .header .menu_toggle_container,.display .content .header .search_bar_container{position:relative;float:left}.display .content .header .add_menu_container{position:relative}.display .content .header .menu_toggle_container .menu_toggle{display:block;cursor:pointer;padding:18px 20px 15px;border-right:1px solid #ccc}.display .content .header .menu_toggle_container .menu_toggle i,.section_content_container .section_content .content_block p{font-size:18px}.display .content .header .menu_toggle_container .menu_toggle:hover,.section_nav_container .section_nav a.active,.section_nav_container .section_nav a:hover{background-color:#eee}.display .content .header .logo_container .logo,.modal-body .form-group .checkbox label,.ui-grid-row-header-link>a{display:block}.display .content .header .logo_container .logo .logo_text{width:234px;padding:11px 20px 10px 18px;font-size:24px;font-family:"PT Sans Narrow","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;text-transform:uppercase}.display .content .header .logo_container .logo .logo_text .logo_text_seed{font-family:"PT Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}.display .content .header .logo_container .logo .logo_text .logo_text_saving,.display .content .header .logo_container .logo .logo_text .saving_progress{color:#428bca}.display .content .header .search_bar_container .search_bar{display:block;width:320px;padding:10px 20px 10px 2px}.display .content .header .add_menu_container,.section_content_container .section_content .table_list_container table td span.is_aligned_right,.section_content_container .section_content .table_list_container table th span.is_aligned_right{float:right}.display .content .header .add_menu_container .btn-group.open .dropdown-toggle{box-shadow:inset 0 0 0 rgba(0,0,0,0)}.display .content .header .add_menu_container .btn-group .btn{padding:14px 20px 12px;font-size:18px;color:#428bca;background-color:rgba(255,255,255,0);border-radius:0}.display .content .header .add_menu_container .btn-group .btn.btn:active,.display .content .header .add_menu_container .btn-group .btn.btn:focus,.display .content .header .add_menu_container .btn-group .btn.btn:hover{background-color:#eee;box-shadow:inset 0 0 0 rgba(0,0,0,0)}.display .content .header .add_menu_container .btn-group ul.dropdown-menu{text-align:center}.display .content .header .add_menu_container .btn-group ul.dropdown-menu li.divider{margin:0}.display .content .header .add_menu_container .btn-group ul.dropdown-menu li.dropdown-header{padding:8px 0;font-size:14px;color:#000;font-weight:700;text-align:center}.display .content .header .add_menu_container .btn-group ul.dropdown-menu li a{padding:8px 40px 8px 8px;position:relative;color:#428bca}.display .content .header .add_menu_container .btn-group.org-dropdown button{border:none;font-family:"PT Sans Narrow","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;padding-top:16px;padding-bottom:15px}.display .content .header .add_menu_container .btn-group.org-dropdown ul{max-height:calc(100vh - 60px);overflow-y:auto;right:0;left:inherit;text-align:left}.display .content .header .add_menu_container .btn-group.org-dropdown ul .fa{position:absolute;right:5px;top:10px}@media (max-width:945px){.search_bar_container{display:none}}.page{clear:both;position:relative}.page .page_header_container{clear:both;display:block}.page .page_header_container .page_header{position:relative;height:40px;border-bottom:1px solid #ccc}.page .page_header_container .page_header .page_action_container{position:relative;float:left;padding:11px 20px 7px}.page .page_header_container .page_header .page_action_container.left{float:left;width:30%}.page .page_header_container .page_header .page_action_container.left a i,.section_content_container .section_content .table_list_container table td.account_org i,.section_content_container .section_content .table_list_container table th.sub_head.sub_org.right i{padding-right:6px}.page .page_header_container .page_header .page_action_container.right{float:right;width:30%;text-align:right}.page .page_header_container .page_header .page_action_container.page_action_btn{padding:5px 14px 2px 10px}.page .page_header_container .page_header .page_action_container.page_action_btn .uib-dropdown-menu{text-align:left}.page .page_header_container .page_header .page_action_container .page_action{text-decoration:none}.page .page_header_container .page_header .page_title{position:relative;width:40%;padding:11px 20px 7px;float:left;text-align:center;overflow:hidden;text-overflow:ellipsis}.page .page_header_container .page_header .page_title h1{display:inline;font-size:18px;font-weight:700;white-space:nowrap}.page .page_header_container .page_header .filters{position:absolute;top:32px;z-index:1;right:16px;width:200px;height:200px;text-align:left;background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.page .page_header_container .page_header .filters .filter_label{clear:both;padding-top:10px;padding-bottom:2px;font-size:12px;font-weight:700;text-transform:uppercase;color:gray}.page .page_header_container .page_header .filters .apply_filters,.section_header_container .section_header.has_no_padding .section_action_container{padding-top:20px}.section_nav_container{min-height:38px;position:relative;border-bottom:1px solid #ccc}.section_nav_container .section_nav{position:relative;text-align:center}.section_nav_container .section_nav a{display:inline-block;padding:10px}.section{clear:both;display:block}.alert_container{padding:20px 10px}.section_tab_container{padding:16px;font-size:14px}.section_tab_container .row{margin-left:0;margin-right:0;border-left:1px solid #ddd;border-right:1px solid #ddd;border-bottom:1px solid #ddd}.section_tab_container .tab_content.narrow{padding:16px 20% 16px 16px}.section_tab_container .tab_content.wide{padding:16px}.section_header_container{position:relative;border-bottom:1px solid #ccc}.section_header_container.has_no_border{border-bottom:none}.section_header_container.has_btm_margin{margin-bottom:16px}.section_header_container .section_header{position:relative;padding:20px 20px 10px}.section_header_container .section_header.has_no_padding{padding:0 20px}.section_header_container .section_header.has_no_padding .section_action_container.section_action_btn{padding-top:9px}.section_header_container .section_header.fixed_height{height:64px}.section_header_container .section_header.fixed_height_short{min-height:48px}.section_header_container .section_header h2{display:inline;padding-right:10px;font-size:16px;font-weight:700}.section_header_container .section_header i{padding-right:8px}.section_header_container .section_header .active{background-color:#428bca}.section_header_container .section_header .section_action_container{position:relative}.section_header_container .section_header .section_action_container.left{float:left;width:25%}.section_header_container .section_header .section_action_container.left_40{float:left;width:40%}.section_header_container .section_header .section_action_container.left_wide{float:left;width:75%}.section_header_container .section_header .section_action_container.center{float:left;padding-top:4px;text-align:center;width:50%}.section_header_container .section_header .section_action_container.center .field_title{padding-left:10px;font-family:"PT Sans Narrow","Helvetica Neue",Helvetica,Arial,sans-serif;text-transform:uppercase;font-weight:700}.section_header_container .section_header .section_action_container.right{float:right;width:25%;text-align:right}.important-tip i.fa,.section_header_container .section_header .section_action_container.right i,.section_header_container .section_header .section_action_container.right_40 i,.section_header_container .section_header .section_action_container.section_action_btn i.align_right,.tip i.fa,.tip-subtle i.fa{padding-right:0}.section_header_container .section_header .section_action_container.right_40{float:right;width:40%;text-align:right}.section_header_container .section_header .section_action_container.right_60{float:right;width:60%;text-align:right}.section_header_container .section_header .section_action_container.right_60 button,.section_header_container .section_header .section_action_container.right_wide button{margin-left:7px}.section_header_container .section_header .section_action_container.right_wide{float:right;width:75%;text-align:right}.section_header_container .section_header .section_action_container.section_action_btn{padding:0}.section_content_container .section_content .table_list_container table td.is_aligned_left,.section_content_container .section_content .table_list_container table th.is_aligned_left,.section_content_container .section_content .table_list_container table th.sub_head .btn-group ul.uib-dropdown-menu li,.section_header_container .section_header .section_action_container.section_action_btn .uib-dropdown-menu{text-align:left}.section_bottom_container i,.section_header_container .section_header .section_action_container.section_action_btn i{padding-right:8px}.section_header_container .section_header .section_action_container .check_action{display:inline-block}.section_header_container .section_header .section_action_container .check_action input[type=checkbox]{margin-right:10px}.section_header_container .section_header .section_action_container .check_action .btn-group ul.dropdown-menu li .dropdown_menu_title{display:block;padding:3px 20px;clear:both;font-weight:700;white-space:nowrap}.section_content_container .section_content .table_list_container table th.sub_head .btn-group ul.uib-dropdown-menu li a,.section_header_container .section_header .section_action_container .check_action .btn-group ul.dropdown-menu li a{color:#428bca}.section_content_container .section_content .jumbotron .home_hero_content_container .btn,.section_content_container.has_top_margin{margin-top:20px}.section_content_container .section_content.with_padding{padding-top:0;padding-left:20px;padding-right:20px}.section_content_container .section_content h3{font-size:14px;font-weight:700;margin-top:26px;margin-bottom:6px}.section_content_container .section_content .content_block{padding:20px 30px 30px 72px}.section_content_container .section_content .content_block h1{font-weight:700;font-size:44px}.section_content_container .section_content .home_jump_nav_container{position:relative}.section_content_container .section_content .home_jump_nav_container .home_jump_nav{margin:0 auto;padding:0 10%;position:relative;overflow:auto;text-align:center}.section_content_container .section_content .home_jump_nav_container .home_jump_nav a{width:25%;position:relative;overflow:auto;float:left;display:block;padding:20px;font-size:18px;text-decoration:none}#nav-inventory span,.section_content_container .section_content .home_jump_nav_container .home_jump_nav a i{padding-right:12px}.section_content_container .section_content .home_jump_nav_container .home_jump_nav a:hover{background-color:#eee;text-decoration:none}.section_content_container .section_content .jumbotron{background:url(../images/kc_2.jpg) no-repeat;height:402px;margin-bottom:0;padding:30px 10%;color:#fff}.section_content_container .section_content .jumbotron .home_hero_content_container{background-color:rgba(20,20,50,.3);margin:0 18% 0 0;padding:30px;border-radius:10px}.section_content_container .section_content .jumbotron .home_hero_content_container h1{font-weight:700;margin-top:0;color:#fff}.section_content_container .section_content .jumbotron p,.section_content_container .section_content .table_list_container table.has_no_btm_margin{margin-bottom:0}.section_content_container .section_content .whats_new_container{padding:0 10%}.section_content_container .section_content .whats_new_container .whats_new h2{font-weight:700;margin:0;padding:20px 0;text-align:center;border-bottom:1px solid #eee}.section_content_container .section_content .whats_new_container .whats_new .content_col{margin-top:10px}.section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header{position:relative;overflow:auto}.section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_left{position:relative;float:left}.section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_left i{padding-top:7px;padding-right:10px;font-size:48px}.section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_left i.fa-cloud-upload{color:#6aa3d5}.section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_left i.fa-exchange{color:#cc80ff}.section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_left i.fa-check-square{color:#9bd772}.section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_right h3{font-size:20px;font-weight:700}.section_content_container .section_content .whats_new_container .whats_new .content_col .copy{clear:both;padding:5px 30px 0 0;font-size:16px}.section_content_container .section_content .section_form_container{padding-top:15px;padding-left:15px}.section_content_container .section_content .vert_table_scroll_container{height:400px;overflow-y:scroll;border-bottom:1px solid #ccc;background:url(../images/bg_first_td.png) repeat-x top center}.section_content_container .section_content .table_list_container.has_borders{border-left:1px solid #ccc;border-right:1px solid #ccc}.section_content_container .section_content .table_list_container.remove_buildings_table{width:100%}.section_content_container .section_content .table_list_container table{margin-bottom:10px}.section_content_container .section_content .table_list_container table.resizable{max-width:none;min-width:100%}.section_content_container .section_content .table_list_container table.fixed-layout{table-layout:fixed}.section_content_container .section_content .table_list_container table th{font-family:"PT Sans Narrow","Helvetica Neue",Helvetica,Arial,sans-serif;white-space:nowrap;padding:6px 10px 5px;text-transform:uppercase;background:#cdcdcd;text-shadow:0 1px 0 #fff;border-bottom:1px solid #b3b3b3;border-right:1px solid #b3b3b3}.section_content_container .section_content .table_list_container table td{font-family:"PT Sans Narrow","Helvetica Neue",Helvetica,Arial,sans-serif;white-space:nowrap;padding:6px 10px 5px;border-right:1px solid #ccc;border-top:none;border-bottom:1px solid #e7e7e7;vertical-align:middle}.section_content_container .section_content .table_list_container table td.is_aligned_right,.section_content_container .section_content .table_list_container table th.is_aligned_right{text-align:right}.section_content_container .section_content .table_list_container table td.is_aligned_center,.section_content_container .section_content .table_list_container table th.is_aligned_center{text-align:center}.section_content_container .section_content .table_list_container table td.whitespace,.section_content_container .section_content .table_list_container table th.whitespace{white-space:normal}.section_content_container .section_content .table_list_container table td.check,.section_content_container .section_content .table_list_container table th.check{width:33px}.section_content_container .section_content .table_list_container table td.has_no_padding,.section_content_container .section_content .table_list_container table td.is_master,.section_content_container .section_content .table_list_container table td.is_not_master,.section_content_container .section_content .table_list_container table th.has_no_padding{padding:0}.section_content_container .section_content .table_list_container table td .subtitle,.section_content_container .section_content .table_list_container table th .subtitle{color:#7b7b87}.section_content_container .section_content .table_list_container table td.compliance-check .checkbox,.section_content_container .section_content .table_list_container table th.compliance-check .checkbox{margin-top:0;margin-bottom:0;min-height:0}.section_content_container .section_content .table_list_container table th.is_master a{border-left:3px solid #66b132;display:block;color:#222;text-decoration:none}.section_content_container .section_content .table_list_container table td.is_master a{border-left:3px solid #66b132;display:block;padding:12px 10px;color:#222;text-decoration:none}.section_content_container .section_content .table_list_container table td.is_master a:hover,.section_content_container .section_content .table_list_container table th.is_master a:hover{color:#000}.section_content_container .section_content .table_list_container table th.is_not_master a{display:block;text-decoration:none}.section_content_container .section_content .table_list_container table td.is_not_master a{color:#b3b3b3;padding:12px 10px;display:block;text-decoration:none}.section_content_container .section_content .table_list_container table td.is_not_master a:hover,.section_content_container .section_content .table_list_container table th.is_not_master a:hover{border-left:3px solid #999;color:#000}.section_content_container .section_content .table_list_container table th.ellipsis{max-width:80px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.section_content_container .section_content .table_list_container table th.ellipsis-resizable{min-width:80px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.section_content_container .section_content .table_list_container table th.sorted{position:relative;white-space:nowrap;background:#428bca;border-bottom:1px solid #428bca;border-right:1px solid #428bca;color:#fff;text-shadow:none}.section_content_container .section_content .table_list_container table th.sorted .subtitle{color:#b9d4ec}.section_content_container .section_content .table_list_container table th.sort_asc:after{position:absolute;font-family:FontAwesome;top:7px;right:7px;content:"\f0dd"}.section_content_container .section_content .table_list_container table th.sort_desc:after{position:absolute;font-family:FontAwesome;top:7px;right:7px;content:"\f0de"}.section_content_container .section_content .table_list_container table th.sub_head{background:#e1e1e1;font-weight:400}.section_content_container .section_content .table_list_container table th.sub_head .col-xs-6{padding-right:0;padding-left:0}.section_content_container .section_content .table_list_container table th.sub_head .active{background-color:#fff7d7}.section_content_container .section_content .table_list_container table th.sub_head .btn-group{text-transform:capitalize}.section_content_container .section_content .table_list_container table th.sub_head.sub_org{padding-left:30px;border-left:none;border-right:none;border-bottom:1px solid #eee;text-transform:none;background-color:#fff}.section_content_container .section_content .table_list_container table th.sub_head.sub_org.right{text-align:right;padding-right:10px}.section_content_container .section_content .table_list_container table td.account_org.right a,.section_content_container .section_content .table_list_container table th.sub_head.sub_org.right a{visibility:hidden;padding:0 10px}.section_content_container .section_content .table_list_container table td.account_org.right i.fa-cog,.section_content_container .section_content .table_list_container table th.sub_head.sub_org.right i.fa-cog{color:#ccc}.section_content_container .section_content .table_list_container table td.account_org.right:hover a,.section_content_container .section_content .table_list_container table th.sub_head.sub_org.right:hover a{visibility:visible}.section_content_container .section_content .table_list_container table td.account_org.right:hover i.fa-cog,.section_content_container .section_content .table_list_container table th.sub_head.sub_org.right:hover i.fa-cog{color:#4a4a52}.section_content_container .section_content .table_list_container table th.source_data{background-color:#7b7b87;color:#fff;text-shadow:none;border:none;font-size:18px;text-align:left;text-transform:none;border-radius:6px 6px 0 0}.section_content_container .section_content .table_list_container table th.source_data.blank{background-color:#fff;border-bottom:none;border-right:none;border-radius:0}.section_content_container .section_content .table_list_container table th.source_data select{color:#222;font-weight:400}.section_content_container .section_content .table_list_container table th.mid_column{background-color:#fff;border-top:none;border-right:none;padding:0 4px}.section_content_container .section_content .table_list_container table th.mid_column div{padding:5px;background-color:#7b7b87;color:#fff;text-shadow:none;border-radius:6px 6px 0 0}.section_content_container .section_content .table_list_container table th input{font-weight:400;min-width:50px}.section_content_container .section_content .table_list_container table th.is_master,.section_content_container .section_content .table_list_container table th.is_not_master{padding:0}.section_content_container .section_content .table_list_container table th.is_master a{padding:6px 10px 5px}.section_content_container .section_content .table_list_container table th.is_not_master a{padding:6px 10px 5px;color:#666}.section_content_container .section_content .table_list_container table th.account_pending{background-color:#fcf8e3;border-bottom:1px solid #ccc}.section_content_container .section_content .table_list_container table th.account_pending.left{border-right:none}.section_content_container .section_content .table_list_container table th.condensed_head{min-width:70px;white-space:normal;text-align:center}.section_content_container .section_content .table_list_container table td .progress{margin-bottom:0}.section_content_container .section_content .table_list_container table td .table_name_link{float:left}.section_content_container .section_content .table_list_container table td .table_action_link{float:right;padding:0 4px}.section_content_container .section_content .table_list_container table td label.checkbox_fill_area{display:block;cursor:pointer;padding:6px 0 0}.section_content_container .section_content .table_list_container table td.parent_org{font-size:18px}.section_content_container .section_content .table_list_container table td.account_org{padding-left:20px;border-right:none}.section_content_container .section_content .table_list_container table td.account_org.left{padding-left:40px}.section_content_container .section_content .table_list_container table td.account_org.right{text-align:right}.section_content_container .section_content .table_list_container table td.account_pending,div.table_list_container.matching tr td,div.table_list_container.matching_detail tr td{background-color:#fff}.section_content_container .section_content .table_list_container table td.account_pending.left{border-right:none;font-weight:400!important}.section_content_container .section_content .table_list_container table td.align_to_top{vertical-align:top}.section_content_container .section_content .table_list_container table td.note label{margin-right:2px}.section_content_container .section_content .table_list_container table td.note i{padding-right:2px}.section_content_container .section_content .table_list_container table td.note a.note_edit{padding-left:2px}.section_content_container .section_content .table_list_container table td.ellipsis{max-width:80px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.section_content_container .section_content .table_list_container table.sortable th{cursor:pointer}.section_content_container .section_content .table_list_container table.sortable th::selection{background:0 0}.section_content_container .section_content .table_list_container table.sortable th::-moz-selection{background:0 0}.section_content_container .section_content .table_list_container .table_highlight_first tbody tr td:nth-child(1){font-weight:700;width:20%;min-width:280px}.section_content_container .section_content .table_list_container .table_highlight_first tbody tr td:nth-child(1).has_no_min_width{min-width:0}.section_content_container .section_content .table_list_container .table-striped tbody tr:nth-child(odd) td.sorted{background:#f3f3f3}.section_content_container .section_content .table_list_container .table-striped tbody tr:nth-child(even) td.sorted{background:#fafafa}.section_content_container .section_content .table_list_container .table-striped tbody tr td h3{font-weight:400;font-size:20px;margin:10px 0}.section_content_container .section_content .table_list_container .table-striped tbody tr td:last-child,.section_content_container .section_content .table_list_container .table-striped thead tr th:last-child{border-right:none}.section_content_container .section_content .table_list_container .table-striped tbody tr td.high_confidence{background-color:#66b132}.section_content_container .section_content .table_list_container .table-striped tbody tr td.med_confidence{background-color:#ffc40d}.section_content_container .section_content .table_list_container .table-striped tbody tr td.low_confidence{background-color:#ff4d4d}.section_content_container .section_content .table_list_container.table_scroll{overflow-x:scroll;overflow-y:visible;margin-left:24.9%}.section_content_container .section_content .table_list_container.table_scroll table{border-collapse:separate}.section_content_container .section_content .table_list_container.table_scroll table td,.section_content_container .section_content .table_list_container.table_scroll table th{overflow:hidden}.section_content_container .section_content .table_list_container.table_scroll table .sub_head .check_row{height:49px}.section_content_container .section_content .table_list_container.table_scroll .table-striped tbody tr td:nth-child(1),.section_content_container .section_content .table_list_container.table_scroll .table-striped thead tr th:nth-child(1){position:absolute;top:auto;left:0;width:5%}.section_content_container .section_content .table_list_container.table_scroll .table-striped tbody tr td:nth-child(2),.section_content_container .section_content .table_list_container.table_scroll .table-striped thead tr th:nth-child(2){position:absolute;top:auto;left:5%;width:8%}.section_content_container .section_content .table_list_container.table_scroll .table-striped tbody tr td:nth-child(3),.section_content_container .section_content .table_list_container.table_scroll .table-striped thead tr th:nth-child(3){position:absolute;top:auto;left:13%;width:12%}.section_content_container .section_content .table_list_container.dataset_list{overflow-x:auto}.section_content_container .section_content .table_list_container.dataset_list .delete_link,.section_content_container .section_content .table_list_container.dataset_list .replace_file_button{float:right}.section_content_container .section_content .table_list_container.worksheet td.sub_head{background-color:#f7f6ef;border-right:none;color:#9595a0}.section_content_container .section_content .table_list_container.worksheet .data_file_name{padding:0 20px}.section_content_container .section_content .table_list_container.worksheet .table-striped tbody tr td:nth-child(1),.section_content_container .section_content .table_list_container.worksheet .table-striped thead tr th:nth-child(1){border-right:none}.section_content_container .section_content .table_list_container.worksheet .table-striped tbody tr td:nth-child(2),.section_content_container .section_content .table_list_container.worksheet .table-striped thead tr th:nth-child(2){text-align:right}.section_content_container .section_content .table_list_container.worksheet .table-striped tbody tr td:nth-child(2) .btn-group,.section_content_container .section_content .table_list_container.worksheet .table-striped thead tr th:nth-child(2) .btn-group{float:right}.section_content_container .section_content .table_list_container.worksheet i.fa-check,.section_content_container .section_content .table_list_container.worksheet i.fa-check-circle{text-decoration:none;color:#66b132}.section_content_container .section_content .table_list_container.mapping select option{word-spacing:normal}.section_content_container .section_content .table_list_container.mapping tr.concat_parent{background-color:#f5f4ec}.section_content_container .section_content .table_list_container.mapping tr.concat_parent td{color:rgba(0,0,0,.5)}.section_content_container .section_content .table_list_container.mapping tr.concat_parent td:nth-child(1){background-color:#fff}.section_content_container .section_content .table_list_container.matching_detail .table-striped tbody tr.info td,.section_content_container .section_content .table_list_container.matching_detail .table-striped tbody tr.success td{font-weight:700}.section_content_container .section_content .table_list_container.matching_detail td.potential_matches{color:#6e6e7a}.section_content_container .section_content .table_list_container.matching_detail td.potential_matches span{padding:0 5px}.section_content_container .section_content .table_footer{position:relative;overflow:auto;padding-bottom:20px}.section_content_container .section_content .table_footer .counts{float:left;text-align:center;margin-top:17px}.section_content_container .section_content .table_footer .display_number_entries{position:relative;margin-top:10px}.section_content_container .section_content .table_footer .display_number_entries .display_number_entries_text{margin:7px 5px 0;float:left}.section_content_container .section_content .table_footer .display_number_entries .display_number_entries_select{margin-top:3px;float:left}.section_content_container .section_content .table_footer .pager_container{float:right;margin-top:10px;text-align:right}.section_content_container .section_content .table_footer .pager_container ul.pager,.section_content_container .section_content .table_footer .pager_container ul.pagination{float:right;margin:0}.section_content_container .section_content .table_footer .pager_container ul.pager li.disabled,.section_content_container .section_content .table_footer .pager_container ul.pagination li.disabled{cursor:not-allowed}.section_content_container .section_content .table_footer .pager_container ul.pager li.disabled>a,.section_content_container .section_content .table_footer .pager_container ul.pagination li.disabled>a{pointer-events:none}.section_content_container .section_content .table_footer .table_footer_right{float:right;margin-top:10px}.section_content_container .section_content .table_footer.has_no_padding{padding:0}.section_bottom_container{padding:5px 0;margin:0 auto;overflow:auto}.badge_menu{background-color:#4a4a52}.qq-drop-processing{display:none}@media (min-width:1042px){.modal-lg{width:950px}}@media (min-width:1300px){.modal-lg{width:1230px}}.modal-header .close{margin-top:-14px;margin-right:-63px;padding:8px 11px;border-radius:20px;font-size:24px;background-color:#fff;opacity:1;font-weight:400;line-height:.5;color:#43434d}.modal-header .close:hover{color:#ff4d4d}.modal-header .modal-links{font-size:18px}#newCustomViewModal .modal-body,.modal-body.no_bottom_padding{padding-bottom:0}.modal-body .alert{margin-left:15px;margin-right:15px}.modal-body .form-group p{margin:0 0 8px;font-weight:700;font-size:14px}.modal-body .form-group .column_container{height:290px;overflow-x:scroll}.modal-body .form-group ul.column{padding-left:0;list-style-type:none}.modal-body .form-group .checkbox{margin-bottom:6px;padding-left:26px;padding-top:6px;padding-bottom:6px;background-color:#eee;border-radius:5px}.modal-body .form-group .checkbox.complianceCheckbox{padding-top:0;padding-left:20px;background-color:#fff}.modal-body .form-group table th label{margin-left:6px}.modal-body .form-group table th .search-icon{float:right;position:relative;top:21px;right:8px}.modal-body .form-group_faux_horizontal{padding-left:0}.modal-footer div.row{margin-top:20px;margin-bottom:20px;padding-left:15px;padding-right:15px}.modal-footer div.row button{float:none}.modal-footer .btn{min-width:90px}.inset_badge{padding:0}.badge.left{padding:0 0 0 7px}.badge.right{margin-left:3px}.badge.to_do,.badge.to_do .left{background-color:#90f}.badge.to_do .right{background-color:#b84dff}.badge.done,.badge.done .left,.badge.high_confidence{background-color:#66b132}.badge.done .right{background-color:#8dd25e}.badge.high_confidence .left{background-color:#66b132}.badge.high_confidence .right{background-color:#8dd25e}.badge.med_confidence,.badge.med_confidence .left{background-color:#ffc40d}.badge.med_confidence .right{background-color:#ffd75a}.badge.low_confidence,.badge.low_confidence .left{background-color:#ff4d4d}.badge.low_confidence .right{background-color:#ff9a9a}.matchmaking{color:#000;padding-left:10px}.is_underlined{text-decoration:underline}div[sd-uploader][disabled]{pointer-events:none}div[sd-uploader][disabled] .qq-upload-button{opacity:.3}.qq-upload-button{font-weight:700}.alert .alert_instructions{font-size:14px;margin-bottom:13px}.tcm_field{min-width:165px}.progress_bar_container.progressbar_fill_area{padding:100px 25%}.progress_bar_container .progress_bar_copy_top{padding:0 0 5px 5px}.progress_bar_container .progress{margin-bottom:0}.progress_bar_container .progress_bar_copy_bottom{padding:5px 0 0 5px}.btn-sm,.btn-xs{font-size:13px}.table_header_persistent .table{margin-bottom:0}.table_body_persistent,.table_header_persistent .table thead>tr>th{border-bottom:1px solid #ccc}.table_body_persistent{position:relative;height:205px;overflow-y:scroll;border-right:1px solid #ccc;border-left:1px solid #ccc}.tbody-striped>tbody:nth-child(odd) td,.tbody-striped>tbody:nth-child(odd)>th{background-color:#f9f9f9}.data-quality-error td:last-child{background-color:#ffb7b7!important}.data-quality-warning td:last-child{background-color:#fdf4bf!important}select.error-bg{background-color:#ffb7b7}select.warning-bg{background-color:#fdf4bf}select>option{background-color:#f7f7f7}.export_radio .radio-inline input[type=radio],.form-group .matching_toggle .radio-inline input[type=radio]{margin-top:2px}.input-sm{font-size:13px}.form-group .matching_toggle label{font-size:14px}.number_unmatched{color:rgba(34,34,34,.5)}.important-tip,.tip,.tip-subtle{position:relative}.tip:before{font-size:18px;-webkit-transform:rotate(-5deg) translateX(-25px) translateY(-25px);content:'Tip!';line-height:24px;left:-26px;top:0;box-shadow:0 2px 4px rgba(0,0,0,.2)}.important-tip:before,.tip-subtle:before,.tip:before{padding:4px 8px;background:#5bc0de;color:#fff;position:absolute;border-radius:6px}.important-tip:before{-webkit-transform:rotate(-5deg) translateX(-25px) translateY(-25px);box-shadow:0 2px 4px rgba(0,0,0,.2);font-size:18px;line-height:24px;left:-26px}.tip-subtle{margin-top:5px;margin-left:35px;margin-bottom:0;color:#999}.tip-subtle:before{font-size:12px;font-family:FontAwesome;content:'\f129';line-height:12px;left:-30px;top:0}.important-tip:before{top:-10px;background:#ff4d4d;content:'Important!'}.ignored_row td,.pm_import small{color:#999}.footer{margin-top:100px;padding:30px 5%;width:100%;position:relative;border-top:1px solid #ccc}.footer table{width:100%;overflow:hidden;text-align:center}.footer table td{width:33.333%}.footer .row .col-md-4{text-align:center;background-color:gray}.green_button .btn-primary{background-color:#66b132;border-color:#5b9d2c}.green_button .btn-primary:hover{background-color:#5b9d2c}.orange_button .btn-primary{background-color:#fc882a;border-color:#fc7a11}.orange_button .btn-primary:hover{background-color:#fc7a11}.ui-sortable .ui-sortable-handle{cursor:move}.building-reports .chart-inputs{padding:10px;border-radius:.5em;background-color:#d8e3ed}.building-reports .chart-inputs label{margin-right:5px;color:#222}.building-reports .chart-inputs .form-group{margin-left:20px}.building-reports .chart-inputs .input-group{display:inline-table;vertical-align:middle}.building-reports .chart-inputs .input-group .form-control,.building-reports .chart-inputs .input-group .input-group-addon,.building-reports .chart-inputs .input-group .input-group-btn{width:auto!important;max-width:120px}.building-reports .status-message{position:absolute;top:50%;left:50%;margin:-30px 0 0 -60px;text-align:center;width:120px;padding-top:10px;padding-bottom:10px;background-color:#fff;border:1px solid #f1f1f1;border-radius:5px}.building-reports .chart-holder{border-radius:.5em;background-color:#f6f6f6;border:1px solid #f6f6f6;position:relative}.building-reports .reportingTableHolder{margin-top:20px;padding:0 60px 0 105px}.building-reports .progress{margin:5px 10px 0}.tree-node{border:1px solid #dae2ea;background:#f8faff;color:#7c9eb2}.tree-node-content{margin:10px}.fa-arrows{padding-right:7px;color:#444}.tree-handle{padding:10px;background:#428bca;color:#fff;margin-right:10px}.angular-ui-tree-placeholder{background:#f0f9ff;border:2px dashed #bed2db;box-sizing:border-box}.newLabelInput{margin:20px 0;border:1px solid #eee;padding:10px 10px 5px;border-radius:5px;background-color:#f1f1f1}#label_admin .table_list_container{border:1px solid #cdcdcd}#label_admin .sectionLabel,#label_admin .tableHeader{font-family:"PT Sans Narrow","Helvetica Neue",Helvetica,Arial,sans-serif}#label_admin .tableHeader{white-space:nowrap;padding:6px 10px 5px;text-transform:uppercase;background-color:#cdcdcd!important;text-shadow:0 1px 0 #fff;border-bottom:1px solid #b3b3b3}#cycle_admin form[editable-form]>div,#label_admin form[editable-form]>div{margin:10px 0}#label_admin .editable-wrap{width:100%}.label-edit-section{margin:5px 10px 10px 20px}.label-edit-section .label-action,.label-edit-section .label-container{display:inline-block}.cycle-edit-section .cycle-action .label-edit-text,.cycle-edit-section .cycle-action a,.label-edit-section .label-action .label-edit-text,.label-edit-section .label-action a{margin-right:20px}.label-edit-section .label{padding:.6em .6em .5em;display:inline-block;margin-bottom:5px}.label{margin-right:5px}#update-building-labels-modal .labels-status-msg{min-height:150px;display:-ms-flexbox;display:flex;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}#update-building-labels-modal .add_text,#update-building-labels-modal .edit_text{font-weight:700;margin-bottom:5px}#update-building-labels-modal .edit_text{margin-left:10px}#update-building-labels-modal .add-label-row{margin-right:-5px;margin-bottom:20px}#update-building-labels-modal .btn-default{min-width:70px}#update-building-labels-modal .table-list-container{border:1px solid #eee;overflow-y:auto;max-height:350px;margin-bottom:10px}#update-building-labels-modal .table-list-container td,#update-building-labels-modal .table-list-container th,#update-property-labels-modal .table-list-container td,#update-property-labels-modal .table-list-container th{border:0}#cycle_admin .newCycleInput{margin:20px 0;border:1px solid #eee;padding:10px 10px 5px;border-radius:5px;background-color:#f1f1f1}#cycle_admin .table_list_container{border:1px solid #cdcdcd}#cycle_admin .sectionCycle,#cycle_admin .tableHeader{font-family:"PT Sans Narrow","Helvetica Neue",Helvetica,Arial,sans-serif}#cycle_admin .tableHeader{white-space:nowrap;padding:6px 10px 5px;text-transform:uppercase;background-color:#cdcdcd!important;text-shadow:0 1px 0 #fff;border-bottom:1px solid #b3b3b3}#cycle_admin .editable-wrap,.filter-row input,.pairing-container-2 .pairing-header>div input,.pm_import select{width:100%}.cycle-edit-section{margin:5px 10px 10px 20px}.cycle-edit-section .cycle-action,.cycle-edit-section .cycle-container{display:inline-block}.cycle-edit-section .cycle{padding:.6em .6em .5em;display:inline-block;margin-bottom:5px}#update-property-labels-modal .labels-status-msg{min-height:150px;display:-ms-flexbox;display:flex;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}#update-property-labels-modal .add_text,#update-property-labels-modal .edit_text{font-weight:700;margin-bottom:5px}#update-property-labels-modal .edit_text{margin-left:10px}#update-property-labels-modal .add-label-row{margin-right:-5px;margin-bottom:20px}#update-property-labels-modal .btn-default{min-width:70px}#update-property-labels-modal .table-list-container{border:1px solid #eee;overflow-y:auto;max-height:350px;margin-bottom:10px}tags-input .tags{min-width:550px}.tag-primary{border-color:#428bca!important;background:#428bca!important}.tag-success{border-color:#5cb85c!important;background:#5cb85c!important}.tag-info{border-color:#5bc0de!important;background:#5bc0de!important}.tag-warning{border-color:#f0ad4e!important;background:#f0ad4e!important}.tag-danger{border-color:#d43f3a!important;background:#d43f3a!important}gs-input .tags .tag-item .remove-button{color:#fff}.ui-notification{background-color:#eee;color:#000;border-left:thick solid #428bca}.ui-notification.warning{border-left:thick solid #fcf8e3}.ui-notification.error{border-left:thick solid #f2dede}.ui-notification.success{border-left:thick solid #dff0d8}.ui-notification.info{border-left:thick solid #d9edf7}.ui-notification:hover{opacity:.7}.inventory-list-controls{padding:20px 10px}.inventory-list-controls .form-group{margin-right:20px;margin-bottom:0}.inventory-list-controls+.buildingListControls{padding-top:0}#building-fields{min-width:275px}.glyphicon.spinning{animation:spin 1s infinite linear;-webkit-animation:spin2 1s infinite linear}@keyframes spin{0%{transform:scale(1) rotate(0deg)}to{transform:scale(1) rotate(360deg)}}.inventory-list-tab-container{margin-left:10px;margin-bottom:-2px}.matching-tab-container{margin-left:10px;margin-bottom:-1px}.inventory-list-tab-container .item-count,.matching-tab-container .item-count{float:right;margin-right:20px;margin-top:10px}.inventory-list-tab-container .nav-tabs,.matching-tab-container .nav-tabs{position:relative;margin-bottom:-2px;z-index:99}.data-quality-tab-container .nav-tabs>li,.inventory-list-tab-container .nav-tabs>li,.matching-tab-container .nav-tabs>li{margin-right:4px}.inventory-list-tab-container .nav-tabs>li>a{background-color:#d6d6d6;border:1px solid #bbb;color:#222;border-radius:6px 6px 0 0}.matching-tab-container .nav-tabs>li>a{color:#222;border-radius:6px 6px 0 0}.inventory-list-tab-container .nav-tabs>li>a:hover,.matching-tab-container .nav-tabs>li>a:hover{background-color:#428bca;color:#fff}.inventory-list-tab-container .nav-tabs>li.active>a,.inventory-list-tab-container .nav-tabs>li.active>a:hover{background-color:#f1f1f1;border:1px solid #d1d1d1;font-weight:700;color:#000;border-bottom:1px solid #f1f1f1}.matching-tab-container .nav-tabs{border-bottom:0}.data-quality-tab-container .nav-tabs>li>a,.matching-tab-container .nav-tabs>li>a{background-color:#f1f1f1;border:1px solid #d1d1d1;border-bottom:0}.matching-tab-container .nav-tabs>li.active>a,.matching-tab-container .nav-tabs>li.active>a:hover{background-color:#7b7b87;border:1px solid #d1d1d1;border-bottom:1px solid #7b7b87;color:#fff;font-weight:700}.matching-detail-container{padding:0 0 15px 15px}.matching-detail-container .paginate{padding:5px 15px 0}.data-quality-tab-container{margin-bottom:0}.data-quality-tab-container .nav-tabs{border-bottom:0}.data-quality-tab-container .nav-tabs>li>a{color:#222}.data-quality-tab-container .nav-tabs>li>a:hover{background-color:#428bca;color:#fff}.data-quality-tab-container .nav-tabs>li.active>a,.data-quality-tab-container .nav-tabs>li.active>a:hover{background-color:#cdcdcd;border:1px solid #d1d1d1;border-bottom:0;color:#000;font-weight:700}.table_item_detail{margin:0 10px;border:1px solid #f1f1f1}.table_item_detail td{overflow:hidden;text-overflow:ellipsis}.highlight{background-color:#fff7d7}#swagger-frame{height:calc(100vh - 60px);width:100%}.ui-grid-top-panel{background:#f1f1f1;filter:none}.ui-grid-row-header-link{height:30px;width:30px}.ui-grid-row:not(:last-child) .ui-grid-row-header-link{border-bottom:solid 1px #d4d4d4}.ui-grid-cell-contents{font-weight:400}.notes-button i.fa.text-muted,.ui-grid-cell-contents.pinnable[disabled]{color:#222;opacity:.1}.ui-grid-row:nth-child(odd) .ui-grid-cell .inventory-settings-cell::after{color:#d7d7d7}.ui-grid-row:nth-child(even) .ui-grid-cell .inventory-settings-cell::after{color:#cbcbcb}.ui-grid-row.ui-grid-row-selected:nth-child(odd)>[ui-grid-row]>.ui-grid-cell,.ui-grid-row:nth-child(odd) .ui-grid-cell,.ui-grid-row:nth-child(odd):hover .ui-grid-cell{background-color:#fdfdfd}.ui-grid-row.ui-grid-row-selected:nth-child(even)>[ui-grid-row]>.ui-grid-cell,.ui-grid-row:nth-child(even) .ui-grid-cell,.ui-grid-row:nth-child(even):hover .ui-grid-cell{background-color:#f3f3f3}.inventory-settings-cell::after{content:attr(data-after-content);float:right;opacity:0;transition:opacity .25s ease-in-out}.inventory-settings-cell:hover::after{opacity:1}#nav-inventory span>svg{height:18px}#nav-inventory span>svg path{fill:#337ab7}#nav-inventory:hover span>svg path{fill:#23527c}.ui-grid-draggable-row-target{opacity:.5!important}.ui-grid-draggable-row{cursor:-webkit-grab;cursor:grab;height:30px}.ui-grid-draggable-row-over{position:relative}.ui-grid-draggable-row-over:before{content:"";display:block;position:absolute;left:0;width:100%;border-bottom:2px dashed #aaa}.ui-grid-draggable-row-over--above:before{top:0}.ui-grid-draggable-row-over--below:before{bottom:0}#inventory-actions-dropdown li,#inventory-detail-edit li{cursor:default}#inventory-actions-dropdown a[disabled],#inventory-detail-edit a[disabled]{color:gray;pointer-events:none}#inventory-detail-buttons a[disabled],table.import_results a[disabled]{pointer-events:none}.pairing{padding-bottom:20px}.pairing-data-row{border-bottom:2px solid #e0e0e0}.pairing-data-row,.pairing-headers-row{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:100%;border-collapse:collapse}.pairing-container-2 .pairing-header .is-paired-child,.pairing-data-row .is-paired-child,.pairing-headers-row .is-paired-child{width:10%}.pairing-data-row:nth-child(even){background-color:#fdfdfd}.pairing-data-row:nth-child(odd){background-color:#f3f3f3}.pairing-data-row-indent{display:-ms-flexbox;display:flex;display:-webkit-flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-positive:0;flex-grow:0;-webkit-flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-wrap:wrap;width:100%;padding-left:40px;padding-right:15px;border-collapse:collapse;color:#a0a0a0}.pairing-data-row-indent .unpaired{width:100%;color:#87cefa}.grab-pairing-left{cursor:-webkit-grab;cursor:grab}.unpair-child{cursor:pointer;color:#428bca}.unpair-child>span{font-size:20px;line-height:10px;position:relative}.pairing-child{width:100%;min-height:15px}.pairing-headers-row{background-color:#e0e0e0;border-bottom:2px solid #a0a0a0}.pairing-container{border:1px solid #a0a0a0;overflow-x:hidden}.pairing-rows{max-height:600px;overflow-y:scroll}.pairing-list-controls-full{margin-top:15px}.pairing-other-title{margin-top:40px}.pairing-cell,.pairing-data-row-col-indent{-ms-flex-positive:0;flex-grow:0}.pairing-cell{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.noselect{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#mapped-table td,div.table_list_container.matching td,div.table_list_container.matching_detail td{max-width:350px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div.table_list_container.matching td,div.table_list_container.matching th,div.table_list_container.matching_detail td,div.table_list_container.matching_detail th{height:34px;position:relative}div.table_list_container.matching tr:nth-of-type(odd) td,div.table_list_container.matching_detail tr:nth-of-type(odd) td{background-color:#f9f9f9}div.table_list_container.matching td.matching-link,div.table_list_container.matching th.matching-link,div.table_list_container.matching_detail td.matching-link,div.table_list_container.matching_detail th.matching-link{left:0;margin-top:1px;min-width:34px;padding:0;position:absolute;text-align:center;z-index:10}div.table_list_container.matching td.matching-link>a,div.table_list_container.matching th.matching-link>a,div.table_list_container.matching_detail td.matching-link>a,div.table_list_container.matching_detail th.matching-link>a{width:100%;height:100%;display:block;padding-top:8px}div.table_list_container.matching td.matching-link.column-row,div.table_list_container.matching th.matching-link.column-row,div.table_list_container.matching_detail td.matching-link.column-row,div.table_list_container.matching_detail th.matching-link.column-row{height:35px;margin:0}div.table_list_container.matching td.matching-link.sub_head,div.table_list_container.matching th.matching-link.sub_head,div.table_list_container.matching_detail td.matching-link.sub_head,div.table_list_container.matching_detail th.matching-link.sub_head{height:36px}div.table_list_container.matching td.matching-link+td,div.table_list_container.matching td.matching-link+th,div.table_list_container.matching th.matching-link+td,div.table_list_container.matching th.matching-link+th,div.table_list_container.matching_detail td.matching-link+td,div.table_list_container.matching_detail td.matching-link+th,div.table_list_container.matching_detail th.matching-link+td,div.table_list_container.matching_detail th.matching-link+th{padding-left:43px}#data-quality-admin-table tr.disabled{opacity:.4}#column-table input.ng-invalid-required{border-color:#dd2c00}.no-click{pointer-events:none}.arrow-down,.arrow-up{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;display:inline-block}.arrow-up{border-bottom:10px solid #000}.arrow-down{border-top:10px solid #000}.pairing .table_header_text{text-transform:uppercase;white-space:nowrap;text-shadow:0 1px 0 #fff;font-weight:700;padding:6px 2px 5px}.pairing .pairing-headers-row{padding:0}.pairing div.pairing-headers{padding:3px;border-left:1px solid #b3b3b3}.pairing div.pairing-headers:first-child{border-left:0}.pairing .data-slide{padding-left:6%}.pairing-data-row-col{min-width:200px;padding:2px;width:200px}.pairing-data-row-col-indent{width:30%}.disableable[disabled]{pointer-events:none;color:gray}.paginate{float:right;padding:0 15px;position:relative;z-index:100}.filter-unmatched .filter-unmatched-hide{display:none!important}.pairing-container-2{border:1px solid #a0a0a0;overflow-x:hidden}.pairing-container-2 .pairing-header{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow-x:hidden;width:100%;border-collapse:collapse;background-color:#e0e0e0;border-bottom:2px solid #a0a0a0}.pairing-container-2 .pairing-header>div{min-width:200px;width:200px}.pairing-container-2 .pairing-header>div.paired-column{min-width:60px;max-width:60px}.pairing-container-2 .pairing-header>div .title{font-weight:700;padding:6px 2px 5px;text-shadow:0 1px 0 #fff;text-transform:uppercase;white-space:nowrap}.pairing-container-2 .pairing-body{max-height:600px;overflow-y:scroll}.pairing-row,.right-pairing-container{display:table-row}.pairing-row:nth-child(even){background-color:#fdfdfd}.pairing-row:nth-child(odd){background-color:#f3f3f3}.pairing-row>div{border-bottom:1px solid #e0e0e0;border-top:1pt solid #e0e0e0;display:table-cell;max-width:200px;min-width:200px;overflow:hidden;padding:2px 2px 2px 10px;text-overflow:ellipsis;white-space:nowrap}.pairing-row>div.paired-column,.right-pairing-container .right-pairing-row>div.paired-column{max-width:45px;min-width:45px}.right-pairing-container:nth-child(even){background-color:#fdfdfd}.right-pairing-container:nth-child(odd){background-color:#f3f3f3}.right-pairing-container .right-pairing-row{display:table-row}.right-pairing-container .right-pairing-row>div{border-top:1px solid #e0e0e0;display:table-cell;max-width:200px;min-width:200px;overflow:hidden;padding:2px 2px 2px 10px;text-overflow:ellipsis;white-space:nowrap}.right-pairing-container .right-paired-row{color:#a0a0a0}.right-pairing-container .right-paired-row>div{display:table-row}.right-pairing-container .right-paired-row>div:last-child>div{border-bottom:1px solid #e0e0e0}.right-pairing-container .right-paired-row>div>div{border-top:2px solid transparent;display:table-cell;max-width:200px;min-width:200px;overflow:hidden;padding:2px 2px 2px 10px;text-overflow:ellipsis;white-space:nowrap}.right-pairing-container .right-paired-row>div>div.unpair-child{max-width:45px;min-width:45px}.right-pairing-container .right-paired-row .unpaired{color:#87cefa;overflow:visible;padding-left:40px;width:100%}.right-pairing-container .right-paired-row .unpaired .pairing-cell{overflow:visible}.merge-modal .modal-dialog{max-height:80vh;width:750px;max-width:85vw}.merge-modal .merge-grid .ui-grid-menu-button{height:28px}.pm_import [disabled]{pointer-events:none}.notes-button{font-size:9px;text-decoration:none!important}.notes-button i.fa{font-size:13px;padding-left:3px}.notes-button div{position:relative;text-align:right;top:-2px;width:20px}.settings_profile{padding-top:10px!important}.settings_profile select{display:inline-block;margin-left:20px;width:200px}.settings_profile button{margin-top:-5px;padding:4px 7px}.settings_profile button[disabled]{opacity:.25}.pink-bg{background-color:rgba(255,0,0,.07)}:not(.active) .typeahead-native{background-color:rgba(100,255,100,.15)}.upload-btn{display:block;font-weight:700}.lock{color:#444;padding-left:6px} -/*# sourceMappingURL=style.css.map */ diff --git a/seed/static/seed/css/style.css.map b/seed/static/seed/css/style.css.map deleted file mode 100644 index c1e1243287..0000000000 --- a/seed/static/seed/css/style.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["style.scss","style.css"],"names":[],"mappings":"AA2BA,kBACE,E,CACE,S,CAEF,E,CACE,S,CALJ,CA4CA,C,CACE,sB,CAGF,I,CACE,a,CAGF,M,CACE,a,CAGF,O,CACE,a,CAGF,S,CCpEE,O,CDoEF,e,CAAA,gB,CAGI,U,CACA,a,CACA,a,CALJ,e,CAQI,U,CA6BJ,gB,CACE,yB,CACA,iC,CACA,wB,CACA,gC,CACA,6B,CACA,2B,CA8BF,I,CACE,Q,CAEA,c,CACA,iC,CACA,kC,CACA,U,CAGF,G,CAAA,G,CAAA,G,CAAA,G,CAAA,G,CAAA,G,CATA,I,CASA,E,CAAA,E,CAAA,E,CAAA,E,CAAA,E,CAAA,E,CACE,iE,CAIF,a,CACE,c,CAGF,M,CACE,mB,CACA,c,CAGF,I,CACE,8B,CADF,qB,CAGI,qB,CACA,U,CAJJ,4B,CAOM,qB,CAKN,Q,CAwaA,qC,CAvaE,c,CAGF,I,CACE,W,CACA,a,CAGF,kB,CACE,yB,CACA,6B,CACA,6B,CACA,e,CAGF,Q,CACE,a,CACA,c,CACA,U,CACA,W,CACA,wB,CACA,kB,CACA,U,CACA,U,CARF,c,CAWI,Q,CACA,iB,CAZJ,+B,CAeM,sB,CAfN,oB,CAmBM,iB,CACA,e,CACA,a,CACA,Y,CACA,U,CACA,W,CACA,U,CACA,c,CACA,oB,CA3BN,0B,CA+BQ,U,CAIA,wB,CA9HN,uB,CA2FF,2B,CAwCQ,e,CACA,U,CACA,wB,CA1CR,0B,CA8CQ,iB,CACA,U,CACA,U,CACA,iB,CAjDR,sB,CAqDQ,c,CArDR,+B,CAyDQ,iB,CACA,O,CACA,Y,CACA,gB,CACA,a,CACA,wB,CACA,e,CACA,kB,CAhER,2B,CAoEQ,iB,CACA,Q,CACA,U,CAtER,uB,CA2EM,Q,CACA,U,CACA,wB,CA7EN,kB,CAkFI,a,CACA,U,CA9KF,c,CA2FF,yB,CAAA,6B,CAwFM,Y,CACA,iB,CAzFN,iB,CA+FI,W,CA1LF,c,CA2FF,wB,CAAA,4B,CAoGM,c,CACA,kB,CACA,c,CAIA,oB,CAKN,Q,CACE,U,CADF,iB,CAII,gB,CAJJ,wB,CAOM,iB,CAjNJ,c,CA0MF,sB,CAYM,gB,CAtNJ,c,CA0MF,yB,CAgBM,iB,CACA,U,CACA,W,CACA,4B,CAnBN,yC,CAAA,gD,CCvJgD,+C,CDgLxC,iB,CACA,U,CChL8C,6C,CD+K9C,iB,CAzBR,6D,CAgCU,a,CACA,c,CACA,sB,CACA,2B,CAnCV,+D,CA8dA,4D,CAxbY,c,CAtCZ,mE,CA2QA,4C,CAAA,2C,CAlOY,qB,CAzCZ,+C,CAkwCA,uC,CAq7BA,0B,CAtoEU,a,CAjDV,0D,CAoDY,W,CACA,2B,CACA,c,CACA,wE,CAEA,e,CACA,wB,CA1DZ,0E,CA6Dc,iE,CACA,e,CA9Dd,4E,CAAA,2E,CAkEc,a,CAlEd,2D,CA2EU,a,CACA,W,CACA,0B,CA7EV,6C,CA8dA,gG,CAAA,gG,CA5YQ,W,CAlFR,8E,CA1LE,oC,CA0LF,6D,CA8FY,sB,CACA,c,CACA,a,CACA,oC,CACA,e,CAlGZ,wE,CAAA,uE,CAAA,uE,CAuGc,qB,CAjSZ,oC,CA0LF,yE,CA8GY,iB,CA9GZ,oF,CAmHgB,Q,CAnHhB,4F,CAuHgB,a,CACA,c,CACA,U,CACA,e,CACA,iB,CA3HhB,8E,CA+HgB,wB,CACA,iB,CACA,a,CAjIhB,4E,CAyIc,W,CACA,wE,CACA,c,CACA,gB,CACA,mB,CA7Id,wE,CAgJc,6B,CACA,e,CACA,O,CACA,Y,CACA,e,CApJd,4E,CAuJgB,iB,CACA,S,CACA,Q,CAWhB,yBACE,qB,CACE,Y,CAFJ,CAMA,K,CACE,U,CACA,iB,CAFF,4B,CAKI,U,CACA,a,CANJ,yC,CASM,iB,CACA,W,CACA,4B,CAXN,gE,CAcQ,iB,CACA,U,CACA,qB,CAhBR,qE,CAmBU,U,CACA,S,CApBV,yE,CAoTA,wF,CAAA,mG,CA5Rc,iB,CAxBd,sE,CA8BU,W,CACA,S,CACA,gB,CAhCV,gF,CAoCU,yB,CApCV,mG,CAuCY,e,CAvCZ,6E,CA4CU,oB,CA5CV,qD,CAmDQ,iB,CACA,S,CACA,qB,CACA,U,CACA,iB,CACA,e,CACA,sB,CAzDR,wD,CA4DU,c,CACA,c,CACA,e,CACA,kB,CA/DV,kD,CAmEQ,iB,CACA,Q,CACA,S,CACA,U,CACA,W,CACA,Y,CACA,e,CACA,qB,CACA,qB,CACA,iB,CACA,sC,CACA,2B,CA9ER,gE,CAiFU,U,CACA,gB,CACA,kB,CACA,c,CACA,e,CACA,wB,CACA,U,CAvFV,iE,CA2JA,kF,CAjEU,gB,CAOV,sB,CACE,e,CACA,iB,CACA,4B,CAHF,mC,CAKI,iB,CACA,iB,CANJ,qC,CASM,oB,CACA,Y,CAWN,Q,CACE,U,CACA,a,CAGF,gB,CACE,iB,CAGF,sB,CACE,Y,CACA,c,CAFF,2B,CAYI,a,CACA,c,CACA,0B,CACA,2B,CACA,4B,CAhBJ,0C,CAoBM,0B,CApBN,wC,CAuBM,Y,CAKN,yB,CACE,iB,CACA,4B,CAFF,uC,CAKI,kB,CALJ,wC,CAQI,kB,CARJ,yC,CAWI,iB,CACA,sB,CAZJ,wD,CAeM,c,CAfN,qG,CAqBU,e,CArBV,sD,CA0BM,W,CA1BN,4D,CA6BM,e,CA7BN,4C,CAgCM,c,CACA,kB,CACA,c,CACA,e,CAnCN,2C,CAuCM,iB,CAvCN,iD,CA2CM,wB,CA3CN,mE,CA8CM,iB,CA9CN,wE,CAiDQ,U,CACA,S,CAlDR,2E,CAqDQ,U,CACA,S,CAtDR,6E,CAyDQ,U,CACA,S,CA1DR,0E,CA6DQ,U,CACA,e,CACA,iB,CACA,S,CAhER,uF,CAmEU,iB,CACA,wE,CACA,wB,CACA,e,CAtEV,yE,CA0EQ,W,CACA,S,CACA,gB,CAyoCR,mB,CArtCA,2E,CAAA,8E,CAAA,oG,CAqtCA,S,CAsBA,gB,CA5pCU,e,CA/EV,4E,CAmFQ,W,CACA,S,CACA,gB,CArFR,4E,CA4FQ,W,CACA,S,CACA,gB,CA9FR,mF,CAAA,qF,CAgGU,e,CAhGV,8E,CAoGQ,W,CACA,S,CACA,gB,CAtGR,sF,CA6GQ,S,CA4CR,0F,CAAA,0F,CAAA,sH,CAzJA,yG,CAgHU,e,CAqxBV,2B,CAr4BA,wF,CAoHU,iB,CApHV,iF,CA4HQ,oB,CA5HR,sG,CA+HU,iB,CA/HV,qI,CAwIgB,a,CACA,gB,CACA,U,CACA,e,CACA,kB,CAahB,wH,CAzJA,kH,CA+IgB,a,CAUhB,wF,CAAA,yC,CAGI,e,CAHJ,wD,CAQM,a,CACA,iB,CACA,kB,CAVN,8C,CAaM,c,CACA,e,CACA,e,CACA,iB,CAhBN,0D,CAmBM,2B,CAnBN,6D,CAsBQ,e,CACA,c,CAvBR,oE,CA+BM,iB,CA/BN,mF,CAkCQ,a,CACA,a,CACA,iB,CACA,a,CACA,iB,CAtCR,qF,CAyCU,S,CACA,iB,CACA,a,CACA,U,CACA,a,CACA,Y,CACA,c,CACA,oB,CAwvDV,mB,CAxyDA,uF,CAmDY,kB,CAnDZ,2F,CAuDY,qB,CACA,oB,CAxDZ,sD,CA8DM,4C,CACA,Y,CACA,e,CACA,gB,CACA,U,CAlEN,mF,CAqEQ,kC,CACA,gB,CACA,Y,CACA,kB,CAxER,sF,CA2EU,e,CACA,Y,CACA,U,CA7EV,wD,CAAA,yF,CAqFQ,e,CArFR,gE,CAyFM,a,CAzFN,8E,CA8FU,e,CACA,Q,CACA,c,CACA,iB,CACA,4B,CAlGV,wF,CAsGU,e,CAtGV,4G,CAyGY,iB,CACA,a,CA1GZ,qI,CA4Gc,iB,CACA,U,CA7Gd,uI,CA+GgB,e,CACA,kB,CACA,c,CAjHhB,uJ,CAoHkB,a,CApHlB,mJ,CAuHkB,a,CAvHlB,uJ,CA0HkB,a,CA1HlB,yI,CAgIgB,c,CACA,e,CAjIhB,8F,CAsIY,U,CACA,oB,CACA,c,CAxIZ,mE,CA+IM,gB,CACA,iB,CAhJN,wE,CAmJM,Y,CACA,iB,CACA,4B,CACA,6D,CAtJN,6E,CA0JQ,0B,CACA,2B,CA3JR,wF,CA+JQ,U,CA/JR,uE,CAmKQ,kB,CAnKR,iF,CA0KU,c,CACA,c,CA3KV,oF,CAgLU,kB,CAhLV,0E,CAoLU,wE,CACA,kB,CACA,oB,CAmEA,wB,CACA,kB,CACA,wB,CACA,+B,CACA,8B,CA7PV,0E,CAoLU,wE,CACA,kB,CACA,oB,CACA,2B,CAsPA,e,CACA,+B,CACA,qB,CA/aV,2F,CAAA,2F,CA8LY,gB,CA9LZ,4F,CAAA,4F,CAkMY,iB,CAlMZ,qF,CAAA,qF,CAqMY,kB,CArMZ,gF,CAAA,gF,CAwMY,U,CAxMZ,yF,CAAA,oF,CAAA,wF,CAAA,yF,CA2MY,S,CA3MZ,oF,CAAA,oF,CA8MY,a,CA9MZ,qG,CAAA,qG,CAkNc,Y,CACA,e,CACA,Y,CApNd,sF,CA8Nc,6B,CACA,a,CAEA,U,CACA,oB,CAlOd,sF,CA8Nc,6B,CACA,a,CACA,iB,CACA,U,CACA,oB,CAlOd,4F,CAAA,4F,CAqOgB,U,CArOhB,0F,CA8Oc,a,CACA,oB,CA/Od,0F,CA4Oc,a,CACA,iB,CACA,a,CACA,oB,CA/Od,gG,CAAA,gG,CAkPgB,0B,CACA,U,CAnPhB,mF,CAgQY,c,CACA,sB,CAEA,kB,CACA,e,CApQZ,6F,CAwQY,c,CACA,sB,CAEA,kB,CACA,e,CA5QZ,iF,CAgRY,iB,CACA,kB,CACA,kB,CACA,+B,CACA,8B,CACA,U,CACA,gB,CAtRZ,2F,CAwRc,a,CAxRd,yF,CA6RY,iB,CACA,uB,CACA,O,CACA,S,CACA,e,CAjSZ,0F,CAqSY,iB,CACA,uB,CACA,O,CACA,S,CACA,e,CAzSZ,mF,CA6SY,kB,CACA,e,CA9SZ,6F,CAiTc,e,CACA,c,CAlTd,2F,CAqTc,wB,CArTd,8F,CAwTc,yB,CAxTd,2F,CAqUc,iB,CACA,gB,CACA,iB,CACA,4B,CACA,mB,CACA,qB,CA1Ud,iG,CA6UgB,gB,CACA,kB,CA9UhB,8F,CAAA,mG,CAqVkB,iB,CACA,c,CAtVlB,qG,CAAA,0G,CAyVkB,U,CAzVlB,oG,CAAA,yG,CA6VoB,kB,CA7VpB,2G,CAAA,gH,CAgWoB,a,CAhWpB,sF,CAuWY,wB,CACA,U,CACA,gB,CACA,W,CACA,c,CACA,e,CACA,mB,CACA,yB,CA9WZ,4F,CAiXc,qB,CAEA,kB,CACA,iB,CACA,e,CArXd,6F,CAwXc,U,CACA,e,CAzXd,qF,CA6XY,qB,CAEA,e,CACA,iB,CACA,a,CAjYZ,yF,CAmYc,W,CACA,wB,CACA,U,CACA,gB,CACA,yB,CAvYd,gF,CA2YY,e,CACA,c,CA5YZ,oF,CAAA,wF,CA+YY,S,CA/YZ,sF,CAkZc,oB,CAlZd,0F,CAyZc,oB,CACA,U,CA1Zd,0F,CA8ZY,wB,CACA,4B,CA/ZZ,+F,CAkac,iB,CAlad,yF,CAsaY,c,CACA,kB,CACA,iB,CAxaZ,oF,CAmbY,e,CAnbZ,2F,CAubY,U,CAvbZ,6F,CA2bY,W,CACA,a,CA5bZ,mG,CAgcY,a,CACA,c,CACA,e,CAlcZ,qF,CAscY,c,CAtcZ,sF,CA0cY,iB,CACA,iB,CA3cZ,2F,CAidc,iB,CAjdd,4F,CAodc,gB,CApdd,0F,CA0+DA,uC,CAAA,8C,CAlgDY,qB,CAxeZ,+F,CA2ec,iB,CACA,yB,CA5ed,uF,CAgfY,kB,CAhfZ,qF,CAofc,gB,CApfd,iF,CAufc,iB,CAvfd,2F,CA0fc,gB,CA1fd,mF,CA8fY,c,CACA,sB,CAEA,kB,CACA,e,CAlgBZ,mF,CAygBY,c,CAzgBZ,8F,CA4gBc,c,CA5gBd,mG,CAghBc,c,CAhhBd,iH,CAwhBQ,e,CACA,S,CACA,e,CA1hBR,kI,CA6hBU,W,CA7hBV,kH,CAqiBU,kB,CAriBV,mH,CA4iBU,kB,CA5iBV,+F,CAwjBQ,e,CACA,c,CACA,a,CA1jBR,uG,CAAA,uG,CA6jBQ,iB,CA7jBR,4G,CAgkBQ,wB,CAhkBR,2G,CAmkBQ,wB,CAnkBR,2G,CAskBQ,wB,CAtkBR,8E,CA0kBQ,iB,CACA,kB,CACA,iB,CA5kBR,oF,CA+kBU,wB,CA/kBV,uF,CAAA,uF,CAklBY,e,CAllBZ,yG,CAulBc,W,CAvlBd,sH,CAAA,sH,CA6lBU,iB,CACA,Q,CACA,M,CACA,Q,CAhmBV,sH,CAAA,sH,CAmmBU,iB,CACA,Q,CACA,O,CACA,Q,CAtmBV,sH,CAAA,sH,CAymBU,iB,CACA,Q,CACA,Q,CACA,S,CA5mBV,8E,CAknBQ,e,CAlnBR,2F,CAAA,mG,CAqnBU,W,CArnBV,uF,CAgoBY,wB,CACA,iB,CACA,a,CAloBZ,2F,CAsoBU,c,CAtoBV,mH,CAAA,mH,CAyoBU,iB,CAzoBV,mH,CAAA,mH,CA4oBU,gB,CA5oBV,8H,CAAA,8H,CA8oBY,W,CA9oBZ,sF,CAAA,6F,CAkpBU,oB,CACA,a,CAnpBV,uF,CA0pBU,mB,CA1pBV,0F,CA6pBU,wB,CA7pBV,6F,CAgqBY,oB,CAhqBZ,0G,CAmqBY,qB,CAnqBZ,iH,CAAA,oH,CA4qBY,e,CA5qBZ,sG,CAgrBU,a,CAhrBV,2G,CAmrBY,a,CAnrBZ,yD,CAyrBM,iB,CACA,a,CACA,mB,CA3rBN,iE,CA8rBQ,U,CACA,iB,CACA,e,CAhsBR,iF,CAmsBQ,iB,CACA,e,CApsBR,8G,CAusBU,gB,CACA,U,CAxsBV,gH,CA4sBU,c,CACA,U,CA7sBV,0E,CAktBQ,W,CACA,e,CACA,gB,CAptBR,mF,CAAA,wF,CAutBU,W,CACA,Q,CAxtBV,+F,CAAA,oG,CA0tBY,kB,CA1tBZ,iG,CAAA,sG,CA4tBc,mB,CA5tBd,6E,CAkuBQ,W,CACA,e,CAnuBR,wE,CAsuBQ,S,CAMR,yB,CACE,a,CACA,a,CACA,a,CAOF,W,CACE,wB,CAIF,mB,CACE,Y,CAKF,0BACE,S,CACE,W,CAFJ,CAMA,0BACE,S,CACE,Y,CAFJ,CAMA,oB,CAEI,gB,CACA,kB,CACA,gB,CACA,kB,CACA,c,CACA,qB,CACA,S,CACA,e,CACA,c,CACA,a,CAXJ,0B,CAcM,a,CAdN,0B,CAmBI,c,CAyFJ,+B,CArFA,6B,CAEI,gB,CAFJ,kB,CAKI,gB,CACA,iB,CANJ,yB,CAWM,c,CACA,e,CACA,c,CAbN,yC,CAgBM,Y,CACA,iB,CAjBN,iC,CAoBM,c,CACA,oB,CArBN,iC,CA4BM,iB,CACA,iB,CACA,e,CACA,kB,CACA,qB,CACA,iB,CAjCN,oD,CAoCQ,a,CACA,iB,CACA,qB,CAtCR,sC,CAiDU,e,CAjDV,6C,CAqDU,W,CACA,iB,CACA,Q,CACA,S,CAxDV,uC,CA+DI,c,CAKJ,qB,CAEI,e,CACA,kB,CACA,iB,CACA,kB,CALJ,4B,CAQM,U,CARN,kB,CAaI,c,CAUJ,Y,CACE,S,CAGF,W,CAGI,iB,CAHJ,Y,CAMI,e,CANJ,Y,CAAA,kB,CASI,qB,CATJ,mB,CAgBM,wB,CAhBN,W,CAAA,iB,CAAA,sB,CAoBI,wB,CApBJ,kB,CA2BM,wB,CA3BN,4B,CAkCM,wB,CAlCN,6B,CAsCM,wB,CAtCN,qB,CAAA,2B,CA0CI,wB,CA1CJ,4B,CAiDM,wB,CAjDN,qB,CAAA,2B,CAqDI,wB,CArDJ,4B,CA4DM,wB,CAKN,Y,CACE,U,CACA,iB,CAGF,c,CACE,yB,CAGF,0B,CACE,mB,CADF,4C,CAGI,U,CAIJ,iB,CACE,e,CAGF,0B,CAEI,c,CACA,kB,CAIJ,U,CACE,e,CAGF,6C,CAGI,iB,CAHJ,8C,CAMI,mB,CANJ,iC,CASI,e,CATJ,iD,CAYI,mB,CAIJ,O,CAAA,O,CACE,c,CAGF,+B,CACE,e,CAMF,sB,CAPA,2C,CAGI,4B,CAIJ,sB,CACE,iB,CACA,Y,CACA,iB,CACA,2B,CACA,0B,CAIF,sC,CAAA,sC,CACE,wB,CAGF,iC,CACE,kC,CAGF,mC,CACE,kC,CAGF,e,CAEI,wB,CAFJ,iB,CAMI,wB,CANJ,a,CAUI,wB,CAIJ,6C,CAUA,4D,CARI,c,CAIJ,S,CACE,c,CAGF,kC,CAGM,c,CAUN,iB,CACE,uB,CAGF,c,CAAA,I,CAsBA,W,CArBE,iB,CADF,W,CAGI,c,CAEA,mE,CACA,c,CAEA,gB,CAGA,U,CACA,K,CACA,mC,CAbJ,qB,CAsBA,kB,CAtBA,W,CA+BI,e,CAEA,kB,CAEA,U,CACA,iB,CAGA,iB,CAvCJ,qB,CAKI,mE,CAQA,mC,CAVA,c,CAKA,gB,CAGA,U,CAWJ,W,CAEE,c,CACA,gB,CACA,e,CACA,U,CALF,kB,CAOI,c,CACA,uB,CAEA,e,CAEA,gB,CAGA,U,CACA,K,CAQJ,qB,CACE,S,CACA,kB,CACA,oB,CAGF,e,CA8qCA,gB,CA7qCE,U,CAGF,O,CACE,gB,CACA,e,CACA,U,CACA,iB,CACA,yB,CALF,a,CAOI,U,CACA,e,CACA,iB,CATJ,gB,CAYM,a,CAZN,sB,CAkBM,iB,CACA,qB,CAKN,0B,CACE,wB,CACA,oB,CAFF,gC,CAKI,wB,CAIJ,2B,CACE,wB,CACA,oB,CAFF,iC,CAKI,wB,CAIJ,gC,CACE,W,CAMF,+B,CAII,Y,CACA,kB,CACA,wB,CANJ,qC,CASM,gB,CACA,U,CAVN,2C,CAcM,gB,CAdN,4C,CAsBM,oB,CACA,qB,CAvBN,0D,CAAA,+D,CAAA,6D,CAyBQ,oB,CACA,e,CA1BR,iC,CAmCI,iB,CACA,O,CACA,Q,CACA,sB,CACA,iB,CACA,W,CACA,gB,CACA,mB,CACA,qB,CACA,wB,CACA,iB,CA7CJ,+B,CAiDI,kB,CACA,wB,CACA,wB,CACA,iB,CApDJ,uC,CAwDI,e,CACA,sB,CAzDJ,2B,CA6DI,iB,CAIJ,U,CACE,wB,CACA,kB,CACA,a,CAGF,kB,CACE,W,CAGF,U,CACE,iB,CACA,U,CAGF,Y,CACE,Y,CACA,kB,CACA,U,CACA,iB,CAMF,4B,CACE,kB,CACA,yB,CAGA,qB,CAMF,c,CACE,a,CACA,qB,CACA,qB,CACA,iB,CACA,wB,CAGF,kC,CAGI,wB,CAHJ,0B,CAAA,yB,CAOI,wE,CAPJ,yB,CAYI,kB,CACA,oB,CACA,wB,CACA,kC,CACA,wB,CACA,+B,CAyFJ,oC,CA1GA,oC,CAsBI,a,CAtBJ,2B,CAyBI,U,CAKJ,mB,CAEE,yB,CAFF,iC,CAAA,oC,CAKI,oB,CA6GJ,kD,CAAA,mC,CAlHA,kD,CAAA,mC,CAOM,iB,CAPN,0B,CAmBI,sB,CACA,oB,CACA,iB,CAIJ,M,CACE,gB,CAKF,gD,CAGI,gB,CACA,mB,CAAA,Y,CACA,W,CACA,qB,CAAA,kB,CACA,oB,CAAA,sB,CAPJ,uC,CAAA,wC,CAWI,e,CACA,iB,CAZJ,wC,CAgBI,gB,CAhBJ,4C,CAoBI,iB,CACA,kB,CArBJ,0C,CAyBI,c,CAzBJ,mD,CA6BI,qB,CACA,e,CACA,gB,CACA,kB,CAhCJ,sD,CAAA,sD,CA8GA,sD,CAAA,sD,CAzEM,Q,CAQN,2B,CAGI,a,CACA,qB,CACA,qB,CACA,iB,CACA,wB,CAPJ,kC,CAWI,wB,CAXJ,0B,CAAA,yB,CAeI,wE,CAfJ,yB,CAoBI,kB,CACA,oB,CACA,wB,CACA,kC,CACA,wB,CACA,+B,CAzBJ,2B,CAkvBA,iB,CAUA,8C,CAsKA,iB,CAj4BI,U,CAKJ,mB,CAEE,yB,CAFF,iC,CAAA,oC,CAKI,oB,CALJ,0B,CAmBI,sB,CACA,oB,CACA,iB,CAMJ,gD,CAGI,gB,CACA,mB,CAAA,Y,CACA,W,CACA,qB,CAAA,kB,CACA,oB,CAAA,sB,CAPJ,uC,CAAA,wC,CAWI,e,CACA,iB,CAZJ,wC,CAgBI,gB,CAhBJ,4C,CAoBI,iB,CACA,kB,CArBJ,0C,CAyBI,c,CAzBJ,mD,CA6BI,qB,CACA,e,CACA,gB,CACA,kB,CAaJ,gB,CACE,e,CAGF,Y,CACE,8B,CACA,4B,CAGF,Y,CACE,8B,CACA,4B,CAGF,S,CACE,8B,CACA,4B,CAGF,Y,CACE,8B,CACA,4B,CAGF,W,CACE,8B,CACA,4B,CAGF,uC,CACE,U,CAKF,gB,CAEE,qB,CACA,U,CACA,+B,CAJF,wB,CAOI,+B,CAPJ,sB,CAUI,+B,CAVJ,wB,CAaI,+B,CAbJ,qB,CAgBI,+B,CAhBJ,sB,CAmBI,U,CAOJ,wB,CACE,iB,CADF,oC,CAII,iB,CACA,e,CALJ,8C,CASI,a,CAMJ,gB,CAEE,e,CAGF,mB,CACE,iC,CACA,0C,CAGF,gBACE,E,CACE,+B,CAEF,E,CACE,iC,CALJ,CA4BA,6B,CACE,gB,CACA,kB,CAFF,uB,CACE,gB,CAyCA,kB,CA1CF,yC,CAAA,mC,CAKI,W,CACA,iB,CACA,e,CAPJ,uC,CAAA,iC,CAWI,iB,CACA,kB,CACA,U,CAwDJ,wC,CArEA,0C,CAAA,oC,CAgBM,gB,CAhBN,4C,CAmBQ,wB,CACA,qB,CACA,U,CACA,yB,CAtBR,sC,CAqBQ,U,CACA,yB,CAtBR,kD,CAAA,4C,CAyBU,wB,CACA,U,CA1BV,mD,CAAA,yD,CAiCI,wB,CACA,wB,CACA,e,CACA,U,CACA,+B,CAIJ,iC,CAGI,e,CAyBJ,0C,CA5BA,sC,CAMM,wB,CACA,wB,CACA,e,CARN,6C,CAAA,mD,CAYI,wB,CACA,wB,CACA,+B,CACA,U,CACA,e,CAIJ,0B,CACE,qB,CADF,oC,CAII,kB,CAIJ,2B,CACE,e,CADF,qC,CAGI,e,CAHJ,0C,CAYQ,U,CAZR,gD,CAeU,wB,CACA,U,CAhBV,iD,CAAA,uD,CAsBI,wB,CACA,wB,CACA,e,CACA,U,CACA,e,CAIJ,kB,CACE,a,CACA,wB,CAFF,qB,CAKI,e,CACA,sB,CAIJ,U,CACE,wB,CAGF,c,CACE,yB,CACA,U,CAKF,kB,CACE,kB,CACA,W,CAGF,wB,CAEE,W,CACA,U,CAMF,sD,CACE,+B,CAOF,sB,CACE,e,CAikBF,6B,CAlkBA,yC,CAII,U,CACA,U,CAIJ,yE,CACE,a,CAGF,0E,CACE,a,CAeF,4E,CAZA,yC,CAMA,+C,CALE,wB,CAcF,6E,CAZA,0C,CAMA,gD,CALE,wB,CAeF,+B,CAEI,gC,CACA,W,CACA,S,CACA,mC,CALJ,qC,CASI,S,CAiBJ,uB,CAIM,W,CAJN,4B,CAMQ,Y,CANR,kC,CAYM,Y,CAKN,6B,CACE,oB,CAGF,sB,CACE,mB,CAAA,W,CACA,W,CAGF,2B,CACE,iB,CADF,kC,CAII,U,CACA,a,CACA,iB,CACA,M,CACA,U,CACA,6B,CAGF,yC,CACE,K,CAGF,yC,CACE,Q,CAIJ,8B,CAAA,yB,CAEI,c,CAFJ,uC,CAAA,kC,CAMI,U,CACA,mB,CAIJ,qC,CAoHA,gC,CAlHI,mB,CAKJ,Q,CACE,mB,CAIF,iB,CAOE,+B,CAPF,iB,CAAA,oB,CACE,mB,CAAA,Y,CACA,sB,CAAA,kB,CACA,mB,CAAA,W,CACA,oB,CAAA,gB,CACA,U,CAGA,wB,CAkQF,qD,CA1QA,kC,CAAA,qC,CAUI,S,CAKJ,iC,CACE,wB,CAGF,gC,CACE,wB,CAKF,wB,CACE,mB,CAAA,Y,CACA,oB,CACA,sB,CAAA,kB,CAEA,mB,CAAA,W,CACA,mB,CACA,kB,CAAA,c,CACA,sB,CACA,U,CAEA,iB,CACA,kB,CAEA,wB,CACA,a,CAfF,kC,CAiBI,U,CACA,a,CAIJ,kB,CACE,mB,CAAA,W,CAGF,a,CACE,c,CACA,a,CAFF,kB,CAKI,c,CACA,gB,CACA,iB,CAIJ,c,CACE,U,CACA,e,CAGF,oB,CACE,wB,CACA,+B,CAGF,kB,CACE,wB,CACA,iB,CAGF,a,CACE,gB,CACA,iB,CAGF,2B,CACE,e,CAGF,oB,CACE,e,CASF,a,CANA,4B,CACE,mB,CAAA,W,CAKF,a,CAEE,e,CACA,kB,CACA,sB,CAQF,S,CACE,0B,CACA,wB,CAEA,qB,CACA,oB,CACA,gB,CAGF,gB,CAAA,oC,CAAA,2C,CACE,e,CACA,e,CACA,sB,CACA,kB,CAGF,oC,CAAA,oC,CAAA,2C,CAAA,2C,CAEI,W,CACA,iB,CAHJ,wD,CAAA,+D,CAUI,wB,CAVJ,kD,CAAA,kD,CAAA,yD,CAAA,yD,CAeM,M,CACA,c,CACA,c,CACA,S,CACA,iB,CACA,iB,CACA,U,CArBN,oD,CAAA,oD,CAAA,2D,CAAA,2D,CAwBQ,U,CACA,W,CACA,a,CACA,e,CA3BR,6D,CAAA,6D,CAAA,oE,CAAA,oE,CA+BQ,W,CACA,Q,CAhCR,2D,CAAA,2D,CAAA,kE,CAAA,kE,CAoCQ,W,CApCR,qD,CAAA,qD,CAAA,qD,CAAA,qD,CAAA,4D,CAAA,4D,CAAA,4D,CAAA,4D,CAwCQ,iB,CAMR,qC,CAEI,U,CAIJ,uC,CAEI,oB,CAIJ,S,CACE,mB,CAYF,W,CATA,S,CAUE,O,CACA,Q,CACA,iC,CACA,kC,CAEA,oB,CAfF,S,CAKE,6B,CAIF,W,CAKE,0B,CAIF,2B,CAEI,wB,CACA,kB,CACA,wB,CAGA,e,CACA,mB,CARJ,6B,CAaI,S,CAbJ,4B,CAiBI,W,CACA,6B,CAlBJ,wC,CAqBM,a,CArBN,oB,CA0BI,e,CAIJ,qB,CACE,e,CACA,W,CACA,W,CAGF,4B,CACE,S,CAGF,sB,CACE,mB,CACA,U,CAGF,S,CACE,W,CACA,c,CACA,iB,CACA,W,CAOF,wC,CACE,sB,CAKF,oB,CACE,wB,CACA,iB,CAFF,oC,CAKI,mB,CAAA,Y,CACA,sB,CAAA,kB,CACA,mB,CAAA,W,CACA,oB,CAAA,gB,CACA,iB,CACA,U,CAGA,wB,CAKA,wB,CACA,+B,CAnBJ,wC,CAsBM,e,CACA,W,CAvBN,sD,CAyBQ,c,CACA,c,CA1BR,+C,CA8BQ,e,CACA,mB,CACA,wB,CACA,wB,CACA,kB,CAlCR,kC,CA4CI,gB,CACA,iB,CAKJ,Y,CA6BA,wB,CA5BE,iB,CADF,4B,CAGI,wB,CAHJ,2B,CAMI,wB,CANJ,gB,CAUI,+B,CACA,4B,CACA,kB,CACA,e,CACA,e,CACA,e,CACA,wB,CACA,sB,CACA,kB,CAlBJ,8B,CA6BA,6D,CARM,c,CACA,c,CAON,wC,CAII,wB,CAJJ,uC,CAOI,wB,CAPJ,2C,CAWI,iB,CAXJ,+C,CAcM,4B,CACA,kB,CACA,e,CACA,e,CACA,e,CACA,wB,CACA,sB,CACA,kB,CArBN,0C,CAiCI,a,CAjCJ,8C,CAoCM,iB,CApCN,6D,CAuCQ,+B,CAvCR,kD,CA2CQ,gC,CACA,kB,CACA,e,CACA,e,CACA,e,CACA,wB,CACA,sB,CACA,kB,CAlDR,+D,CAqDU,c,CACA,c,CAtDV,oD,CA8DM,a,CACA,gB,CACA,iB,CACA,U,CAjEN,kE,CAoEQ,gB,CASR,0B,CACE,e,CACA,W,CACA,c,CAGF,6C,CACE,W,CAGF,qB,CAEI,mB,CAYJ,a,CACE,a,CACA,8B,CAFF,kB,CAKI,c,CACA,gB,CANJ,iB,CAeI,iB,CACA,gB,CACA,Q,CACA,U,CAIJ,iB,CACE,0B,CADF,wB,CAII,oB,CACA,gB,CACA,W,CANJ,wB,CAUI,e,CACA,e,CAXJ,kC,CAcM,W,CAKN,Q,CACE,kC,CAGF,+B,CACE,sC,CAGF,W,CACE,a,CACA,e,CAGF,K,CACE,U,CACA,gB","file":"style.css","sourcesContent":["@-webkit-keyframes fadein {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@-moz-keyframes fadein {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@-o-keyframes fadein {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes fadein {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n$font-family-sans-serif: \"PT Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n$font-family-sans-serif-narrow: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n$font-family-base: $font-family-sans-serif;\n$font-family-base-narrow: $font-family-sans-serif-narrow;\n$font-size-base: 13px;\n\n$legibility: optimizeLegibility;\n$knockout: antialiased;\n\n$white: #fff;\n$black: #222;\n$gray: #4a4a52;\n$gray_dark: #2b2b32;\n$gray_lighter: #ccc;\n$gray_lightest: #eee;\n$blue: #428bca;\n$beige: #f5f4ec;\n$orange: #fc882a;\n$green: #66b132;\n$yellow: #ffc40d;\n$purple: #90f;\n$red: #ff4d4d;\n$highlighter: #fff7d7;\n\n$lightBlue: lighten($blue, 10%);\n$darkBlue: darken($blue, 10%);\n$grayLight: #999;\n$grayDivider: #cecece;\n$grayLighter: $gray_lighter;\n$grayLightest: $gray_lightest;\n$be-light-grey: $gray_lighter;\n$grayDark: lighten($gray_dark, 10%);\n\n$pairingCellWidth: 200px;\n\n* {\n outline: none !important;\n}\n\n.red {\n color: $red;\n}\n\n.green {\n color: $green;\n}\n\n.yellow {\n color: $yellow;\n}\n\n.clearfix {\n *zoom: 1; // For IE 6/7 (trigger hasLayout)\n &:before, &:after {\n content: \"\";\n line-height: 0;\n display: table;\n }\n &:after {\n clear: both;\n }\n}\n\n// Form states and alerts\n// -------------------------\n$warningText: #c09853;\n$warningBackground: #fcf8e3;\n$warningBorder: darken(adjust-hue($warningBackground, -10), 3%);\n\n$errorText: #b94a48;\n$errorBackground: #f2dede;\n$errorBorder: darken(adjust-hue($errorBackground, -10), 3%);\n\n$successText: #468847;\n$successBackground: #dff0d8;\n$successBorder: darken(adjust-hue($successBackground, -10), 5%);\n\n$infoText: #3a87ad;\n$infoBackground: #d9edf7;\n$infoBorder: darken(adjust-hue($infoBackground, -10), 7%);\n\n// Transitions\n@mixin transition($transition) {\n -webkit-transition: $transition;\n transition: $transition;\n}\n\n/* Hide transition when setting initial state of nav */\n.hide_transition {\n transition: none !important;\n -webkit-transition: none !important;\n animation: none !important;\n -webkit-animation: none !important;\n -moz-animation: none !important;\n -o-animation: none !important;\n}\n\n// Box Shadows\n@mixin box-shadow($shadow) {\n -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1\n box-shadow: $shadow;\n}\n\n// Single side border-radius\n@mixin border-top-radius($radius) {\n border-top-right-radius: $radius;\n border-top-left-radius: $radius;\n}\n\n@mixin border-right-radius($radius) {\n border-bottom-right-radius: $radius;\n border-top-right-radius: $radius;\n}\n\n@mixin border-bottom-radius($radius) {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n}\n\n@mixin border-left-radius($radius) {\n border-bottom-left-radius: $radius;\n border-top-left-radius: $radius;\n}\n\nbody {\n margin: 0;\n font-family: $font-family-base;\n font-size: $font-size-base;\n text-rendering: $legibility;\n -webkit-font-smoothing: $knockout;\n color: $black;\n}\n\nh1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: $font-family-base;\n}\n\n/* placeholder hyperlinks */\na:not([href]) {\n cursor: pointer;\n}\n\n.label {\n padding: 2.6px 7.8px;\n font-size: 100%;\n}\n\n.btn {\n -webkit-font-smoothing: initial;\n &.btn-default-gray {\n background-color: $grayLight;\n color: $white;\n\n .caret {\n border-top-color: $white;\n }\n }\n}\n\n.pointer {\n cursor: pointer;\n}\n\n.app {\n width: 100vw;\n margin-left: 0;\n}\n\n.ui-view-container {\n height: calc(100vh - 55px);\n max-height: calc(100vh - 55px);\n min-height: calc(100vh - 55px);\n overflow-x: auto;\n}\n\n.sidebar {\n margin-left: 0;\n position: fixed;\n float: none;\n height: 100%;\n background-color: $gray;\n white-space: nowrap;\n width: 56px;\n z-index: 10;\n\n .menu {\n margin: 0;\n position: relative;\n\n #sidebar-profile {\n text-overflow: ellipsis;\n }\n\n .item {\n position: relative;\n overflow: hidden;\n display: block;\n padding: 16px;\n width: 100%;\n height: 53px;\n color: $white;\n cursor: pointer;\n text-decoration: none;\n\n &:hover,\n &.active {\n color: $white;\n }\n\n &:hover {\n background-color: darken($gray, 5%);\n @include transition(all 0.2s ease);\n }\n\n &.active {\n font-weight: bold;\n color: $white;\n background-color: $gray_dark;\n }\n\n .icon {\n position: relative;\n float: left;\n width: 20px;\n text-align: center;\n }\n\n i {\n font-size: 20px;\n }\n\n .item_name {\n position: relative;\n top: 1px;\n margin-top: 0;\n margin-left: 16px;\n line-height: 0;\n text-transform: uppercase;\n font-weight: bold;\n letter-spacing: 2px;\n }\n\n .badge {\n position: absolute;\n top: 17px;\n right: 15px;\n }\n }\n\n .divider {\n margin: 0;\n height: 1px;\n background-color: $gray_dark;\n }\n }\n\n &.collapsed {\n margin-left: 0;\n width: 56px;\n @include transition(0.5s);\n\n .item_name,\n .badge {\n display: none;\n visibility: hidden;\n\n }\n }\n\n &.expanded {\n width: 260px;\n @include transition(0.5s);\n\n .item_name,\n .badge {\n font-size: 13px;\n visibility: visible;\n display: inline;\n -webkit-animation: fadein 0.5s; /* Safari 4+ */\n -moz-animation: fadein 0.5s; /* Fx 5+ */\n -o-animation: fadein 0.5s; /* Opera 12+ */\n animation: fadein 0.5s; /* IE 10+ */\n }\n }\n}\n\n.display {\n width: 100%;\n\n .content {\n margin-left: 56px;\n\n &.narrow {\n margin-left: 260px;\n @include transition(0.5s);\n }\n\n &.wide {\n margin-left: 56px;\n @include transition(0.5s);\n }\n .header {\n position: relative;\n width: 100%;\n height: 54px;\n border-bottom: 1px solid $gray_lighter;\n\n .menu_toggle_container,\n .logo_container,\n .search_bar_container,\n .add_menu_container {\n position: relative;\n float: left;\n }\n\n .menu_toggle_container {\n\n .menu_toggle {\n display: block;\n cursor: pointer;\n padding: 18px 20px 15px 20px;\n border-right: 1px solid $gray_lighter;\n\n i {\n font-size: 18px;\n }\n &:hover {\n background-color: $gray_lightest;\n }\n }\n }\n\n .logo_container {\n\n .logo {\n display: block;\n\n .logo_text {\n width: 234px;\n padding: 11px 20px 10px 18px;\n font-size: 24px;\n font-family: $font-family-base-narrow;\n\n font-weight: normal;\n text-transform: uppercase;\n\n .logo_text_seed {\n font-family: $font-family-base;\n font-weight: bold;\n }\n .logo_text_saving,\n .saving_progress {\n color: $blue;\n }\n }\n }\n }\n\n .search_bar_container {\n\n .search_bar {\n display: block;\n width: 320px;\n padding: 10px 20px 10px 2px;\n }\n }\n\n .add_menu_container {\n float: right;\n\n .btn-group {\n\n &.open {\n\n .dropdown-toggle {\n @include box-shadow(inset 0 0 0 rgba(0, 0, 0, 0));\n }\n }\n\n .btn {\n padding: 14px 20px 12px;\n font-size: 18px;\n color: $blue;\n background-color: rgba(255, 255, 255, 0);\n border-radius: 0;\n\n &.btn:hover,\n &.btn:active,\n &.btn:focus {\n background-color: $gray_lightest;\n @include box-shadow(inset 0 0 0 rgba(0, 0, 0, 0));\n }\n }\n\n ul.dropdown-menu {\n\n text-align: center;\n\n li {\n\n &.divider {\n margin: 0;\n }\n\n &.dropdown-header {\n padding: 8px 0;\n font-size: 14px;\n color: #000;\n font-weight: bold;\n text-align: center;\n }\n\n a {\n padding: 8px 40px 8px 8px;\n position: relative;\n color: $blue;\n }\n }\n }\n\n &.org-dropdown {\n\n button {\n border: none;\n font-family: $font-family-base-narrow;\n font-size: 16px;\n padding-top: 16px;\n padding-bottom: 15px;\n }\n ul {\n max-height: calc(100vh - 60px);\n overflow-y: auto;\n right: 0;\n left: inherit;\n text-align: left;\n\n .fa {\n position: absolute;\n right: 5px;\n top: 10px;\n }\n }\n }\n\n }\n }\n }\n }\n}\n\n@media (max-width: 945px) {\n .search_bar_container {\n display: none;\n }\n}\n\n.page {\n clear: both;\n position: relative;\n\n .page_header_container {\n clear: both;\n display: block;\n\n .page_header {\n position: relative;\n height: 40px;\n border-bottom: 1px solid $gray_lighter;\n\n .page_action_container {\n position: relative;\n float: left;\n padding: 11px 20px 7px;\n\n &.left {\n float: left;\n width: 30%;\n\n a {\n i {\n padding-right: 6px;\n }\n }\n }\n\n &.right {\n float: right;\n width: 30%;\n text-align: right;\n }\n\n &.page_action_btn {\n padding: 5px 14px 2px 10px;\n\n .uib-dropdown-menu {\n text-align: left;\n }\n }\n\n .page_action {\n text-decoration: none;\n &.activity {\n }\n }\n }\n\n .page_title {\n position: relative;\n width: 40%;\n padding: 11px 20px 7px;\n float: left;\n text-align: center;\n overflow: hidden;\n text-overflow: ellipsis;\n\n h1 {\n display: inline;\n font-size: 18px;\n font-weight: bold;\n white-space: nowrap;\n }\n }\n .filters {\n position: absolute;\n top: 32px;\n z-index: 1;\n right: 16px;\n width: 200px;\n height: 200px;\n text-align: left;\n background-color: $white;\n border: 1px solid $gray_lighter;\n border-radius: 4px;\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n\n .filter_label {\n clear: both;\n padding-top: 10px;\n padding-bottom: 2px;\n font-size: 12px;\n font-weight: bold;\n text-transform: uppercase;\n color: gray;\n }\n .apply_filters {\n padding-top: 20px;\n }\n }\n }\n }\n}\n\n.section_nav_container {\n min-height: 38px;\n position: relative;\n border-bottom: 1px solid $gray_lighter;\n .section_nav {\n position: relative;\n text-align: center;\n\n a {\n display: inline-block;\n padding: 10px;\n\n &:hover,\n &:hover,\n &.active {\n background-color: $gray_lightest;\n }\n }\n }\n}\n\n.section {\n clear: both;\n display: block;\n}\n\n.alert_container {\n padding: 20px 10px 20px;\n}\n\n.section_tab_container {\n padding: 16px;\n font-size: 14px;\n\n .nav-tabs {\n li {\n a {\n cursor: pointer;\n }\n }\n }\n .row {\n margin-left: 0;\n margin-right: 0;\n border-left: 1px solid #ddd;\n border-right: 1px solid #ddd;\n border-bottom: 1px solid #ddd;\n }\n .tab_content {\n &.narrow {\n padding: 16px 20% 16px 16px;\n }\n &.wide {\n padding: 16px;\n }\n }\n}\n\n.section_header_container {\n position: relative;\n border-bottom: 1px solid $gray_lighter;\n\n &.has_no_border {\n border-bottom: none;\n }\n &.has_btm_margin {\n margin-bottom: 16px;\n }\n .section_header {\n position: relative;\n padding: 20px 20px 10px;\n\n &.has_no_padding {\n padding: 0 20px;\n\n .section_action_container {\n padding-top: 20px;\n\n &.section_action_btn {\n padding-top: 9px;\n }\n }\n }\n &.fixed_height {\n height: 64px;\n }\n &.fixed_height_short {\n min-height: 48px;\n }\n h2 {\n display: inline;\n padding-right: 10px;\n font-size: 16px;\n font-weight: bold;\n }\n\n i {\n padding-right: 8px;\n }\n\n .active {\n background-color: $blue;\n }\n .section_action_container {\n position: relative;\n\n &.left {\n float: left;\n width: 25%;\n }\n &.left_40 {\n float: left;\n width: 40%;\n }\n &.left_wide {\n float: left;\n width: 75%;\n }\n &.center {\n float: left;\n padding-top: 4px;\n text-align: center;\n width: 50%;\n\n .field_title {\n padding-left: 10px;\n font-family: $font-family-base-narrow;\n text-transform: uppercase;\n font-weight: bold;\n }\n }\n &.right {\n float: right;\n width: 25%;\n text-align: right;\n\n i {\n padding-right: 0;\n }\n }\n &.right_40 {\n float: right;\n width: 40%;\n text-align: right;\n\n i {\n padding-right: 0;\n }\n }\n &.right_60 {\n float: right;\n width: 60%;\n text-align: right;\n button {\n margin-left: 7px;\n }\n }\n &.right_wide {\n float: right;\n width: 75%;\n text-align: right;\n\n button {\n margin-left: 7px;\n }\n }\n &.section_action_btn {\n padding: 0;\n\n .uib-dropdown-menu {\n text-align: left;\n\n }\n i {\n padding-right: 8px;\n\n &.align_right {\n padding-right: 0;\n }\n }\n }\n .check_action {\n display: inline-block;\n\n input[type=\"checkbox\"] {\n margin-right: 10px;\n }\n\n .btn-group {\n\n ul.dropdown-menu {\n\n li {\n .dropdown_menu_title {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: bold;\n white-space: nowrap;\n }\n a {\n color: $blue;\n }\n }\n }\n }\n }\n }\n }\n}\n\n.section_content_container {\n\n &.has_top_margin {\n margin-top: 20px;\n }\n .section_content {\n\n &.with_padding {\n padding-top: 0;\n padding-left: 20px;\n padding-right: 20px;\n }\n h3 {\n font-size: 14px;\n font-weight: bold;\n margin-top: 26px;\n margin-bottom: 6px;\n }\n .content_block {\n padding: 20px 30px 30px 72px;\n\n h1 {\n font-weight: bold;\n font-size: 44px;\n }\n\n p {\n font-size: 18px;\n }\n }\n .home_jump_nav_container {\n position: relative;\n\n .home_jump_nav {\n margin: 0 auto;\n padding: 0 10%;\n position: relative;\n overflow: auto;\n text-align: center;\n\n a {\n width: 25%;\n position: relative;\n overflow: auto;\n float: left;\n display: block;\n padding: 20px;\n font-size: 18px;\n text-decoration: none;\n\n i {\n padding-right: 12px;\n }\n\n &:hover {\n background-color: $gray_lightest;\n text-decoration: none;\n }\n }\n }\n }\n .jumbotron {\n background: url('../images/kc_2.jpg') no-repeat;\n height: 402px;\n margin-bottom: 0;\n padding: 30px 10%;\n color: $white;\n\n .home_hero_content_container {\n background-color: rgba(20, 20, 50, 0.3);\n margin: 0 18% 0 0;\n padding: 30px;\n border-radius: 10px;\n\n h1 {\n font-weight: bold;\n margin-top: 0;\n color: $white;\n }\n\n .btn {\n margin-top: 20px;\n }\n }\n p {\n margin-bottom: 0;\n }\n }\n .whats_new_container {\n padding: 0 10%;\n\n .whats_new {\n\n h2 {\n font-weight: bold;\n margin: 0;\n padding: 20px 0;\n text-align: center;\n border-bottom: 1px solid $gray_lightest;\n\n }\n .content_col {\n margin-top: 10px;\n\n .content_col_header {\n position: relative;\n overflow: auto;\n .content_col_header_left {\n position: relative;\n float: left;\n i {\n padding-top: 7px;\n padding-right: 10px;\n font-size: 48px;\n\n &.fa-cloud-upload {\n color: $lightBlue;\n }\n &.fa-exchange {\n color: lighten($purple, 25%);\n }\n &.fa-check-square {\n color: lighten($green, 20%);\n }\n }\n }\n .content_col_header_right {\n h3 {\n font-size: 20px;\n font-weight: bold;\n }\n }\n }\n .copy {\n clear: both;\n padding: 5px 30px 0 0;\n font-size: 16px;\n }\n }\n }\n }\n\n .section_form_container {\n padding-top: 15px;\n padding-left: 15px;\n }\n .vert_table_scroll_container {\n height: 400px;\n overflow-y: scroll;\n border-bottom: 1px solid $gray_lighter;\n background: url('../images/bg_first_td.png') repeat-x top center;\n }\n .table_list_container {\n &.has_borders {\n border-left: 1px solid $gray_lighter;\n border-right: 1px solid $gray_lighter;\n }\n\n &.remove_buildings_table {\n width: 100%;\n }\n\n table {\n margin-bottom: 10px;\n\n &.has_no_btm_margin {\n margin-bottom: 0;\n }\n\n &.resizable {\n max-width: none; // override bootstrap\n min-width: 100%;\n }\n\n &.fixed-layout {\n /* use in combination with th.ellipsis-resizable for resizable columns */\n table-layout: fixed;\n }\n\n th, td {\n font-family: $font-family-base-narrow;\n white-space: nowrap;\n padding: 6px 10px 5px;\n border-right: 1px solid $gray_lighter;\n\n &.is_aligned_left {\n text-align: left;\n }\n\n &.is_aligned_right {\n text-align: right;\n }\n\n &.is_aligned_center {\n text-align: center;\n }\n &.whitespace {\n white-space: normal;\n }\n &.check {\n width: 33px;\n }\n &.has_no_padding {\n padding: 0;\n }\n .subtitle {\n color: lighten($gray, 20%);\n }\n &.compliance-check {\n .checkbox {\n margin-top: 0;\n margin-bottom: 0;\n min-height: 0;\n }\n }\n span.is_aligned_right {\n float: right;\n }\n &.is_master {\n padding: 0;\n\n a {\n border-left: 3px solid $green;\n display: block;\n padding: 12px 10px;\n color: $black;\n text-decoration: none;\n\n &:hover {\n color: #000;\n }\n }\n }\n &.is_not_master {\n padding: 0;\n a {\n color: darken($grayLighter, 10%);\n padding: 12px 10px;\n display: block;\n text-decoration: none;\n\n &:hover {\n border-left: 3px solid $grayLight;\n color: #000;\n }\n }\n }\n }\n th {\n text-transform: uppercase;\n background: darken($gray_lightest, 13%);\n text-shadow: 0 1px 0 white;\n border-bottom: 1px solid darken($gray_lighter, 10%);\n border-right: 1px solid darken($gray_lighter, 10%);\n\n &.ellipsis {\n max-width: 80px;\n text-overflow: ellipsis;\n /* Required for text-overflow to do anything */\n white-space: nowrap;\n overflow: hidden;\n }\n &.ellipsis-resizable {\n /* use in combination with table.fixed-layout for resizable columns */\n min-width: 80px;\n text-overflow: ellipsis;\n /* Required for text-overflow to do anything */\n white-space: nowrap;\n overflow: hidden;\n }\n\n &.sorted {\n position: relative;\n white-space: nowrap;\n background: $blue;\n border-bottom: 1px solid $blue;\n border-right: 1px solid $blue;\n color: $white;\n text-shadow: none;\n .subtitle {\n color: lighten($blue, 30%);\n }\n }\n\n &.sort_asc:after {\n position: absolute;\n font-family: FontAwesome;\n top: 7px;\n right: 7px;\n content: \"\\f0dd\";\n }\n\n &.sort_desc:after {\n position: absolute;\n font-family: FontAwesome;\n top: 7px;\n right: 7px;\n content: \"\\f0de\";\n }\n\n &.sub_head {\n background: darken($gray_lightest, 5%);\n font-weight: normal;\n\n .col-xs-6 {\n padding-right: 0;\n padding-left: 0;\n }\n .active {\n background-color: $highlighter;\n }\n .btn-group {\n text-transform: capitalize;\n\n ul.uib-dropdown-menu {\n\n li {\n text-align: left;\n a {\n color: $blue;\n }\n }\n }\n }\n &.sub_org {\n padding-left: 30px;\n border-left: none;\n border-right: none;\n border-bottom: 1px solid $grayLightest;\n text-transform: none;\n background-color: $white;\n\n &.right {\n text-align: right;\n padding-right: 10px;\n\n i {\n padding-right: 6px;\n }\n\n a {\n visibility: hidden;\n padding: 0 10px;\n }\n i.fa-cog {\n color: $gray_lighter;\n }\n &:hover {\n a {\n visibility: visible;\n }\n i.fa-cog {\n color: $gray;\n }\n }\n }\n }\n }\n &.source_data {\n background-color: lighten($gray, 20%);\n color: $white;\n text-shadow: none;\n border: none;\n font-size: 18px;\n text-align: left;\n text-transform: none;\n border-radius: 6px 6px 0 0;\n\n &.blank {\n background-color: $white;\n border-right: none;\n border-bottom: none;\n border-right: none;\n border-radius: 0;\n }\n select {\n color: $black;\n font-weight: normal;\n }\n }\n &.mid_column {\n background-color: $white;\n border-right: none;\n border-top: none;\n border-right: none;\n padding: 0 4px;\n div {\n padding: 5px 5px;\n background-color: lighten($gray, 20%);\n color: $white;\n text-shadow: none;\n border-radius: 6px 6px 0 0;\n }\n }\n input {\n font-weight: normal;\n min-width: 50px;\n }\n &.is_master {\n padding: 0;\n\n a {\n padding: 6px 10px 5px;\n }\n }\n &.is_not_master {\n padding: 0;\n\n a {\n padding: 6px 10px 5px;\n color: darken($grayLighter, 40%);\n }\n }\n &.account_pending {\n background-color: $warningBackground;\n border-bottom: 1px solid $gray_lighter;\n\n &.left {\n border-right: none;\n }\n }\n &.condensed_head {\n min-width: 70px;\n white-space: normal;\n text-align: center;\n }\n\n }\n td {\n border-top: none;\n border-bottom: 1px solid #e7e7e7;\n vertical-align: middle;\n /* max-width: 200px; */\n\n .progress {\n margin-bottom: 0;\n }\n\n .table_name_link {\n float: left;\n }\n\n .table_action_link {\n float: right;\n padding: 0 4px;\n }\n\n label.checkbox_fill_area {\n display: block;\n cursor: pointer;\n padding: 6px 0 0;\n }\n\n &.parent_org {\n font-size: 18px;\n }\n\n &.account_org {\n padding-left: 20px;\n border-right: none;\n\n i {\n padding-right: 6px;\n }\n &.left {\n padding-left: 40px;\n }\n &.right {\n text-align: right;\n\n a {\n visibility: hidden;\n padding: 0 10px;\n }\n i.fa-cog {\n color: $gray_lighter;\n }\n &:hover {\n a {\n visibility: visible;\n }\n i.fa-cog {\n color: $gray;\n }\n }\n }\n }\n &.account_pending {\n background-color: $white;\n\n &.left {\n border-right: none;\n font-weight: normal !important;\n }\n }\n &.align_to_top {\n vertical-align: top;\n }\n &.note {\n label {\n margin-right: 2px;\n }\n i {\n padding-right: 2px;\n }\n a.note_edit {\n padding-left: 2px;\n }\n }\n &.ellipsis {\n max-width: 80px;\n text-overflow: ellipsis;\n /* Required for text-overflow to do anything */\n white-space: nowrap;\n overflow: hidden;\n }\n\n }\n\n &.sortable {\n th {\n cursor: pointer;\n\n &::selection {\n background: transparent;\n }\n\n &::-moz-selection {\n background: transparent;\n }\n }\n }\n }\n\n /* To embolden entries in the first column */\n .table_highlight_first tbody tr td:nth-child(1) {\n font-weight: bold;\n width: 20%;\n min-width: 280px;\n\n &.has_no_min_width {\n min-width: 0;\n }\n }\n\n /* For highlighting a sorted column */\n .table-striped tbody tr:nth-child(odd) td {\n\n &.sorted {\n background: lighten($gray_lightest, 2%);\n }\n }\n\n .table-striped tbody tr:nth-child(even) td {\n\n &.sorted {\n background: darken($white, 2%);\n }\n }\n\n //.table-striped tbody tr:nth-child(1) td {\n // background: url('../images/bg_first_td.png') repeat-x;\n //\n // &.sorted {\n // background: url('../images/bg_first_td.png') repeat-x;\n // }\n //}\n .table-striped tbody tr td h3 {\n font-weight: 400;\n font-size: 20px;\n margin: 10px 0;\n }\n .table-striped thead tr th:last-child, .table-striped tbody tr td:last-child {\n border-right: none;\n }\n .table-striped tbody tr td.high_confidence {\n background-color: $green;\n }\n .table-striped tbody tr td.med_confidence {\n background-color: $yellow;\n }\n .table-striped tbody tr td.low_confidence {\n background-color: $red;\n }\n /* Buildis a scrollable table */\n &.table_scroll {\n overflow-x: scroll;\n overflow-y: visible;\n margin-left: 24.9%;\n\n table {\n border-collapse: separate;\n\n th, td {\n overflow: hidden;\n }\n .sub_head {\n\n .check_row {\n height: 49px;\n }\n }\n }\n\n .table-striped thead tr th:nth-child(1), .table-striped tbody tr td:nth-child(1) {\n position: absolute;\n top: auto;\n left: 0;\n width: 5%;\n }\n .table-striped thead tr th:nth-child(2), .table-striped tbody tr td:nth-child(2) {\n position: absolute;\n top: auto;\n left: 5%;\n width: 8%;\n }\n .table-striped thead tr th:nth-child(3), .table-striped tbody tr td:nth-child(3) {\n position: absolute;\n top: auto;\n left: 13%;\n width: 12%;\n }\n }\n\n /* Dataset List */\n &.dataset_list {\n overflow-x: auto;\n\n .replace_file_button {\n float: right;\n }\n .delete_link {\n float: right;\n }\n }\n\n /* Worksheet */\n &.worksheet {\n td {\n &.sub_head {\n background-color: lighten($beige, 1%);\n border-right: none;\n color: lighten($gray, 30%);\n }\n }\n .data_file_name {\n padding: 0 20px;\n }\n .table-striped thead tr th:nth-child(1), .table-striped tbody tr td:nth-child(1) {\n border-right: none;\n }\n .table-striped thead tr th:nth-child(2), .table-striped tbody tr td:nth-child(2) {\n text-align: right;\n .btn-group {\n float: right;\n }\n }\n i.fa-check, i.fa-check-circle {\n text-decoration: none;\n color: $green;\n }\n }\n\n /* Mapping */\n &.mapping {\n select option {\n word-spacing: normal;\n }\n tr.concat_parent {\n background-color: $beige;\n\n td {\n color: rgba(0, 0, 0, 0.5);\n }\n td:nth-child(1) {\n background-color: $white;\n }\n }\n }\n\n /* Matching Detail */\n &.matching_detail {\n .table-striped tbody tr.info, .table-striped tbody tr.success {\n td {\n font-weight: bold;\n }\n }\n td.potential_matches {\n color: lighten($gray, 15%);\n\n span {\n padding: 0 5px;\n }\n }\n }\n }\n .table_footer {\n position: relative;\n overflow: auto;\n padding-bottom: 20px;\n\n .counts {\n float: left;\n text-align: center;\n margin-top: 17px;\n }\n .display_number_entries {\n position: relative;\n margin-top: 10px;\n\n .display_number_entries_text {\n margin: 7px 5px 0;\n float: left;\n }\n\n .display_number_entries_select {\n margin-top: 3px;\n float: left;\n }\n\n }\n .pager_container {\n float: right;\n margin-top: 10px;\n text-align: right;\n\n ul.pager, ul.pagination {\n float: right;\n margin: 0;\n li.disabled {\n cursor: not-allowed;\n > a {\n pointer-events: none;\n }\n }\n }\n }\n .table_footer_right {\n float: right;\n margin-top: 10px;\n }\n &.has_no_padding {\n padding: 0;\n }\n }\n }\n}\n\n.section_bottom_container {\n padding: 5px 0;\n margin: 0 auto;\n overflow: auto;\n\n i {\n padding-right: 8px;\n }\n}\n\n.badge_menu {\n background-color: $gray;\n}\n\n// hides data uploaded processing files text\n.qq-drop-processing {\n display: none;\n}\n\n// New styles for better modal living.\n\n@media (min-width: 1042px) {\n .modal-lg {\n width: 950px;\n }\n}\n\n@media (min-width: 1300px) {\n .modal-lg {\n width: 1230px;\n }\n}\n\n.modal-header {\n .close {\n margin-top: -14px;\n margin-right: -63px;\n padding: 8px 11px;\n border-radius: 20px;\n font-size: 24px;\n background-color: $white;\n opacity: 1;\n font-weight: normal;\n line-height: 0.5;\n color: $grayDark;\n\n &:hover {\n color: $red;\n }\n }\n\n .modal-links {\n font-size: 18px;\n }\n}\n\n.modal-body {\n &.no_bottom_padding {\n padding-bottom: 0;\n }\n .alert {\n margin-left: 15px;\n margin-right: 15px;\n }\n .form-group {\n\n p {\n margin: 0 0 8px;\n font-weight: bold;\n font-size: 14px;\n }\n .column_container {\n height: 290px;\n overflow-x: scroll;\n }\n ul.column {\n padding-left: 0;\n list-style-type: none;\n\n li {\n\n }\n }\n .checkbox {\n margin-bottom: 6px;\n padding-left: 26px;\n padding-top: 6px;\n padding-bottom: 6px;\n background-color: $gray_lightest;\n border-radius: 5px;\n\n &.complianceCheckbox {\n padding-top: 0;\n padding-left: 20px;\n background-color: $white;\n }\n\n label {\n display: block;\n }\n }\n\n table {\n th {\n label {\n margin-left: 6px;\n }\n\n .search-icon {\n float: right;\n position: relative;\n top: 21px;\n right: 8px;\n }\n }\n\n }\n }\n .form-group_faux_horizontal {\n padding-left: 0;\n }\n\n}\n\n.modal-footer {\n div.row {\n margin-top: 20px;\n margin-bottom: 20px;\n padding-left: 15px;\n padding-right: 15px;\n\n button {\n float: none;\n }\n }\n\n .btn {\n min-width: 90px;\n }\n}\n\n#newCustomViewModal {\n .modal-body {\n padding-bottom: 0;\n }\n}\n\n.inset_badge {\n padding: 0;\n}\n\n.badge {\n\n &.left {\n padding: 0 0 0 7px;\n }\n &.right {\n margin-left: 3px;\n }\n &.to_do {\n background-color: $purple;\n .left {\n\n background-color: $purple\n }\n .right {\n\n background-color: lighten($purple, 15%);\n }\n }\n &.done {\n background-color: $green;\n .left {\n\n background-color: $green;\n }\n .right {\n\n background-color: lighten($green, 15%);\n }\n }\n &.high_confidence {\n background-color: $green;\n .left {\n\n background-color: $green;\n }\n .right {\n\n background-color: lighten($green, 15%);\n }\n }\n &.med_confidence {\n background-color: $yellow;\n .left {\n\n background-color: $yellow;\n }\n .right {\n\n background-color: lighten($yellow, 15%);\n }\n }\n &.low_confidence {\n background-color: $red;\n .left {\n\n background-color: $red;\n }\n .right {\n\n background-color: lighten($red, 15%);\n }\n }\n}\n\n.matchmaking {\n color: black;\n padding-left: 10px;\n}\n\n.is_underlined {\n text-decoration: underline;\n}\n\ndiv[sd-uploader][disabled] {\n pointer-events: none;\n .qq-upload-button {\n opacity: 0.3;\n }\n}\n\n.qq-upload-button {\n font-weight: bold;\n}\n\n.alert {\n .alert_instructions {\n font-size: 14px;\n margin-bottom: 13px;\n }\n}\n\n.tcm_field {\n min-width: 165px;\n}\n\n.progress_bar_container {\n\n &.progressbar_fill_area {\n padding: 100px 25%;\n }\n .progress_bar_copy_top {\n padding: 0 0 5px 5px;\n }\n .progress {\n margin-bottom: 0;\n }\n .progress_bar_copy_bottom {\n padding: 5px 0 0 5px;\n }\n}\n\n.btn-sm, .btn-xs {\n font-size: 13px;\n}\n\n.table_header_persistent .table {\n margin-bottom: 0;\n thead > tr > th {\n border-bottom: 1px solid $grayLighter;\n }\n}\n\n.table_body_persistent {\n position: relative;\n height: 205px;\n overflow-y: scroll;\n border-right: 1px solid $grayLighter;\n border-left: 1px solid $grayLighter;\n border-bottom: 1px solid $grayLighter;\n}\n\n.tbody-striped > tbody:nth-child(odd) td, .tbody-striped > tbody:nth-child(odd) > th {\n background-color: #F9F9F9\n}\n\n.data-quality-error td:last-child {\n background-color: #FFB7B7 !important;\n}\n\n.data-quality-warning td:last-child {\n background-color: #FDF4BF !important;\n}\n\nselect {\n &.error-bg {\n background-color: #FFB7B7;\n }\n\n &.warning-bg {\n background-color: #FDF4BF;\n }\n\n > option {\n background-color: #F7F7F7;\n }\n}\n\n.export_radio .radio-inline {\n input[type=radio] {\n margin-top: 2px;\n }\n}\n\n.input-sm {\n font-size: 13px;\n}\n\n.form-group {\n .matching_toggle {\n label {\n font-size: 14px;\n }\n .radio-inline {\n input[type=radio] {\n margin-top: 2px;\n }\n }\n }\n}\n\n.number_unmatched {\n color: rgba(34, 34, 34, 0.5);\n}\n\n.tip, .important-tip {\n position: relative;\n &:before {\n font-size: 18px;\n padding: 4px 8px;\n -webkit-transform: rotate(-5deg) translateX(-25px) translateY(-25px);\n content: 'Tip!';\n background: #5bc0de;\n line-height: 24px;\n color: #FFF;\n position: absolute;\n left: -26px;\n top: 0;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n }\n i.fa {\n padding-right: 0;\n }\n}\n\n/* A more subtle alternative to the above 'tip' class */\n.tip-subtle {\n position: relative;\n margin-top: 5px;\n margin-left: 35px;\n margin-bottom: 0;\n color: #999;\n &:before {\n font-size: 12px;\n font-family: FontAwesome;\n padding: 4px 8px 4px 8px;\n content: '\\f129';\n background: #5bc0de;\n line-height: 12px;\n color: #FFF;\n position: absolute;\n left: -30px;\n top: 0;\n border-radius: 6px;\n }\n i.fa {\n padding-right: 0;\n }\n}\n\n.important-tip:before {\n top: -10px;\n background: $red;\n content: 'Important!';\n}\n\n.ignored_row td {\n color: $grayLight;\n}\n\n.footer {\n margin-top: 100px;\n padding: 30px 5%;\n width: 100%;\n position: relative;\n border-top: 1px solid $gray_lighter;\n table {\n width: 100%;\n overflow: hidden;\n text-align: center;\n\n td {\n width: 33.333%;\n }\n }\n\n .row {\n .col-md-4 {\n text-align: center;\n background-color: gray;\n }\n }\n}\n\n.green_button .btn-primary {\n background-color: $green;\n border-color: darken($green, 5%);\n\n &:hover {\n background-color: darken($green, 5%);\n }\n}\n\n.orange_button .btn-primary {\n background-color: $orange;\n border-color: darken($orange, 5%);\n\n &:hover {\n background-color: darken($orange, 5%);\n }\n}\n\n.ui-sortable .ui-sortable-handle {\n cursor: move;\n}\n\n/* STYLES FOR REPORTS */\n\n/* Styles for building reports page */\n.building-reports {\n\n /* The section containing the UI controls for updating the charts */\n .chart-inputs {\n padding: 10px;\n border-radius: .5em;\n background-color: #d8e3ed;\n\n label {\n margin-right: 5px;\n color: #222;\n }\n\n .form-group {\n margin-left: 20px;\n }\n\n /* This is a fix for a bug in bootstrap 3.1\n (fixed in 3.2, but we're using 3.1 right now)\n We can remove when we update.\n */\n .input-group {\n display: inline-table;\n vertical-align: middle;\n .input-group-addon, .input-group-btn, .form-control {\n width: auto !important;\n max-width: 120px;\n }\n }\n }\n\n /* This is a small floating box\n above the chart that shows the chart's status\n when loading or when it has no data. */\n .status-message {\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -30px 0 0 -60px;\n text-align: center;\n width: 120px;\n padding-top: 10px;\n padding-bottom: 10px;\n background-color: #FFF;\n border: 1px solid #F1F1F1;\n border-radius: 5px;\n }\n\n .chart-holder {\n border-radius: .5em;\n background-color: #F6F6F6;\n border: 1px solid #F6F6F6;\n position: relative;\n }\n\n .reportingTableHolder {\n margin-top: 20px;\n padding: 0 60px 0 105px;\n }\n\n .progress {\n margin: 5px 10px 0;\n }\n}\n\n.tree-node {\n border: 1px solid #dae2ea;\n background: #f8faff;\n color: #7c9eb2;\n}\n\n.tree-node-content {\n margin: 10px;\n}\n\n.fa-arrows {\n padding-right: 7px;\n color: #444;\n}\n\n.tree-handle {\n padding: 10px;\n background: #428bca;\n color: #FFF;\n margin-right: 10px;\n}\n\n.angular-ui-tree-handle:hover {\n}\n\n.angular-ui-tree-placeholder {\n background: #f0f9ff;\n border: 2px dashed #bed2db;\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n/* STYLES FOR LABELS AND RELATED */\n\n/* Holds inline form for creating new labels */\n.newLabelInput {\n margin: 20px 0;\n border: 1px solid #EEE;\n padding: 10px 10px 5px 10px;\n border-radius: 5px;\n background-color: #F1F1F1;\n}\n\n#label_admin {\n\n .table_list_container {\n border: 1px solid #cdcdcd;\n }\n\n .sectionLabel {\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n }\n\n .tableHeader {\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n white-space: nowrap;\n padding: 6px 10px 5px 10px;\n text-transform: uppercase;\n background-color: #cdcdcd !important;\n text-shadow: 0 1px 0 white;\n border-bottom: 1px solid #b3b3b3;\n }\n\n /* Get xeditable fields to extend 100% of td */\n form[editable-form] > div {\n margin: 10px 0;\n }\n .editable-wrap {\n width: 100%;\n }\n\n}\n\n.label-edit-section {\n\n margin: 5px 10px 10px 20px;\n\n .label-action {\n display: inline-block;\n .label-edit-text {\n margin-right: 20px;\n }\n a {\n margin-right: 20px;\n }\n }\n\n .label-container {\n display: inline-block;\n }\n\n .label {\n padding: .6em .6em .5em .6em;\n display: inline-block;\n margin-bottom: 5px;\n }\n}\n\n.label {\n margin-right: 5px;\n}\n\n/* Styles for update labels modal */\n\n#update-building-labels-modal {\n\n .labels-status-msg {\n min-height: 150px;\n display: flex;\n height: 100%;\n align-items: center;\n justify-content: center;\n }\n\n .add_text, .edit_text {\n font-weight: bold;\n margin-bottom: 5px;\n }\n\n .edit_text {\n margin-left: 10px;\n }\n\n .add-label-row {\n margin-right: -5px;\n margin-bottom: 20px;\n }\n\n .btn-default {\n min-width: 70px;\n }\n\n .table-list-container {\n border: 1px solid #EEE;\n overflow-y: auto;\n max-height: 350px;\n margin-bottom: 10px;\n table {\n\n }\n th, td {\n border: 0;\n }\n }\n\n}\n\n/* Cycle admin */\n\n#cycle_admin {\n\n .newCycleInput {\n margin: 20px 0;\n border: 1px solid #EEE;\n padding: 10px 10px 5px 10px;\n border-radius: 5px;\n background-color: #F1F1F1;\n }\n\n .table_list_container {\n border: 1px solid #cdcdcd;\n }\n\n .sectionCycle {\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n }\n\n .tableHeader {\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n white-space: nowrap;\n padding: 6px 10px 5px 10px;\n text-transform: uppercase;\n background-color: #cdcdcd !important;\n text-shadow: 0 1px 0 white;\n border-bottom: 1px solid #b3b3b3;\n }\n\n /* Get xeditable fields to extend 100% of td */\n form[editable-form] > div {\n margin: 10px 0;\n }\n .editable-wrap {\n width: 100%;\n }\n\n}\n\n.cycle-edit-section {\n\n margin: 5px 10px 10px 20px;\n\n .cycle-action {\n display: inline-block;\n .label-edit-text {\n margin-right: 20px;\n }\n a {\n margin-right: 20px;\n }\n }\n\n .cycle-container {\n display: inline-block;\n }\n\n .cycle {\n padding: .6em .6em .5em .6em;\n display: inline-block;\n margin-bottom: 5px;\n }\n}\n\n/* DMcQ: Once Bluesky refactoring is complete, remove old #update-building-labels-modal above */\n\n#update-property-labels-modal {\n\n .labels-status-msg {\n min-height: 150px;\n display: flex;\n height: 100%;\n align-items: center;\n justify-content: center;\n }\n\n .add_text, .edit_text {\n font-weight: bold;\n margin-bottom: 5px;\n }\n\n .edit_text {\n margin-left: 10px;\n }\n\n .add-label-row {\n margin-right: -5px;\n margin-bottom: 20px;\n }\n\n .btn-default {\n min-width: 70px;\n }\n\n .table-list-container {\n border: 1px solid #EEE;\n overflow-y: auto;\n max-height: 350px;\n margin-bottom: 10px;\n table {\n\n }\n th, td {\n border: 0;\n }\n }\n\n}\n\n/* Styles to override ngInputTags to get correct tag colors */\n\ntags-input .tags {\n min-width: 550px;\n}\n\n.tag-primary {\n border-color: #428bca !important;\n background: #428bca !important;\n}\n\n.tag-success {\n border-color: #5cb85c !important;\n background: #5cb85c !important;\n}\n\n.tag-info {\n border-color: #5bc0de !important;\n background: #5bc0de !important;\n}\n\n.tag-warning {\n border-color: #f0ad4e !important;\n background: #f0ad4e !important;\n}\n\n.tag-danger {\n border-color: #d43f3a !important;\n background: #d43f3a !important;\n}\n\ngs-input .tags .tag-item .remove-button {\n color: #FFF;\n}\n\n/* NOTIFICATIONS */\n\n.ui-notification {\n\n background-color: #EEE;\n color: #000;\n border-left: thick solid $blue;\n\n &.warning {\n border-left: thick solid $warningBackground;\n }\n &.error {\n border-left: thick solid $errorBackground;\n }\n &.success {\n border-left: thick solid $successBackground;\n }\n &.info {\n border-left: thick solid $infoBackground;\n }\n &:hover {\n opacity: 0.7;\n }\n}\n\n/* OTHER */\n\n/* Styles for building list controls and table */\n.inventory-list-controls {\n padding: 20px 10px;\n\n .form-group {\n margin-right: 20px;\n margin-bottom: 0;\n }\n\n & + .buildingListControls {\n padding-top: 0;\n }\n}\n\n/* Styles for building page */\n\n#building-fields {\n // set a min width for the field column\n min-width: 275px;\n}\n\n.glyphicon.spinning {\n animation: spin 1s infinite linear;\n -webkit-animation: spin2 1s infinite linear;\n}\n\n@keyframes spin {\n from {\n transform: scale(1) rotate(0deg);\n }\n to {\n transform: scale(1) rotate(360deg);\n }\n}\n\n@-webkit-keyframes spin2 {\n from {\n -webkit-transform: rotate(0deg);\n }\n to {\n -webkit-transform: rotate(360deg);\n }\n}\n\n/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */\n/* Styles for mods to blue sky building list. /\n/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */\n\n/* Placing these style here for initial dev. These should be integrated into styles above once approved */\n\n/* Tabs: The section_tab_container defined above doesn't seem to fit well with how we wants tabs to\n appear in the building list. So defining a style here that can hopefully be refactored into\n the styles above at a later point. */\n\n.inventory-list-tab-container, .matching-tab-container {\n margin-left: 10px;\n margin-bottom: -2px;\n\n .item-count {\n float: right;\n margin-right: 20px;\n margin-top: 10px;\n }\n\n .nav-tabs {\n position: relative;\n margin-bottom: -2px;\n z-index: 99;\n\n > li {\n margin-right: 4px;\n\n > a {\n background-color: #D6D6D6;\n border: 1px solid #bbb;\n color: #222;\n border-radius: 6px 6px 0 0;\n\n &:hover {\n background-color: $blue;\n color: #FFF;\n }\n }\n }\n }\n\n .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover {\n background-color: #F1F1F1;\n border: 1px solid #D1D1D1;\n font-weight: bold;\n color: #000;\n border-bottom: 1px solid #F1F1F1;\n }\n}\n\n.matching-tab-container {\n margin-bottom: -1px;\n .nav-tabs {\n border-bottom: 0;\n\n > li > a {\n background-color: #F1F1F1;\n border: 1px solid #D1D1D1;\n border-bottom: 0;\n }\n }\n .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover {\n background-color: #7B7B87;\n border: 1px solid #D1D1D1;\n border-bottom: 1px solid #7B7B87;\n color: #FFF;\n font-weight: bold;\n }\n}\n\n.matching-detail-container {\n padding: 0 0 15px 15px;\n\n .paginate {\n padding: 5px 15px 0;\n }\n}\n\n.data-quality-tab-container {\n margin-bottom: 0;\n .nav-tabs {\n border-bottom: 0;\n\n > li {\n margin-right: 4px;\n\n > a {\n background-color: #F1F1F1;\n border: 1px solid #D1D1D1;\n border-bottom: 0;\n color: #222;\n\n &:hover {\n background-color: $blue;\n color: #FFF;\n }\n }\n }\n }\n .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover {\n background-color: #CDCDCD;\n border: 1px solid #D1D1D1;\n border-bottom: 0;\n color: #000;\n font-weight: bold;\n }\n}\n\n.table_item_detail {\n margin: 0 10px;\n border: 1px solid #F1F1F1;\n\n td {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n.highlight {\n background-color: $highlighter;\n}\n\n#swagger-frame {\n height: calc(100vh - 60px);\n width: 100%;\n}\n\n/* UI Grid modifications */\n/* Remove gradient on top bar. It's distracting and decreases legibility */\n.ui-grid-top-panel {\n background: #F1F1F1;\n filter: none;\n}\n\n.ui-grid-row-header-link {\n //background-color: #f0f0ee;\n height: 30px;\n width: 30px;\n > a {\n display: block;\n }\n}\n\n.ui-grid-row:not(:last-child) .ui-grid-row-header-link {\n border-bottom: solid 1px #d4d4d4;\n}\n\n//.ui-grid-row.ui-grid-row-selected > [ui-grid-row] > .ui-grid-cell > .ui-grid-row-header-link {\n// background-color: #c9dde1;\n//}\n\n.ui-grid-cell-contents {\n font-weight: normal;\n\n &.pinnable[disabled] {\n color: #222;\n opacity: 0.1;\n }\n}\n\n.ui-grid-row:nth-child(odd) .ui-grid-cell .inventory-settings-cell::after {\n color: #d7d7d7;\n}\n\n.ui-grid-row:nth-child(even) .ui-grid-cell .inventory-settings-cell::after {\n color: #cbcbcb;\n}\n\n.ui-grid-row:nth-child(odd) .ui-grid-cell {\n background-color: #fdfdfd;\n}\n.ui-grid-row:nth-child(even) .ui-grid-cell {\n background-color: #f3f3f3;\n}\n.ui-grid-row:nth-child(odd):hover .ui-grid-cell {\n background-color: #fdfdfd;\n}\n.ui-grid-row:nth-child(even):hover .ui-grid-cell {\n background-color: #f3f3f3;\n}\n.ui-grid-row.ui-grid-row-selected:nth-child(odd) > [ui-grid-row] > .ui-grid-cell {\n background-color: #fdfdfd;\n}\n.ui-grid-row.ui-grid-row-selected:nth-child(even) > [ui-grid-row] > .ui-grid-cell {\n background-color: #f3f3f3;\n}\n\n.inventory-settings-cell {\n &::after {\n content: attr(data-after-content);\n float: right;\n opacity: 0;\n transition: opacity .25s ease-in-out;\n }\n\n &:hover::after {\n opacity: 1;\n }\n}\n\n// Nested rows\n.ui-grid-row:not(.ui-grid-tree-header-row) {\n /*.ui-grid-cell-contents {\n color: #444;\n }*/\n /*&:nth-child(odd) .ui-grid-cell {\n background-color: #fbfbf3;\n }\n &:nth-child(even) .ui-grid-cell {\n background-color: #f8f6e7;\n }*/\n}\n\n#nav-inventory {\n span {\n padding-right: 12px;\n > svg {\n height: 18px;\n path {\n fill: #337ab7;\n }\n }\n }\n &:hover {\n span > svg path {\n fill: #23527c;\n }\n }\n}\n\n.ui-grid-draggable-row-target {\n opacity: 0.5 !important;\n}\n\n.ui-grid-draggable-row {\n cursor: grab;\n height: 30px;\n}\n\n.ui-grid-draggable-row-over {\n position: relative;\n\n &:before {\n content: \"\";\n display: block;\n position: absolute;\n left: 0;\n width: 100%;\n border-bottom: 2px dashed #AAA;\n }\n\n &--above:before {\n top: 0;\n }\n\n &--below:before {\n bottom: 0;\n }\n}\n\n#inventory-actions-dropdown, #inventory-detail-edit {\n li {\n cursor: default;\n }\n\n a[disabled] {\n color: gray;\n pointer-events: none;\n }\n}\n\n#inventory-detail-buttons {\n a[disabled] {\n pointer-events: none;\n }\n}\n\n// Pairing page:\n.pairing {\n padding-bottom: 20px;\n}\n\n// Main container: initialize the flex, direction is row\n.pairing-data-row, .pairing-headers-row {\n display: flex;\n flex-direction: row;\n flex-grow: 0;\n flex-wrap: nowrap;\n width: 100%;\n\n border-bottom: 2px solid #e0e0e0;\n border-collapse: collapse;\n .is-paired-child {\n width: 10%;\n }\n}\n\n// Mismatch row colors\n.pairing-data-row:nth-child(even) {\n background-color: #fdfdfd;\n}\n\n.pairing-data-row:nth-child(odd) {\n background-color: #f3f3f3;\n}\n\n// Child rows, indented\n//removed padding left 40px, added 20px padding under .pairing-cell for better alignment\n.pairing-data-row-indent {\n display: flex;\n display: -webkit-flex;\n flex-direction: row;\n -webkit-flex-direction: row;\n flex-grow: 0;\n -webkit-flex-grow: 0;\n flex-wrap: wrap;\n -webkit-flex-wrap: wrap;\n width: 100%;\n //changed from 40px to 15px update: has to stay 40px maybe more for when tables are switched\n padding-left: 40px;\n padding-right: 15px;\n\n border-collapse: collapse;\n color: #A0A0A0;\n .unpaired {\n width: 100%;\n color: lightskyblue;\n }\n}\n\n.grab-pairing-left {\n cursor: grab;\n}\n\n.unpair-child {\n cursor: pointer;\n color: #428bca;\n\n > span {\n font-size: 20px;\n line-height: 10px;\n position: relative;\n }\n}\n\n.pairing-child {\n width: 100%;\n min-height: 15px;\n}\n\n.pairing-headers-row {\n background-color: #E0E0E0;\n border-bottom: 2px solid #A0A0A0;\n}\n\n.pairing-container {\n border: 1px solid #A0A0A0;\n overflow-x: hidden;\n}\n\n.pairing-rows {\n max-height: 600px;\n overflow-y: scroll;\n}\n\n.pairing-list-controls-full {\n margin-top: 15px;\n}\n\n.pairing-other-title {\n margin-top: 40px;\n}\n\n.pairing-data-row-col-indent {\n flex-grow: 0;\n}\n\n// Text based cells: grow, truncate and show ellipsis when there is not enough space\n//added 20px padding to left to align data under columns\n.pairing-cell {\n flex-grow: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n // padding-right: 20px;\n}\n\ntable.import_results a[disabled] {\n pointer-events: none;\n}\n\n.noselect {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n#mapped-table td, div.table_list_container.matching td, div.table_list_container.matching_detail td {\n max-width: 350px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\ndiv.table_list_container.matching, div.table_list_container.matching_detail {\n td, th {\n height: 34px;\n position: relative;\n }\n\n tr td {\n background-color: #fff;\n }\n tr:nth-of-type(odd) td {\n background-color: #f9f9f9;\n }\n\n td, th {\n &.matching-link {\n left: 0;\n margin-top: 1px;\n min-width: 34px;\n padding: 0;\n position: absolute;\n text-align: center;\n z-index: 10;\n\n > a {\n width: 100%;\n height: 100%;\n display: block;\n padding-top: 8px;\n }\n\n &.column-row {\n height: 35px;\n margin: 0;\n }\n\n &.sub_head {\n height: 36px;\n }\n\n + td, + th {\n padding-left: 43px;\n }\n }\n }\n}\n\n#data-quality-admin-table {\n tr.disabled {\n opacity: 0.4;\n }\n}\n\n#column-table {\n input.ng-invalid-required {\n border-color: #dd2c00;\n }\n}\n\n.no-click {\n pointer-events: none;\n}\n\n.arrow-up {\n width: 0;\n height: 0;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-bottom: 10px solid black;\n display: inline-block;\n}\n\n.arrow-down {\n width: 0;\n height: 0;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-top: 10px solid black;\n display: inline-block;\n}\n\n.pairing {\n .table_header_text {\n text-transform: uppercase;\n white-space: nowrap;\n text-shadow: 0 1px 0 white;\n // border-bottom: 1px solid darken($gray_lighter, 10%);\n // border-right: 1px solid darken($gray_lighter, 10%);\n font-weight: bold;\n padding: 6px 2px 5px;\n }\n\n .pairing-headers-row {\n //justify-content: space-between;\n padding: 0;\n }\n\n div.pairing-headers {\n padding: 3px;\n border-left: 1px solid #b3b3b3;\n\n &:first-child {\n border-left: 0;\n }\n }\n\n .data-slide {\n padding-left: 6%;\n }\n}\n\n.pairing-data-row-col {\n min-width: $pairingCellWidth;\n padding: 2px;\n width: $pairingCellWidth;\n}\n\n.pairing-data-row-col-indent {\n width: 30%;\n}\n\n.disableable[disabled] {\n pointer-events: none;\n color: gray;\n}\n\n.paginate {\n float: right;\n padding: 0 15px;\n position: relative;\n z-index: 100;\n}\n\n.filter-row input {\n width: 100%;\n}\n\n.filter-unmatched .filter-unmatched-hide {\n display: none !important;\n}\n\n$pairingCellWidth: 200px;\n$pairedCellWidth: 60px;\n.pairing-container-2 {\n border: 1px solid #A0A0A0;\n overflow-x: hidden;\n\n .pairing-header {\n display: flex;\n flex-direction: row;\n flex-grow: 0;\n flex-wrap: nowrap;\n overflow-x: hidden;\n width: 100%;\n\n border-bottom: 2px solid #e0e0e0;\n border-collapse: collapse;\n .is-paired-child {\n width: 10%;\n }\n\n background-color: #E0E0E0;\n border-bottom: 2px solid #A0A0A0;\n\n > div {\n min-width: $pairingCellWidth;\n width: $pairingCellWidth;\n &.paired-column {\n min-width: $pairedCellWidth;\n max-width: $pairedCellWidth;\n }\n\n .title {\n font-weight: bold;\n padding: 6px 2px 5px;\n text-shadow: 0 1px 0 white;\n text-transform: uppercase;\n white-space: nowrap;\n }\n\n input {\n width: 100%;\n }\n }\n }\n\n .pairing-body {\n max-height: 600px;\n overflow-y: scroll;\n }\n\n}\n\n.pairing-row {\n display: table-row;\n &:nth-child(even) {\n background-color: #fdfdfd;\n }\n &:nth-child(odd) {\n background-color: #f3f3f3;\n }\n\n > div {\n border-bottom: 1px solid #e0e0e0;\n border-top: 1pt solid #e0e0e0;\n display: table-cell;\n max-width: $pairingCellWidth;\n min-width: $pairingCellWidth;\n overflow: hidden;\n padding: 2px 2px 2px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &.paired-column {\n max-width: 45px;\n min-width: 45px;\n }\n\n }\n\n}\n\n.right-pairing-container {\n display: table-row;\n\n &:nth-child(even) {\n background-color: #fdfdfd;\n }\n &:nth-child(odd) {\n background-color: #f3f3f3;\n }\n\n .right-pairing-row {\n display: table-row;\n\n > div {\n border-top: 1px solid #e0e0e0;\n display: table-cell;\n max-width: $pairingCellWidth;\n min-width: $pairingCellWidth;\n overflow: hidden;\n padding: 2px 2px 2px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &.paired-column {\n max-width: 45px;\n min-width: 45px;\n }\n\n }\n\n }\n\n .right-paired-row {\n color: #a0a0a0;\n\n > div {\n display: table-row;\n\n &:last-child > div {\n border-bottom: 1px solid #e0e0e0;\n }\n\n > div {\n border-top: 2px solid transparent;\n display: table-cell;\n max-width: $pairingCellWidth;\n min-width: $pairingCellWidth;\n overflow: hidden;\n padding: 2px 2px 2px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &.unpair-child {\n max-width: 45px;\n min-width: 45px;\n }\n\n }\n\n }\n\n .unpaired {\n color: lightskyblue;\n overflow: visible;\n padding-left: 40px;\n width: 100%;\n\n .pairing-cell {\n overflow: visible;\n }\n\n }\n\n }\n\n}\n\n.merge-modal .modal-dialog {\n max-height: 80vh;\n width: 750px;\n max-width: 85vw;\n}\n\n.merge-modal .merge-grid .ui-grid-menu-button {\n height: 28px;\n}\n\n.pm_import {\n [disabled] {\n pointer-events: none;\n }\n\n select {\n width: 100%;\n }\n\n small {\n color: #999;\n }\n}\n\n.notes-button {\n font-size: 9px;\n text-decoration: none !important;\n\n i.fa {\n font-size: 13px;\n padding-left: 3px;\n\n &.text-muted {\n color: #222;\n opacity: 0.1;\n }\n }\n\n div {\n position: relative;\n text-align: right;\n top: -2px;\n width: 20px;\n }\n}\n\n.settings_profile {\n padding-top: 10px !important;\n\n select {\n display: inline-block;\n margin-left: 20px;\n width: 200px;\n }\n\n button {\n margin-top: -5px;\n padding: 4px 7px;\n\n &[disabled] {\n opacity: 0.25;\n }\n }\n}\n\n.pink-bg {\n background-color: rgba(255, 0, 0, 0.07);\n}\n\n:not(.active) .typeahead-native {\n background-color: rgba(100, 255, 100, 0.15);\n}\n\n.upload-btn {\n display: block;\n font-weight: bold;\n}\n\n.lock {\n color: #444;\n padding-left: 6px;\n}\n","@keyframes fadein {\n from {\n opacity: 0; }\n to {\n opacity: 1; } }\n\n* {\n outline: none !important; }\n\n.red {\n color: #ff4d4d; }\n\n.green {\n color: #66b132; }\n\n.yellow {\n color: #ffc40d; }\n\n.clearfix {\n *zoom: 1; }\n .clearfix:before, .clearfix:after {\n content: \"\";\n line-height: 0;\n display: table; }\n .clearfix:after {\n clear: both; }\n\n/* Hide transition when setting initial state of nav */\n.hide_transition {\n transition: none !important;\n -webkit-transition: none !important;\n animation: none !important;\n -webkit-animation: none !important;\n -moz-animation: none !important;\n -o-animation: none !important; }\n\nbody {\n margin: 0;\n font-family: \"PT Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 13px;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n color: #222; }\n\nh1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: \"PT Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif; }\n\n/* placeholder hyperlinks */\na:not([href]) {\n cursor: pointer; }\n\n.label {\n padding: 2.6px 7.8px;\n font-size: 100%; }\n\n.btn {\n -webkit-font-smoothing: initial; }\n .btn.btn-default-gray {\n background-color: #999;\n color: #fff; }\n .btn.btn-default-gray .caret {\n border-top-color: #fff; }\n\n.pointer {\n cursor: pointer; }\n\n.app {\n width: 100vw;\n margin-left: 0; }\n\n.ui-view-container {\n height: calc(100vh - 55px);\n max-height: calc(100vh - 55px);\n min-height: calc(100vh - 55px);\n overflow-x: auto; }\n\n.sidebar {\n margin-left: 0;\n position: fixed;\n float: none;\n height: 100%;\n background-color: #4a4a52;\n white-space: nowrap;\n width: 56px;\n z-index: 10; }\n .sidebar .menu {\n margin: 0;\n position: relative; }\n .sidebar .menu #sidebar-profile {\n text-overflow: ellipsis; }\n .sidebar .menu .item {\n position: relative;\n overflow: hidden;\n display: block;\n padding: 16px;\n width: 100%;\n height: 53px;\n color: #fff;\n cursor: pointer;\n text-decoration: none; }\n .sidebar .menu .item:hover, .sidebar .menu .item.active {\n color: #fff; }\n .sidebar .menu .item:hover {\n background-color: #3e3e45;\n transition: all 0.2s ease; }\n .sidebar .menu .item.active {\n font-weight: bold;\n color: #fff;\n background-color: #2b2b32; }\n .sidebar .menu .item .icon {\n position: relative;\n float: left;\n width: 20px;\n text-align: center; }\n .sidebar .menu .item i {\n font-size: 20px; }\n .sidebar .menu .item .item_name {\n position: relative;\n top: 1px;\n margin-top: 0;\n margin-left: 16px;\n line-height: 0;\n text-transform: uppercase;\n font-weight: bold;\n letter-spacing: 2px; }\n .sidebar .menu .item .badge {\n position: absolute;\n top: 17px;\n right: 15px; }\n .sidebar .menu .divider {\n margin: 0;\n height: 1px;\n background-color: #2b2b32; }\n .sidebar.collapsed {\n margin-left: 0;\n width: 56px;\n transition: 0.5s; }\n .sidebar.collapsed .item_name,\n .sidebar.collapsed .badge {\n display: none;\n visibility: hidden; }\n .sidebar.expanded {\n width: 260px;\n transition: 0.5s; }\n .sidebar.expanded .item_name,\n .sidebar.expanded .badge {\n font-size: 13px;\n visibility: visible;\n display: inline;\n /* Safari 4+ */\n /* Fx 5+ */\n /* Opera 12+ */\n animation: fadein 0.5s;\n /* IE 10+ */ }\n\n.display {\n width: 100%; }\n .display .content {\n margin-left: 56px; }\n .display .content.narrow {\n margin-left: 260px;\n transition: 0.5s; }\n .display .content.wide {\n margin-left: 56px;\n transition: 0.5s; }\n .display .content .header {\n position: relative;\n width: 100%;\n height: 54px;\n border-bottom: 1px solid #ccc; }\n .display .content .header .menu_toggle_container,\n .display .content .header .logo_container,\n .display .content .header .search_bar_container,\n .display .content .header .add_menu_container {\n position: relative;\n float: left; }\n .display .content .header .menu_toggle_container .menu_toggle {\n display: block;\n cursor: pointer;\n padding: 18px 20px 15px 20px;\n border-right: 1px solid #ccc; }\n .display .content .header .menu_toggle_container .menu_toggle i {\n font-size: 18px; }\n .display .content .header .menu_toggle_container .menu_toggle:hover {\n background-color: #eee; }\n .display .content .header .logo_container .logo {\n display: block; }\n .display .content .header .logo_container .logo .logo_text {\n width: 234px;\n padding: 11px 20px 10px 18px;\n font-size: 24px;\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-weight: normal;\n text-transform: uppercase; }\n .display .content .header .logo_container .logo .logo_text .logo_text_seed {\n font-family: \"PT Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-weight: bold; }\n .display .content .header .logo_container .logo .logo_text .logo_text_saving,\n .display .content .header .logo_container .logo .logo_text .saving_progress {\n color: #428bca; }\n .display .content .header .search_bar_container .search_bar {\n display: block;\n width: 320px;\n padding: 10px 20px 10px 2px; }\n .display .content .header .add_menu_container {\n float: right; }\n .display .content .header .add_menu_container .btn-group.open .dropdown-toggle {\n box-shadow: inset 0 0 0 rgba(0, 0, 0, 0); }\n .display .content .header .add_menu_container .btn-group .btn {\n padding: 14px 20px 12px;\n font-size: 18px;\n color: #428bca;\n background-color: rgba(255, 255, 255, 0);\n border-radius: 0; }\n .display .content .header .add_menu_container .btn-group .btn.btn:hover, .display .content .header .add_menu_container .btn-group .btn.btn:active, .display .content .header .add_menu_container .btn-group .btn.btn:focus {\n background-color: #eee;\n box-shadow: inset 0 0 0 rgba(0, 0, 0, 0); }\n .display .content .header .add_menu_container .btn-group ul.dropdown-menu {\n text-align: center; }\n .display .content .header .add_menu_container .btn-group ul.dropdown-menu li.divider {\n margin: 0; }\n .display .content .header .add_menu_container .btn-group ul.dropdown-menu li.dropdown-header {\n padding: 8px 0;\n font-size: 14px;\n color: #000;\n font-weight: bold;\n text-align: center; }\n .display .content .header .add_menu_container .btn-group ul.dropdown-menu li a {\n padding: 8px 40px 8px 8px;\n position: relative;\n color: #428bca; }\n .display .content .header .add_menu_container .btn-group.org-dropdown button {\n border: none;\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 16px;\n padding-top: 16px;\n padding-bottom: 15px; }\n .display .content .header .add_menu_container .btn-group.org-dropdown ul {\n max-height: calc(100vh - 60px);\n overflow-y: auto;\n right: 0;\n left: inherit;\n text-align: left; }\n .display .content .header .add_menu_container .btn-group.org-dropdown ul .fa {\n position: absolute;\n right: 5px;\n top: 10px; }\n\n@media (max-width: 945px) {\n .search_bar_container {\n display: none; } }\n\n.page {\n clear: both;\n position: relative; }\n .page .page_header_container {\n clear: both;\n display: block; }\n .page .page_header_container .page_header {\n position: relative;\n height: 40px;\n border-bottom: 1px solid #ccc; }\n .page .page_header_container .page_header .page_action_container {\n position: relative;\n float: left;\n padding: 11px 20px 7px; }\n .page .page_header_container .page_header .page_action_container.left {\n float: left;\n width: 30%; }\n .page .page_header_container .page_header .page_action_container.left a i {\n padding-right: 6px; }\n .page .page_header_container .page_header .page_action_container.right {\n float: right;\n width: 30%;\n text-align: right; }\n .page .page_header_container .page_header .page_action_container.page_action_btn {\n padding: 5px 14px 2px 10px; }\n .page .page_header_container .page_header .page_action_container.page_action_btn .uib-dropdown-menu {\n text-align: left; }\n .page .page_header_container .page_header .page_action_container .page_action {\n text-decoration: none; }\n .page .page_header_container .page_header .page_title {\n position: relative;\n width: 40%;\n padding: 11px 20px 7px;\n float: left;\n text-align: center;\n overflow: hidden;\n text-overflow: ellipsis; }\n .page .page_header_container .page_header .page_title h1 {\n display: inline;\n font-size: 18px;\n font-weight: bold;\n white-space: nowrap; }\n .page .page_header_container .page_header .filters {\n position: absolute;\n top: 32px;\n z-index: 1;\n right: 16px;\n width: 200px;\n height: 200px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border-radius: 4px;\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box; }\n .page .page_header_container .page_header .filters .filter_label {\n clear: both;\n padding-top: 10px;\n padding-bottom: 2px;\n font-size: 12px;\n font-weight: bold;\n text-transform: uppercase;\n color: gray; }\n .page .page_header_container .page_header .filters .apply_filters {\n padding-top: 20px; }\n\n.section_nav_container {\n min-height: 38px;\n position: relative;\n border-bottom: 1px solid #ccc; }\n .section_nav_container .section_nav {\n position: relative;\n text-align: center; }\n .section_nav_container .section_nav a {\n display: inline-block;\n padding: 10px; }\n .section_nav_container .section_nav a:hover, .section_nav_container .section_nav a:hover, .section_nav_container .section_nav a.active {\n background-color: #eee; }\n\n.section {\n clear: both;\n display: block; }\n\n.alert_container {\n padding: 20px 10px 20px; }\n\n.section_tab_container {\n padding: 16px;\n font-size: 14px; }\n .section_tab_container .nav-tabs li a {\n cursor: pointer; }\n .section_tab_container .row {\n margin-left: 0;\n margin-right: 0;\n border-left: 1px solid #ddd;\n border-right: 1px solid #ddd;\n border-bottom: 1px solid #ddd; }\n .section_tab_container .tab_content.narrow {\n padding: 16px 20% 16px 16px; }\n .section_tab_container .tab_content.wide {\n padding: 16px; }\n\n.section_header_container {\n position: relative;\n border-bottom: 1px solid #ccc; }\n .section_header_container.has_no_border {\n border-bottom: none; }\n .section_header_container.has_btm_margin {\n margin-bottom: 16px; }\n .section_header_container .section_header {\n position: relative;\n padding: 20px 20px 10px; }\n .section_header_container .section_header.has_no_padding {\n padding: 0 20px; }\n .section_header_container .section_header.has_no_padding .section_action_container {\n padding-top: 20px; }\n .section_header_container .section_header.has_no_padding .section_action_container.section_action_btn {\n padding-top: 9px; }\n .section_header_container .section_header.fixed_height {\n height: 64px; }\n .section_header_container .section_header.fixed_height_short {\n min-height: 48px; }\n .section_header_container .section_header h2 {\n display: inline;\n padding-right: 10px;\n font-size: 16px;\n font-weight: bold; }\n .section_header_container .section_header i {\n padding-right: 8px; }\n .section_header_container .section_header .active {\n background-color: #428bca; }\n .section_header_container .section_header .section_action_container {\n position: relative; }\n .section_header_container .section_header .section_action_container.left {\n float: left;\n width: 25%; }\n .section_header_container .section_header .section_action_container.left_40 {\n float: left;\n width: 40%; }\n .section_header_container .section_header .section_action_container.left_wide {\n float: left;\n width: 75%; }\n .section_header_container .section_header .section_action_container.center {\n float: left;\n padding-top: 4px;\n text-align: center;\n width: 50%; }\n .section_header_container .section_header .section_action_container.center .field_title {\n padding-left: 10px;\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n text-transform: uppercase;\n font-weight: bold; }\n .section_header_container .section_header .section_action_container.right {\n float: right;\n width: 25%;\n text-align: right; }\n .section_header_container .section_header .section_action_container.right i {\n padding-right: 0; }\n .section_header_container .section_header .section_action_container.right_40 {\n float: right;\n width: 40%;\n text-align: right; }\n .section_header_container .section_header .section_action_container.right_40 i {\n padding-right: 0; }\n .section_header_container .section_header .section_action_container.right_60 {\n float: right;\n width: 60%;\n text-align: right; }\n .section_header_container .section_header .section_action_container.right_60 button {\n margin-left: 7px; }\n .section_header_container .section_header .section_action_container.right_wide {\n float: right;\n width: 75%;\n text-align: right; }\n .section_header_container .section_header .section_action_container.right_wide button {\n margin-left: 7px; }\n .section_header_container .section_header .section_action_container.section_action_btn {\n padding: 0; }\n .section_header_container .section_header .section_action_container.section_action_btn .uib-dropdown-menu {\n text-align: left; }\n .section_header_container .section_header .section_action_container.section_action_btn i {\n padding-right: 8px; }\n .section_header_container .section_header .section_action_container.section_action_btn i.align_right {\n padding-right: 0; }\n .section_header_container .section_header .section_action_container .check_action {\n display: inline-block; }\n .section_header_container .section_header .section_action_container .check_action input[type=\"checkbox\"] {\n margin-right: 10px; }\n .section_header_container .section_header .section_action_container .check_action .btn-group ul.dropdown-menu li .dropdown_menu_title {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: bold;\n white-space: nowrap; }\n .section_header_container .section_header .section_action_container .check_action .btn-group ul.dropdown-menu li a {\n color: #428bca; }\n\n.section_content_container.has_top_margin {\n margin-top: 20px; }\n\n.section_content_container .section_content.with_padding {\n padding-top: 0;\n padding-left: 20px;\n padding-right: 20px; }\n\n.section_content_container .section_content h3 {\n font-size: 14px;\n font-weight: bold;\n margin-top: 26px;\n margin-bottom: 6px; }\n\n.section_content_container .section_content .content_block {\n padding: 20px 30px 30px 72px; }\n .section_content_container .section_content .content_block h1 {\n font-weight: bold;\n font-size: 44px; }\n .section_content_container .section_content .content_block p {\n font-size: 18px; }\n\n.section_content_container .section_content .home_jump_nav_container {\n position: relative; }\n .section_content_container .section_content .home_jump_nav_container .home_jump_nav {\n margin: 0 auto;\n padding: 0 10%;\n position: relative;\n overflow: auto;\n text-align: center; }\n .section_content_container .section_content .home_jump_nav_container .home_jump_nav a {\n width: 25%;\n position: relative;\n overflow: auto;\n float: left;\n display: block;\n padding: 20px;\n font-size: 18px;\n text-decoration: none; }\n .section_content_container .section_content .home_jump_nav_container .home_jump_nav a i {\n padding-right: 12px; }\n .section_content_container .section_content .home_jump_nav_container .home_jump_nav a:hover {\n background-color: #eee;\n text-decoration: none; }\n\n.section_content_container .section_content .jumbotron {\n background: url(\"../images/kc_2.jpg\") no-repeat;\n height: 402px;\n margin-bottom: 0;\n padding: 30px 10%;\n color: #fff; }\n .section_content_container .section_content .jumbotron .home_hero_content_container {\n background-color: rgba(20, 20, 50, 0.3);\n margin: 0 18% 0 0;\n padding: 30px;\n border-radius: 10px; }\n .section_content_container .section_content .jumbotron .home_hero_content_container h1 {\n font-weight: bold;\n margin-top: 0;\n color: #fff; }\n .section_content_container .section_content .jumbotron .home_hero_content_container .btn {\n margin-top: 20px; }\n .section_content_container .section_content .jumbotron p {\n margin-bottom: 0; }\n\n.section_content_container .section_content .whats_new_container {\n padding: 0 10%; }\n .section_content_container .section_content .whats_new_container .whats_new h2 {\n font-weight: bold;\n margin: 0;\n padding: 20px 0;\n text-align: center;\n border-bottom: 1px solid #eee; }\n .section_content_container .section_content .whats_new_container .whats_new .content_col {\n margin-top: 10px; }\n .section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header {\n position: relative;\n overflow: auto; }\n .section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_left {\n position: relative;\n float: left; }\n .section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_left i {\n padding-top: 7px;\n padding-right: 10px;\n font-size: 48px; }\n .section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_left i.fa-cloud-upload {\n color: #6aa3d5; }\n .section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_left i.fa-exchange {\n color: #cc80ff; }\n .section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_left i.fa-check-square {\n color: #9bd772; }\n .section_content_container .section_content .whats_new_container .whats_new .content_col .content_col_header .content_col_header_right h3 {\n font-size: 20px;\n font-weight: bold; }\n .section_content_container .section_content .whats_new_container .whats_new .content_col .copy {\n clear: both;\n padding: 5px 30px 0 0;\n font-size: 16px; }\n\n.section_content_container .section_content .section_form_container {\n padding-top: 15px;\n padding-left: 15px; }\n\n.section_content_container .section_content .vert_table_scroll_container {\n height: 400px;\n overflow-y: scroll;\n border-bottom: 1px solid #ccc;\n background: url(\"../images/bg_first_td.png\") repeat-x top center; }\n\n.section_content_container .section_content .table_list_container {\n /* To embolden entries in the first column */\n /* For highlighting a sorted column */\n /* Buildis a scrollable table */\n /* Dataset List */\n /* Worksheet */\n /* Mapping */\n /* Matching Detail */ }\n .section_content_container .section_content .table_list_container.has_borders {\n border-left: 1px solid #ccc;\n border-right: 1px solid #ccc; }\n .section_content_container .section_content .table_list_container.remove_buildings_table {\n width: 100%; }\n .section_content_container .section_content .table_list_container table {\n margin-bottom: 10px; }\n .section_content_container .section_content .table_list_container table.has_no_btm_margin {\n margin-bottom: 0; }\n .section_content_container .section_content .table_list_container table.resizable {\n max-width: none;\n min-width: 100%; }\n .section_content_container .section_content .table_list_container table.fixed-layout {\n /* use in combination with th.ellipsis-resizable for resizable columns */\n table-layout: fixed; }\n .section_content_container .section_content .table_list_container table th, .section_content_container .section_content .table_list_container table td {\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n white-space: nowrap;\n padding: 6px 10px 5px;\n border-right: 1px solid #ccc; }\n .section_content_container .section_content .table_list_container table th.is_aligned_left, .section_content_container .section_content .table_list_container table td.is_aligned_left {\n text-align: left; }\n .section_content_container .section_content .table_list_container table th.is_aligned_right, .section_content_container .section_content .table_list_container table td.is_aligned_right {\n text-align: right; }\n .section_content_container .section_content .table_list_container table th.is_aligned_center, .section_content_container .section_content .table_list_container table td.is_aligned_center {\n text-align: center; }\n .section_content_container .section_content .table_list_container table th.whitespace, .section_content_container .section_content .table_list_container table td.whitespace {\n white-space: normal; }\n .section_content_container .section_content .table_list_container table th.check, .section_content_container .section_content .table_list_container table td.check {\n width: 33px; }\n .section_content_container .section_content .table_list_container table th.has_no_padding, .section_content_container .section_content .table_list_container table td.has_no_padding {\n padding: 0; }\n .section_content_container .section_content .table_list_container table th .subtitle, .section_content_container .section_content .table_list_container table td .subtitle {\n color: #7b7b87; }\n .section_content_container .section_content .table_list_container table th.compliance-check .checkbox, .section_content_container .section_content .table_list_container table td.compliance-check .checkbox {\n margin-top: 0;\n margin-bottom: 0;\n min-height: 0; }\n .section_content_container .section_content .table_list_container table th span.is_aligned_right, .section_content_container .section_content .table_list_container table td span.is_aligned_right {\n float: right; }\n .section_content_container .section_content .table_list_container table th.is_master, .section_content_container .section_content .table_list_container table td.is_master {\n padding: 0; }\n .section_content_container .section_content .table_list_container table th.is_master a, .section_content_container .section_content .table_list_container table td.is_master a {\n border-left: 3px solid #66b132;\n display: block;\n padding: 12px 10px;\n color: #222;\n text-decoration: none; }\n .section_content_container .section_content .table_list_container table th.is_master a:hover, .section_content_container .section_content .table_list_container table td.is_master a:hover {\n color: #000; }\n .section_content_container .section_content .table_list_container table th.is_not_master, .section_content_container .section_content .table_list_container table td.is_not_master {\n padding: 0; }\n .section_content_container .section_content .table_list_container table th.is_not_master a, .section_content_container .section_content .table_list_container table td.is_not_master a {\n color: #b3b3b3;\n padding: 12px 10px;\n display: block;\n text-decoration: none; }\n .section_content_container .section_content .table_list_container table th.is_not_master a:hover, .section_content_container .section_content .table_list_container table td.is_not_master a:hover {\n border-left: 3px solid #999;\n color: #000; }\n .section_content_container .section_content .table_list_container table th {\n text-transform: uppercase;\n background: #cdcdcd;\n text-shadow: 0 1px 0 white;\n border-bottom: 1px solid #b3b3b3;\n border-right: 1px solid #b3b3b3; }\n .section_content_container .section_content .table_list_container table th.ellipsis {\n max-width: 80px;\n text-overflow: ellipsis;\n /* Required for text-overflow to do anything */\n white-space: nowrap;\n overflow: hidden; }\n .section_content_container .section_content .table_list_container table th.ellipsis-resizable {\n /* use in combination with table.fixed-layout for resizable columns */\n min-width: 80px;\n text-overflow: ellipsis;\n /* Required for text-overflow to do anything */\n white-space: nowrap;\n overflow: hidden; }\n .section_content_container .section_content .table_list_container table th.sorted {\n position: relative;\n white-space: nowrap;\n background: #428bca;\n border-bottom: 1px solid #428bca;\n border-right: 1px solid #428bca;\n color: #fff;\n text-shadow: none; }\n .section_content_container .section_content .table_list_container table th.sorted .subtitle {\n color: #b9d4ec; }\n .section_content_container .section_content .table_list_container table th.sort_asc:after {\n position: absolute;\n font-family: FontAwesome;\n top: 7px;\n right: 7px;\n content: \"\\f0dd\"; }\n .section_content_container .section_content .table_list_container table th.sort_desc:after {\n position: absolute;\n font-family: FontAwesome;\n top: 7px;\n right: 7px;\n content: \"\\f0de\"; }\n .section_content_container .section_content .table_list_container table th.sub_head {\n background: #e1e1e1;\n font-weight: normal; }\n .section_content_container .section_content .table_list_container table th.sub_head .col-xs-6 {\n padding-right: 0;\n padding-left: 0; }\n .section_content_container .section_content .table_list_container table th.sub_head .active {\n background-color: #fff7d7; }\n .section_content_container .section_content .table_list_container table th.sub_head .btn-group {\n text-transform: capitalize; }\n .section_content_container .section_content .table_list_container table th.sub_head .btn-group ul.uib-dropdown-menu li {\n text-align: left; }\n .section_content_container .section_content .table_list_container table th.sub_head .btn-group ul.uib-dropdown-menu li a {\n color: #428bca; }\n .section_content_container .section_content .table_list_container table th.sub_head.sub_org {\n padding-left: 30px;\n border-left: none;\n border-right: none;\n border-bottom: 1px solid #eee;\n text-transform: none;\n background-color: #fff; }\n .section_content_container .section_content .table_list_container table th.sub_head.sub_org.right {\n text-align: right;\n padding-right: 10px; }\n .section_content_container .section_content .table_list_container table th.sub_head.sub_org.right i {\n padding-right: 6px; }\n .section_content_container .section_content .table_list_container table th.sub_head.sub_org.right a {\n visibility: hidden;\n padding: 0 10px; }\n .section_content_container .section_content .table_list_container table th.sub_head.sub_org.right i.fa-cog {\n color: #ccc; }\n .section_content_container .section_content .table_list_container table th.sub_head.sub_org.right:hover a {\n visibility: visible; }\n .section_content_container .section_content .table_list_container table th.sub_head.sub_org.right:hover i.fa-cog {\n color: #4a4a52; }\n .section_content_container .section_content .table_list_container table th.source_data {\n background-color: #7b7b87;\n color: #fff;\n text-shadow: none;\n border: none;\n font-size: 18px;\n text-align: left;\n text-transform: none;\n border-radius: 6px 6px 0 0; }\n .section_content_container .section_content .table_list_container table th.source_data.blank {\n background-color: #fff;\n border-right: none;\n border-bottom: none;\n border-right: none;\n border-radius: 0; }\n .section_content_container .section_content .table_list_container table th.source_data select {\n color: #222;\n font-weight: normal; }\n .section_content_container .section_content .table_list_container table th.mid_column {\n background-color: #fff;\n border-right: none;\n border-top: none;\n border-right: none;\n padding: 0 4px; }\n .section_content_container .section_content .table_list_container table th.mid_column div {\n padding: 5px 5px;\n background-color: #7b7b87;\n color: #fff;\n text-shadow: none;\n border-radius: 6px 6px 0 0; }\n .section_content_container .section_content .table_list_container table th input {\n font-weight: normal;\n min-width: 50px; }\n .section_content_container .section_content .table_list_container table th.is_master {\n padding: 0; }\n .section_content_container .section_content .table_list_container table th.is_master a {\n padding: 6px 10px 5px; }\n .section_content_container .section_content .table_list_container table th.is_not_master {\n padding: 0; }\n .section_content_container .section_content .table_list_container table th.is_not_master a {\n padding: 6px 10px 5px;\n color: #666666; }\n .section_content_container .section_content .table_list_container table th.account_pending {\n background-color: #fcf8e3;\n border-bottom: 1px solid #ccc; }\n .section_content_container .section_content .table_list_container table th.account_pending.left {\n border-right: none; }\n .section_content_container .section_content .table_list_container table th.condensed_head {\n min-width: 70px;\n white-space: normal;\n text-align: center; }\n .section_content_container .section_content .table_list_container table td {\n border-top: none;\n border-bottom: 1px solid #e7e7e7;\n vertical-align: middle;\n /* max-width: 200px; */ }\n .section_content_container .section_content .table_list_container table td .progress {\n margin-bottom: 0; }\n .section_content_container .section_content .table_list_container table td .table_name_link {\n float: left; }\n .section_content_container .section_content .table_list_container table td .table_action_link {\n float: right;\n padding: 0 4px; }\n .section_content_container .section_content .table_list_container table td label.checkbox_fill_area {\n display: block;\n cursor: pointer;\n padding: 6px 0 0; }\n .section_content_container .section_content .table_list_container table td.parent_org {\n font-size: 18px; }\n .section_content_container .section_content .table_list_container table td.account_org {\n padding-left: 20px;\n border-right: none; }\n .section_content_container .section_content .table_list_container table td.account_org i {\n padding-right: 6px; }\n .section_content_container .section_content .table_list_container table td.account_org.left {\n padding-left: 40px; }\n .section_content_container .section_content .table_list_container table td.account_org.right {\n text-align: right; }\n .section_content_container .section_content .table_list_container table td.account_org.right a {\n visibility: hidden;\n padding: 0 10px; }\n .section_content_container .section_content .table_list_container table td.account_org.right i.fa-cog {\n color: #ccc; }\n .section_content_container .section_content .table_list_container table td.account_org.right:hover a {\n visibility: visible; }\n .section_content_container .section_content .table_list_container table td.account_org.right:hover i.fa-cog {\n color: #4a4a52; }\n .section_content_container .section_content .table_list_container table td.account_pending {\n background-color: #fff; }\n .section_content_container .section_content .table_list_container table td.account_pending.left {\n border-right: none;\n font-weight: normal !important; }\n .section_content_container .section_content .table_list_container table td.align_to_top {\n vertical-align: top; }\n .section_content_container .section_content .table_list_container table td.note label {\n margin-right: 2px; }\n .section_content_container .section_content .table_list_container table td.note i {\n padding-right: 2px; }\n .section_content_container .section_content .table_list_container table td.note a.note_edit {\n padding-left: 2px; }\n .section_content_container .section_content .table_list_container table td.ellipsis {\n max-width: 80px;\n text-overflow: ellipsis;\n /* Required for text-overflow to do anything */\n white-space: nowrap;\n overflow: hidden; }\n .section_content_container .section_content .table_list_container table.sortable th {\n cursor: pointer; }\n .section_content_container .section_content .table_list_container table.sortable th::-moz-selection {\n background: transparent; }\n .section_content_container .section_content .table_list_container table.sortable th::selection {\n background: transparent; }\n .section_content_container .section_content .table_list_container table.sortable th::-moz-selection {\n background: transparent; }\n .section_content_container .section_content .table_list_container .table_highlight_first tbody tr td:nth-child(1) {\n font-weight: bold;\n width: 20%;\n min-width: 280px; }\n .section_content_container .section_content .table_list_container .table_highlight_first tbody tr td:nth-child(1).has_no_min_width {\n min-width: 0; }\n .section_content_container .section_content .table_list_container .table-striped tbody tr:nth-child(odd) td.sorted {\n background: #f3f3f3; }\n .section_content_container .section_content .table_list_container .table-striped tbody tr:nth-child(even) td.sorted {\n background: #fafafa; }\n .section_content_container .section_content .table_list_container .table-striped tbody tr td h3 {\n font-weight: 400;\n font-size: 20px;\n margin: 10px 0; }\n .section_content_container .section_content .table_list_container .table-striped thead tr th:last-child, .section_content_container .section_content .table_list_container .table-striped tbody tr td:last-child {\n border-right: none; }\n .section_content_container .section_content .table_list_container .table-striped tbody tr td.high_confidence {\n background-color: #66b132; }\n .section_content_container .section_content .table_list_container .table-striped tbody tr td.med_confidence {\n background-color: #ffc40d; }\n .section_content_container .section_content .table_list_container .table-striped tbody tr td.low_confidence {\n background-color: #ff4d4d; }\n .section_content_container .section_content .table_list_container.table_scroll {\n overflow-x: scroll;\n overflow-y: visible;\n margin-left: 24.9%; }\n .section_content_container .section_content .table_list_container.table_scroll table {\n border-collapse: separate; }\n .section_content_container .section_content .table_list_container.table_scroll table th, .section_content_container .section_content .table_list_container.table_scroll table td {\n overflow: hidden; }\n .section_content_container .section_content .table_list_container.table_scroll table .sub_head .check_row {\n height: 49px; }\n .section_content_container .section_content .table_list_container.table_scroll .table-striped thead tr th:nth-child(1), .section_content_container .section_content .table_list_container.table_scroll .table-striped tbody tr td:nth-child(1) {\n position: absolute;\n top: auto;\n left: 0;\n width: 5%; }\n .section_content_container .section_content .table_list_container.table_scroll .table-striped thead tr th:nth-child(2), .section_content_container .section_content .table_list_container.table_scroll .table-striped tbody tr td:nth-child(2) {\n position: absolute;\n top: auto;\n left: 5%;\n width: 8%; }\n .section_content_container .section_content .table_list_container.table_scroll .table-striped thead tr th:nth-child(3), .section_content_container .section_content .table_list_container.table_scroll .table-striped tbody tr td:nth-child(3) {\n position: absolute;\n top: auto;\n left: 13%;\n width: 12%; }\n .section_content_container .section_content .table_list_container.dataset_list {\n overflow-x: auto; }\n .section_content_container .section_content .table_list_container.dataset_list .replace_file_button {\n float: right; }\n .section_content_container .section_content .table_list_container.dataset_list .delete_link {\n float: right; }\n .section_content_container .section_content .table_list_container.worksheet td.sub_head {\n background-color: #f7f6ef;\n border-right: none;\n color: #9595a0; }\n .section_content_container .section_content .table_list_container.worksheet .data_file_name {\n padding: 0 20px; }\n .section_content_container .section_content .table_list_container.worksheet .table-striped thead tr th:nth-child(1), .section_content_container .section_content .table_list_container.worksheet .table-striped tbody tr td:nth-child(1) {\n border-right: none; }\n .section_content_container .section_content .table_list_container.worksheet .table-striped thead tr th:nth-child(2), .section_content_container .section_content .table_list_container.worksheet .table-striped tbody tr td:nth-child(2) {\n text-align: right; }\n .section_content_container .section_content .table_list_container.worksheet .table-striped thead tr th:nth-child(2) .btn-group, .section_content_container .section_content .table_list_container.worksheet .table-striped tbody tr td:nth-child(2) .btn-group {\n float: right; }\n .section_content_container .section_content .table_list_container.worksheet i.fa-check, .section_content_container .section_content .table_list_container.worksheet i.fa-check-circle {\n text-decoration: none;\n color: #66b132; }\n .section_content_container .section_content .table_list_container.mapping select option {\n word-spacing: normal; }\n .section_content_container .section_content .table_list_container.mapping tr.concat_parent {\n background-color: #f5f4ec; }\n .section_content_container .section_content .table_list_container.mapping tr.concat_parent td {\n color: rgba(0, 0, 0, 0.5); }\n .section_content_container .section_content .table_list_container.mapping tr.concat_parent td:nth-child(1) {\n background-color: #fff; }\n .section_content_container .section_content .table_list_container.matching_detail .table-striped tbody tr.info td, .section_content_container .section_content .table_list_container.matching_detail .table-striped tbody tr.success td {\n font-weight: bold; }\n .section_content_container .section_content .table_list_container.matching_detail td.potential_matches {\n color: #6e6e7a; }\n .section_content_container .section_content .table_list_container.matching_detail td.potential_matches span {\n padding: 0 5px; }\n\n.section_content_container .section_content .table_footer {\n position: relative;\n overflow: auto;\n padding-bottom: 20px; }\n .section_content_container .section_content .table_footer .counts {\n float: left;\n text-align: center;\n margin-top: 17px; }\n .section_content_container .section_content .table_footer .display_number_entries {\n position: relative;\n margin-top: 10px; }\n .section_content_container .section_content .table_footer .display_number_entries .display_number_entries_text {\n margin: 7px 5px 0;\n float: left; }\n .section_content_container .section_content .table_footer .display_number_entries .display_number_entries_select {\n margin-top: 3px;\n float: left; }\n .section_content_container .section_content .table_footer .pager_container {\n float: right;\n margin-top: 10px;\n text-align: right; }\n .section_content_container .section_content .table_footer .pager_container ul.pager, .section_content_container .section_content .table_footer .pager_container ul.pagination {\n float: right;\n margin: 0; }\n .section_content_container .section_content .table_footer .pager_container ul.pager li.disabled, .section_content_container .section_content .table_footer .pager_container ul.pagination li.disabled {\n cursor: not-allowed; }\n .section_content_container .section_content .table_footer .pager_container ul.pager li.disabled > a, .section_content_container .section_content .table_footer .pager_container ul.pagination li.disabled > a {\n pointer-events: none; }\n .section_content_container .section_content .table_footer .table_footer_right {\n float: right;\n margin-top: 10px; }\n .section_content_container .section_content .table_footer.has_no_padding {\n padding: 0; }\n\n.section_bottom_container {\n padding: 5px 0;\n margin: 0 auto;\n overflow: auto; }\n .section_bottom_container i {\n padding-right: 8px; }\n\n.badge_menu {\n background-color: #4a4a52; }\n\n.qq-drop-processing {\n display: none; }\n\n@media (min-width: 1042px) {\n .modal-lg {\n width: 950px; } }\n\n@media (min-width: 1300px) {\n .modal-lg {\n width: 1230px; } }\n\n.modal-header .close {\n margin-top: -14px;\n margin-right: -63px;\n padding: 8px 11px;\n border-radius: 20px;\n font-size: 24px;\n background-color: #fff;\n opacity: 1;\n font-weight: normal;\n line-height: 0.5;\n color: #43434d; }\n .modal-header .close:hover {\n color: #ff4d4d; }\n\n.modal-header .modal-links {\n font-size: 18px; }\n\n.modal-body.no_bottom_padding {\n padding-bottom: 0; }\n\n.modal-body .alert {\n margin-left: 15px;\n margin-right: 15px; }\n\n.modal-body .form-group p {\n margin: 0 0 8px;\n font-weight: bold;\n font-size: 14px; }\n\n.modal-body .form-group .column_container {\n height: 290px;\n overflow-x: scroll; }\n\n.modal-body .form-group ul.column {\n padding-left: 0;\n list-style-type: none; }\n\n.modal-body .form-group .checkbox {\n margin-bottom: 6px;\n padding-left: 26px;\n padding-top: 6px;\n padding-bottom: 6px;\n background-color: #eee;\n border-radius: 5px; }\n .modal-body .form-group .checkbox.complianceCheckbox {\n padding-top: 0;\n padding-left: 20px;\n background-color: #fff; }\n .modal-body .form-group .checkbox label {\n display: block; }\n\n.modal-body .form-group table th label {\n margin-left: 6px; }\n\n.modal-body .form-group table th .search-icon {\n float: right;\n position: relative;\n top: 21px;\n right: 8px; }\n\n.modal-body .form-group_faux_horizontal {\n padding-left: 0; }\n\n.modal-footer div.row {\n margin-top: 20px;\n margin-bottom: 20px;\n padding-left: 15px;\n padding-right: 15px; }\n .modal-footer div.row button {\n float: none; }\n\n.modal-footer .btn {\n min-width: 90px; }\n\n#newCustomViewModal .modal-body {\n padding-bottom: 0; }\n\n.inset_badge {\n padding: 0; }\n\n.badge.left {\n padding: 0 0 0 7px; }\n\n.badge.right {\n margin-left: 3px; }\n\n.badge.to_do {\n background-color: #90f; }\n .badge.to_do .left {\n background-color: #90f; }\n .badge.to_do .right {\n background-color: #b84dff; }\n\n.badge.done {\n background-color: #66b132; }\n .badge.done .left {\n background-color: #66b132; }\n .badge.done .right {\n background-color: #8dd25e; }\n\n.badge.high_confidence {\n background-color: #66b132; }\n .badge.high_confidence .left {\n background-color: #66b132; }\n .badge.high_confidence .right {\n background-color: #8dd25e; }\n\n.badge.med_confidence {\n background-color: #ffc40d; }\n .badge.med_confidence .left {\n background-color: #ffc40d; }\n .badge.med_confidence .right {\n background-color: #ffd75a; }\n\n.badge.low_confidence {\n background-color: #ff4d4d; }\n .badge.low_confidence .left {\n background-color: #ff4d4d; }\n .badge.low_confidence .right {\n background-color: #ff9a9a; }\n\n.matchmaking {\n color: black;\n padding-left: 10px; }\n\n.is_underlined {\n text-decoration: underline; }\n\ndiv[sd-uploader][disabled] {\n pointer-events: none; }\n div[sd-uploader][disabled] .qq-upload-button {\n opacity: 0.3; }\n\n.qq-upload-button {\n font-weight: bold; }\n\n.alert .alert_instructions {\n font-size: 14px;\n margin-bottom: 13px; }\n\n.tcm_field {\n min-width: 165px; }\n\n.progress_bar_container.progressbar_fill_area {\n padding: 100px 25%; }\n\n.progress_bar_container .progress_bar_copy_top {\n padding: 0 0 5px 5px; }\n\n.progress_bar_container .progress {\n margin-bottom: 0; }\n\n.progress_bar_container .progress_bar_copy_bottom {\n padding: 5px 0 0 5px; }\n\n.btn-sm, .btn-xs {\n font-size: 13px; }\n\n.table_header_persistent .table {\n margin-bottom: 0; }\n .table_header_persistent .table thead > tr > th {\n border-bottom: 1px solid #ccc; }\n\n.table_body_persistent {\n position: relative;\n height: 205px;\n overflow-y: scroll;\n border-right: 1px solid #ccc;\n border-left: 1px solid #ccc;\n border-bottom: 1px solid #ccc; }\n\n.tbody-striped > tbody:nth-child(odd) td, .tbody-striped > tbody:nth-child(odd) > th {\n background-color: #F9F9F9; }\n\n.data-quality-error td:last-child {\n background-color: #FFB7B7 !important; }\n\n.data-quality-warning td:last-child {\n background-color: #FDF4BF !important; }\n\nselect.error-bg {\n background-color: #FFB7B7; }\n\nselect.warning-bg {\n background-color: #FDF4BF; }\n\nselect > option {\n background-color: #F7F7F7; }\n\n.export_radio .radio-inline input[type=radio] {\n margin-top: 2px; }\n\n.input-sm {\n font-size: 13px; }\n\n.form-group .matching_toggle label {\n font-size: 14px; }\n\n.form-group .matching_toggle .radio-inline input[type=radio] {\n margin-top: 2px; }\n\n.number_unmatched {\n color: rgba(34, 34, 34, 0.5); }\n\n.tip, .important-tip {\n position: relative; }\n .tip:before, .important-tip:before {\n font-size: 18px;\n padding: 4px 8px;\n -webkit-transform: rotate(-5deg) translateX(-25px) translateY(-25px);\n content: 'Tip!';\n background: #5bc0de;\n line-height: 24px;\n color: #FFF;\n position: absolute;\n left: -26px;\n top: 0;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n border-radius: 6px; }\n .tip i.fa, .important-tip i.fa {\n padding-right: 0; }\n\n/* A more subtle alternative to the above 'tip' class */\n.tip-subtle {\n position: relative;\n margin-top: 5px;\n margin-left: 35px;\n margin-bottom: 0;\n color: #999; }\n .tip-subtle:before {\n font-size: 12px;\n font-family: FontAwesome;\n padding: 4px 8px 4px 8px;\n content: '\\f129';\n background: #5bc0de;\n line-height: 12px;\n color: #FFF;\n position: absolute;\n left: -30px;\n top: 0;\n border-radius: 6px; }\n .tip-subtle i.fa {\n padding-right: 0; }\n\n.important-tip:before {\n top: -10px;\n background: #ff4d4d;\n content: 'Important!'; }\n\n.ignored_row td {\n color: #999; }\n\n.footer {\n margin-top: 100px;\n padding: 30px 5%;\n width: 100%;\n position: relative;\n border-top: 1px solid #ccc; }\n .footer table {\n width: 100%;\n overflow: hidden;\n text-align: center; }\n .footer table td {\n width: 33.333%; }\n .footer .row .col-md-4 {\n text-align: center;\n background-color: gray; }\n\n.green_button .btn-primary {\n background-color: #66b132;\n border-color: #5b9d2c; }\n .green_button .btn-primary:hover {\n background-color: #5b9d2c; }\n\n.orange_button .btn-primary {\n background-color: #fc882a;\n border-color: #fc7a11; }\n .orange_button .btn-primary:hover {\n background-color: #fc7a11; }\n\n.ui-sortable .ui-sortable-handle {\n cursor: move; }\n\n/* STYLES FOR REPORTS */\n/* Styles for building reports page */\n.building-reports {\n /* The section containing the UI controls for updating the charts */\n /* This is a small floating box\n above the chart that shows the chart's status\n when loading or when it has no data. */ }\n .building-reports .chart-inputs {\n padding: 10px;\n border-radius: .5em;\n background-color: #d8e3ed;\n /* This is a fix for a bug in bootstrap 3.1\n (fixed in 3.2, but we're using 3.1 right now)\n We can remove when we update.\n */ }\n .building-reports .chart-inputs label {\n margin-right: 5px;\n color: #222; }\n .building-reports .chart-inputs .form-group {\n margin-left: 20px; }\n .building-reports .chart-inputs .input-group {\n display: inline-table;\n vertical-align: middle; }\n .building-reports .chart-inputs .input-group .input-group-addon, .building-reports .chart-inputs .input-group .input-group-btn, .building-reports .chart-inputs .input-group .form-control {\n width: auto !important;\n max-width: 120px; }\n .building-reports .status-message {\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -30px 0 0 -60px;\n text-align: center;\n width: 120px;\n padding-top: 10px;\n padding-bottom: 10px;\n background-color: #FFF;\n border: 1px solid #F1F1F1;\n border-radius: 5px; }\n .building-reports .chart-holder {\n border-radius: .5em;\n background-color: #F6F6F6;\n border: 1px solid #F6F6F6;\n position: relative; }\n .building-reports .reportingTableHolder {\n margin-top: 20px;\n padding: 0 60px 0 105px; }\n .building-reports .progress {\n margin: 5px 10px 0; }\n\n.tree-node {\n border: 1px solid #dae2ea;\n background: #f8faff;\n color: #7c9eb2; }\n\n.tree-node-content {\n margin: 10px; }\n\n.fa-arrows {\n padding-right: 7px;\n color: #444; }\n\n.tree-handle {\n padding: 10px;\n background: #428bca;\n color: #FFF;\n margin-right: 10px; }\n\n.angular-ui-tree-placeholder {\n background: #f0f9ff;\n border: 2px dashed #bed2db;\n box-sizing: border-box; }\n\n/* STYLES FOR LABELS AND RELATED */\n/* Holds inline form for creating new labels */\n.newLabelInput {\n margin: 20px 0;\n border: 1px solid #EEE;\n padding: 10px 10px 5px 10px;\n border-radius: 5px;\n background-color: #F1F1F1; }\n\n#label_admin {\n /* Get xeditable fields to extend 100% of td */ }\n #label_admin .table_list_container {\n border: 1px solid #cdcdcd; }\n #label_admin .sectionLabel {\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif; }\n #label_admin .tableHeader {\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n white-space: nowrap;\n padding: 6px 10px 5px 10px;\n text-transform: uppercase;\n background-color: #cdcdcd !important;\n text-shadow: 0 1px 0 white;\n border-bottom: 1px solid #b3b3b3; }\n #label_admin form[editable-form] > div {\n margin: 10px 0; }\n #label_admin .editable-wrap {\n width: 100%; }\n\n.label-edit-section {\n margin: 5px 10px 10px 20px; }\n .label-edit-section .label-action {\n display: inline-block; }\n .label-edit-section .label-action .label-edit-text {\n margin-right: 20px; }\n .label-edit-section .label-action a {\n margin-right: 20px; }\n .label-edit-section .label-container {\n display: inline-block; }\n .label-edit-section .label {\n padding: .6em .6em .5em .6em;\n display: inline-block;\n margin-bottom: 5px; }\n\n.label {\n margin-right: 5px; }\n\n/* Styles for update labels modal */\n#update-building-labels-modal .labels-status-msg {\n min-height: 150px;\n display: -ms-flexbox;\n display: flex;\n height: 100%;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center; }\n\n#update-building-labels-modal .add_text, #update-building-labels-modal .edit_text {\n font-weight: bold;\n margin-bottom: 5px; }\n\n#update-building-labels-modal .edit_text {\n margin-left: 10px; }\n\n#update-building-labels-modal .add-label-row {\n margin-right: -5px;\n margin-bottom: 20px; }\n\n#update-building-labels-modal .btn-default {\n min-width: 70px; }\n\n#update-building-labels-modal .table-list-container {\n border: 1px solid #EEE;\n overflow-y: auto;\n max-height: 350px;\n margin-bottom: 10px; }\n #update-building-labels-modal .table-list-container th, #update-building-labels-modal .table-list-container td {\n border: 0; }\n\n/* Cycle admin */\n#cycle_admin {\n /* Get xeditable fields to extend 100% of td */ }\n #cycle_admin .newCycleInput {\n margin: 20px 0;\n border: 1px solid #EEE;\n padding: 10px 10px 5px 10px;\n border-radius: 5px;\n background-color: #F1F1F1; }\n #cycle_admin .table_list_container {\n border: 1px solid #cdcdcd; }\n #cycle_admin .sectionCycle {\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif; }\n #cycle_admin .tableHeader {\n font-family: \"PT Sans Narrow\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n white-space: nowrap;\n padding: 6px 10px 5px 10px;\n text-transform: uppercase;\n background-color: #cdcdcd !important;\n text-shadow: 0 1px 0 white;\n border-bottom: 1px solid #b3b3b3; }\n #cycle_admin form[editable-form] > div {\n margin: 10px 0; }\n #cycle_admin .editable-wrap {\n width: 100%; }\n\n.cycle-edit-section {\n margin: 5px 10px 10px 20px; }\n .cycle-edit-section .cycle-action {\n display: inline-block; }\n .cycle-edit-section .cycle-action .label-edit-text {\n margin-right: 20px; }\n .cycle-edit-section .cycle-action a {\n margin-right: 20px; }\n .cycle-edit-section .cycle-container {\n display: inline-block; }\n .cycle-edit-section .cycle {\n padding: .6em .6em .5em .6em;\n display: inline-block;\n margin-bottom: 5px; }\n\n/* DMcQ: Once Bluesky refactoring is complete, remove old #update-building-labels-modal above */\n#update-property-labels-modal .labels-status-msg {\n min-height: 150px;\n display: -ms-flexbox;\n display: flex;\n height: 100%;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center; }\n\n#update-property-labels-modal .add_text, #update-property-labels-modal .edit_text {\n font-weight: bold;\n margin-bottom: 5px; }\n\n#update-property-labels-modal .edit_text {\n margin-left: 10px; }\n\n#update-property-labels-modal .add-label-row {\n margin-right: -5px;\n margin-bottom: 20px; }\n\n#update-property-labels-modal .btn-default {\n min-width: 70px; }\n\n#update-property-labels-modal .table-list-container {\n border: 1px solid #EEE;\n overflow-y: auto;\n max-height: 350px;\n margin-bottom: 10px; }\n #update-property-labels-modal .table-list-container th, #update-property-labels-modal .table-list-container td {\n border: 0; }\n\n/* Styles to override ngInputTags to get correct tag colors */\ntags-input .tags {\n min-width: 550px; }\n\n.tag-primary {\n border-color: #428bca !important;\n background: #428bca !important; }\n\n.tag-success {\n border-color: #5cb85c !important;\n background: #5cb85c !important; }\n\n.tag-info {\n border-color: #5bc0de !important;\n background: #5bc0de !important; }\n\n.tag-warning {\n border-color: #f0ad4e !important;\n background: #f0ad4e !important; }\n\n.tag-danger {\n border-color: #d43f3a !important;\n background: #d43f3a !important; }\n\ngs-input .tags .tag-item .remove-button {\n color: #FFF; }\n\n/* NOTIFICATIONS */\n.ui-notification {\n background-color: #EEE;\n color: #000;\n border-left: thick solid #428bca; }\n .ui-notification.warning {\n border-left: thick solid #fcf8e3; }\n .ui-notification.error {\n border-left: thick solid #f2dede; }\n .ui-notification.success {\n border-left: thick solid #dff0d8; }\n .ui-notification.info {\n border-left: thick solid #d9edf7; }\n .ui-notification:hover {\n opacity: 0.7; }\n\n/* OTHER */\n/* Styles for building list controls and table */\n.inventory-list-controls {\n padding: 20px 10px; }\n .inventory-list-controls .form-group {\n margin-right: 20px;\n margin-bottom: 0; }\n .inventory-list-controls + .buildingListControls {\n padding-top: 0; }\n\n/* Styles for building page */\n#building-fields {\n min-width: 275px; }\n\n.glyphicon.spinning {\n animation: spin 1s infinite linear;\n -webkit-animation: spin2 1s infinite linear; }\n\n@keyframes spin {\n from {\n transform: scale(1) rotate(0deg); }\n to {\n transform: scale(1) rotate(360deg); } }\n\n/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */\n/* Styles for mods to blue sky building list. /\n/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */\n/* Placing these style here for initial dev. These should be integrated into styles above once approved */\n/* Tabs: The section_tab_container defined above doesn't seem to fit well with how we wants tabs to\n appear in the building list. So defining a style here that can hopefully be refactored into\n the styles above at a later point. */\n.inventory-list-tab-container, .matching-tab-container {\n margin-left: 10px;\n margin-bottom: -2px; }\n .inventory-list-tab-container .item-count, .matching-tab-container .item-count {\n float: right;\n margin-right: 20px;\n margin-top: 10px; }\n .inventory-list-tab-container .nav-tabs, .matching-tab-container .nav-tabs {\n position: relative;\n margin-bottom: -2px;\n z-index: 99; }\n .inventory-list-tab-container .nav-tabs > li, .matching-tab-container .nav-tabs > li {\n margin-right: 4px; }\n .inventory-list-tab-container .nav-tabs > li > a, .matching-tab-container .nav-tabs > li > a {\n background-color: #D6D6D6;\n border: 1px solid #bbb;\n color: #222;\n border-radius: 6px 6px 0 0; }\n .inventory-list-tab-container .nav-tabs > li > a:hover, .matching-tab-container .nav-tabs > li > a:hover {\n background-color: #428bca;\n color: #FFF; }\n .inventory-list-tab-container .nav-tabs > li.active > a, .inventory-list-tab-container .nav-tabs > li.active > a:hover, .matching-tab-container .nav-tabs > li.active > a, .matching-tab-container .nav-tabs > li.active > a:hover {\n background-color: #F1F1F1;\n border: 1px solid #D1D1D1;\n font-weight: bold;\n color: #000;\n border-bottom: 1px solid #F1F1F1; }\n\n.matching-tab-container {\n margin-bottom: -1px; }\n .matching-tab-container .nav-tabs {\n border-bottom: 0; }\n .matching-tab-container .nav-tabs > li > a {\n background-color: #F1F1F1;\n border: 1px solid #D1D1D1;\n border-bottom: 0; }\n .matching-tab-container .nav-tabs > li.active > a, .matching-tab-container .nav-tabs > li.active > a:hover {\n background-color: #7B7B87;\n border: 1px solid #D1D1D1;\n border-bottom: 1px solid #7B7B87;\n color: #FFF;\n font-weight: bold; }\n\n.matching-detail-container {\n padding: 0 0 15px 15px; }\n .matching-detail-container .paginate {\n padding: 5px 15px 0; }\n\n.data-quality-tab-container {\n margin-bottom: 0; }\n .data-quality-tab-container .nav-tabs {\n border-bottom: 0; }\n .data-quality-tab-container .nav-tabs > li {\n margin-right: 4px; }\n .data-quality-tab-container .nav-tabs > li > a {\n background-color: #F1F1F1;\n border: 1px solid #D1D1D1;\n border-bottom: 0;\n color: #222; }\n .data-quality-tab-container .nav-tabs > li > a:hover {\n background-color: #428bca;\n color: #FFF; }\n .data-quality-tab-container .nav-tabs > li.active > a, .data-quality-tab-container .nav-tabs > li.active > a:hover {\n background-color: #CDCDCD;\n border: 1px solid #D1D1D1;\n border-bottom: 0;\n color: #000;\n font-weight: bold; }\n\n.table_item_detail {\n margin: 0 10px;\n border: 1px solid #F1F1F1; }\n .table_item_detail td {\n overflow: hidden;\n text-overflow: ellipsis; }\n\n.highlight {\n background-color: #fff7d7; }\n\n#swagger-frame {\n height: calc(100vh - 60px);\n width: 100%; }\n\n/* UI Grid modifications */\n/* Remove gradient on top bar. It's distracting and decreases legibility */\n.ui-grid-top-panel {\n background: #F1F1F1;\n filter: none; }\n\n.ui-grid-row-header-link {\n height: 30px;\n width: 30px; }\n .ui-grid-row-header-link > a {\n display: block; }\n\n.ui-grid-row:not(:last-child) .ui-grid-row-header-link {\n border-bottom: solid 1px #d4d4d4; }\n\n.ui-grid-cell-contents {\n font-weight: normal; }\n .ui-grid-cell-contents.pinnable[disabled] {\n color: #222;\n opacity: 0.1; }\n\n.ui-grid-row:nth-child(odd) .ui-grid-cell .inventory-settings-cell::after {\n color: #d7d7d7; }\n\n.ui-grid-row:nth-child(even) .ui-grid-cell .inventory-settings-cell::after {\n color: #cbcbcb; }\n\n.ui-grid-row:nth-child(odd) .ui-grid-cell {\n background-color: #fdfdfd; }\n\n.ui-grid-row:nth-child(even) .ui-grid-cell {\n background-color: #f3f3f3; }\n\n.ui-grid-row:nth-child(odd):hover .ui-grid-cell {\n background-color: #fdfdfd; }\n\n.ui-grid-row:nth-child(even):hover .ui-grid-cell {\n background-color: #f3f3f3; }\n\n.ui-grid-row.ui-grid-row-selected:nth-child(odd) > [ui-grid-row] > .ui-grid-cell {\n background-color: #fdfdfd; }\n\n.ui-grid-row.ui-grid-row-selected:nth-child(even) > [ui-grid-row] > .ui-grid-cell {\n background-color: #f3f3f3; }\n\n.inventory-settings-cell::after {\n content: attr(data-after-content);\n float: right;\n opacity: 0;\n transition: opacity .25s ease-in-out; }\n\n.inventory-settings-cell:hover::after {\n opacity: 1; }\n\n.ui-grid-row:not(.ui-grid-tree-header-row) {\n /*.ui-grid-cell-contents {\n color: #444;\n }*/\n /*&:nth-child(odd) .ui-grid-cell {\n background-color: #fbfbf3;\n }\n &:nth-child(even) .ui-grid-cell {\n background-color: #f8f6e7;\n }*/ }\n\n#nav-inventory span {\n padding-right: 12px; }\n #nav-inventory span > svg {\n height: 18px; }\n #nav-inventory span > svg path {\n fill: #337ab7; }\n\n#nav-inventory:hover span > svg path {\n fill: #23527c; }\n\n.ui-grid-draggable-row-target {\n opacity: 0.5 !important; }\n\n.ui-grid-draggable-row {\n cursor: -webkit-grab;\n cursor: grab;\n height: 30px; }\n\n.ui-grid-draggable-row-over {\n position: relative; }\n .ui-grid-draggable-row-over:before {\n content: \"\";\n display: block;\n position: absolute;\n left: 0;\n width: 100%;\n border-bottom: 2px dashed #AAA; }\n .ui-grid-draggable-row-over--above:before {\n top: 0; }\n .ui-grid-draggable-row-over--below:before {\n bottom: 0; }\n\n#inventory-actions-dropdown li, #inventory-detail-edit li {\n cursor: default; }\n\n#inventory-actions-dropdown a[disabled], #inventory-detail-edit a[disabled] {\n color: gray;\n pointer-events: none; }\n\n#inventory-detail-buttons a[disabled] {\n pointer-events: none; }\n\n.pairing {\n padding-bottom: 20px; }\n\n.pairing-data-row, .pairing-headers-row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-positive: 0;\n flex-grow: 0;\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n width: 100%;\n border-bottom: 2px solid #e0e0e0;\n border-collapse: collapse; }\n .pairing-data-row .is-paired-child, .pairing-headers-row .is-paired-child {\n width: 10%; }\n\n.pairing-data-row:nth-child(even) {\n background-color: #fdfdfd; }\n\n.pairing-data-row:nth-child(odd) {\n background-color: #f3f3f3; }\n\n.pairing-data-row-indent {\n display: -ms-flexbox;\n display: flex;\n display: -webkit-flex;\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-positive: 0;\n flex-grow: 0;\n -webkit-flex-grow: 0;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -webkit-flex-wrap: wrap;\n width: 100%;\n padding-left: 40px;\n padding-right: 15px;\n border-collapse: collapse;\n color: #A0A0A0; }\n .pairing-data-row-indent .unpaired {\n width: 100%;\n color: lightskyblue; }\n\n.grab-pairing-left {\n cursor: -webkit-grab;\n cursor: grab; }\n\n.unpair-child {\n cursor: pointer;\n color: #428bca; }\n .unpair-child > span {\n font-size: 20px;\n line-height: 10px;\n position: relative; }\n\n.pairing-child {\n width: 100%;\n min-height: 15px; }\n\n.pairing-headers-row {\n background-color: #E0E0E0;\n border-bottom: 2px solid #A0A0A0; }\n\n.pairing-container {\n border: 1px solid #A0A0A0;\n overflow-x: hidden; }\n\n.pairing-rows {\n max-height: 600px;\n overflow-y: scroll; }\n\n.pairing-list-controls-full {\n margin-top: 15px; }\n\n.pairing-other-title {\n margin-top: 40px; }\n\n.pairing-data-row-col-indent {\n -ms-flex-positive: 0;\n flex-grow: 0; }\n\n.pairing-cell {\n -ms-flex-positive: 0;\n flex-grow: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis; }\n\ntable.import_results a[disabled] {\n pointer-events: none; }\n\n.noselect {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none; }\n\n#mapped-table td, div.table_list_container.matching td, div.table_list_container.matching_detail td {\n max-width: 350px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; }\n\ndiv.table_list_container.matching td, div.table_list_container.matching th, div.table_list_container.matching_detail td, div.table_list_container.matching_detail th {\n height: 34px;\n position: relative; }\n\ndiv.table_list_container.matching tr td, div.table_list_container.matching_detail tr td {\n background-color: #fff; }\n\ndiv.table_list_container.matching tr:nth-of-type(odd) td, div.table_list_container.matching_detail tr:nth-of-type(odd) td {\n background-color: #f9f9f9; }\n\ndiv.table_list_container.matching td.matching-link, div.table_list_container.matching th.matching-link, div.table_list_container.matching_detail td.matching-link, div.table_list_container.matching_detail th.matching-link {\n left: 0;\n margin-top: 1px;\n min-width: 34px;\n padding: 0;\n position: absolute;\n text-align: center;\n z-index: 10; }\n div.table_list_container.matching td.matching-link > a, div.table_list_container.matching th.matching-link > a, div.table_list_container.matching_detail td.matching-link > a, div.table_list_container.matching_detail th.matching-link > a {\n width: 100%;\n height: 100%;\n display: block;\n padding-top: 8px; }\n div.table_list_container.matching td.matching-link.column-row, div.table_list_container.matching th.matching-link.column-row, div.table_list_container.matching_detail td.matching-link.column-row, div.table_list_container.matching_detail th.matching-link.column-row {\n height: 35px;\n margin: 0; }\n div.table_list_container.matching td.matching-link.sub_head, div.table_list_container.matching th.matching-link.sub_head, div.table_list_container.matching_detail td.matching-link.sub_head, div.table_list_container.matching_detail th.matching-link.sub_head {\n height: 36px; }\n div.table_list_container.matching td.matching-link + td, div.table_list_container.matching td.matching-link + th, div.table_list_container.matching th.matching-link + td, div.table_list_container.matching th.matching-link + th, div.table_list_container.matching_detail td.matching-link + td, div.table_list_container.matching_detail td.matching-link + th, div.table_list_container.matching_detail th.matching-link + td, div.table_list_container.matching_detail th.matching-link + th {\n padding-left: 43px; }\n\n#data-quality-admin-table tr.disabled {\n opacity: 0.4; }\n\n#column-table input.ng-invalid-required {\n border-color: #dd2c00; }\n\n.no-click {\n pointer-events: none; }\n\n.arrow-up {\n width: 0;\n height: 0;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-bottom: 10px solid black;\n display: inline-block; }\n\n.arrow-down {\n width: 0;\n height: 0;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-top: 10px solid black;\n display: inline-block; }\n\n.pairing .table_header_text {\n text-transform: uppercase;\n white-space: nowrap;\n text-shadow: 0 1px 0 white;\n font-weight: bold;\n padding: 6px 2px 5px; }\n\n.pairing .pairing-headers-row {\n padding: 0; }\n\n.pairing div.pairing-headers {\n padding: 3px;\n border-left: 1px solid #b3b3b3; }\n .pairing div.pairing-headers:first-child {\n border-left: 0; }\n\n.pairing .data-slide {\n padding-left: 6%; }\n\n.pairing-data-row-col {\n min-width: 200px;\n padding: 2px;\n width: 200px; }\n\n.pairing-data-row-col-indent {\n width: 30%; }\n\n.disableable[disabled] {\n pointer-events: none;\n color: gray; }\n\n.paginate {\n float: right;\n padding: 0 15px;\n position: relative;\n z-index: 100; }\n\n.filter-row input {\n width: 100%; }\n\n.filter-unmatched .filter-unmatched-hide {\n display: none !important; }\n\n.pairing-container-2 {\n border: 1px solid #A0A0A0;\n overflow-x: hidden; }\n .pairing-container-2 .pairing-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-positive: 0;\n flex-grow: 0;\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n overflow-x: hidden;\n width: 100%;\n border-bottom: 2px solid #e0e0e0;\n border-collapse: collapse;\n background-color: #E0E0E0;\n border-bottom: 2px solid #A0A0A0; }\n .pairing-container-2 .pairing-header .is-paired-child {\n width: 10%; }\n .pairing-container-2 .pairing-header > div {\n min-width: 200px;\n width: 200px; }\n .pairing-container-2 .pairing-header > div.paired-column {\n min-width: 60px;\n max-width: 60px; }\n .pairing-container-2 .pairing-header > div .title {\n font-weight: bold;\n padding: 6px 2px 5px;\n text-shadow: 0 1px 0 white;\n text-transform: uppercase;\n white-space: nowrap; }\n .pairing-container-2 .pairing-header > div input {\n width: 100%; }\n .pairing-container-2 .pairing-body {\n max-height: 600px;\n overflow-y: scroll; }\n\n.pairing-row {\n display: table-row; }\n .pairing-row:nth-child(even) {\n background-color: #fdfdfd; }\n .pairing-row:nth-child(odd) {\n background-color: #f3f3f3; }\n .pairing-row > div {\n border-bottom: 1px solid #e0e0e0;\n border-top: 1pt solid #e0e0e0;\n display: table-cell;\n max-width: 200px;\n min-width: 200px;\n overflow: hidden;\n padding: 2px 2px 2px 10px;\n text-overflow: ellipsis;\n white-space: nowrap; }\n .pairing-row > div.paired-column {\n max-width: 45px;\n min-width: 45px; }\n\n.right-pairing-container {\n display: table-row; }\n .right-pairing-container:nth-child(even) {\n background-color: #fdfdfd; }\n .right-pairing-container:nth-child(odd) {\n background-color: #f3f3f3; }\n .right-pairing-container .right-pairing-row {\n display: table-row; }\n .right-pairing-container .right-pairing-row > div {\n border-top: 1px solid #e0e0e0;\n display: table-cell;\n max-width: 200px;\n min-width: 200px;\n overflow: hidden;\n padding: 2px 2px 2px 10px;\n text-overflow: ellipsis;\n white-space: nowrap; }\n .right-pairing-container .right-pairing-row > div.paired-column {\n max-width: 45px;\n min-width: 45px; }\n .right-pairing-container .right-paired-row {\n color: #a0a0a0; }\n .right-pairing-container .right-paired-row > div {\n display: table-row; }\n .right-pairing-container .right-paired-row > div:last-child > div {\n border-bottom: 1px solid #e0e0e0; }\n .right-pairing-container .right-paired-row > div > div {\n border-top: 2px solid transparent;\n display: table-cell;\n max-width: 200px;\n min-width: 200px;\n overflow: hidden;\n padding: 2px 2px 2px 10px;\n text-overflow: ellipsis;\n white-space: nowrap; }\n .right-pairing-container .right-paired-row > div > div.unpair-child {\n max-width: 45px;\n min-width: 45px; }\n .right-pairing-container .right-paired-row .unpaired {\n color: lightskyblue;\n overflow: visible;\n padding-left: 40px;\n width: 100%; }\n .right-pairing-container .right-paired-row .unpaired .pairing-cell {\n overflow: visible; }\n\n.merge-modal .modal-dialog {\n max-height: 80vh;\n width: 750px;\n max-width: 85vw; }\n\n.merge-modal .merge-grid .ui-grid-menu-button {\n height: 28px; }\n\n.pm_import [disabled] {\n pointer-events: none; }\n\n.pm_import select {\n width: 100%; }\n\n.pm_import small {\n color: #999; }\n\n.notes-button {\n font-size: 9px;\n text-decoration: none !important; }\n .notes-button i.fa {\n font-size: 13px;\n padding-left: 3px; }\n .notes-button i.fa.text-muted {\n color: #222;\n opacity: 0.1; }\n .notes-button div {\n position: relative;\n text-align: right;\n top: -2px;\n width: 20px; }\n\n.settings_profile {\n padding-top: 10px !important; }\n .settings_profile select {\n display: inline-block;\n margin-left: 20px;\n width: 200px; }\n .settings_profile button {\n margin-top: -5px;\n padding: 4px 7px; }\n .settings_profile button[disabled] {\n opacity: 0.25; }\n\n.pink-bg {\n background-color: rgba(255, 0, 0, 0.07); }\n\n:not(.active) .typeahead-native {\n background-color: rgba(100, 255, 100, 0.15); }\n\n.upload-btn {\n display: block;\n font-weight: bold; }\n\n.lock {\n color: #444;\n padding-left: 6px; }\n"]} \ No newline at end of file diff --git a/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCCwR26eg.woff2 b/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCCwR26eg.woff2 new file mode 100644 index 0000000000..a6f356aaeb Binary files /dev/null and b/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCCwR26eg.woff2 differ diff --git a/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCGwR0.woff2 b/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCGwR0.woff2 new file mode 100644 index 0000000000..0752a5785c Binary files /dev/null and b/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCGwR0.woff2 differ diff --git a/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCIwR26eg.woff2 b/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCIwR26eg.woff2 new file mode 100644 index 0000000000..90a021bd01 Binary files /dev/null and b/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCIwR26eg.woff2 differ diff --git a/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCLwR26eg.woff2 b/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCLwR26eg.woff2 new file mode 100644 index 0000000000..2a676e44ad Binary files /dev/null and b/seed/static/seed/fonts/BngRUXNadjH0qYEzV7ab-oWlsbCLwR26eg.woff2 differ diff --git a/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiBW_3QRQ.woff2 b/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiBW_3QRQ.woff2 new file mode 100644 index 0000000000..870be4f522 Binary files /dev/null and b/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiBW_3QRQ.woff2 differ diff --git a/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiFW_0.woff2 b/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiFW_0.woff2 new file mode 100644 index 0000000000..faf8aa8c51 Binary files /dev/null and b/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiFW_0.woff2 differ diff --git a/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiIW_3QRQ.woff2 b/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiIW_3QRQ.woff2 new file mode 100644 index 0000000000..fb065aedf2 Binary files /dev/null and b/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiIW_3QRQ.woff2 differ diff --git a/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiLW_3QRQ.woff2 b/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiLW_3QRQ.woff2 new file mode 100644 index 0000000000..23ee229d67 Binary files /dev/null and b/seed/static/seed/fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiLW_3QRQ.woff2 differ diff --git a/seed/static/seed/fonts/jizaRExUiTo99u79D0-ExdGM.woff2 b/seed/static/seed/fonts/jizaRExUiTo99u79D0-ExdGM.woff2 new file mode 100644 index 0000000000..ca90b9ef9b Binary files /dev/null and b/seed/static/seed/fonts/jizaRExUiTo99u79D0-ExdGM.woff2 differ diff --git a/seed/static/seed/fonts/jizaRExUiTo99u79D0KExQ.woff2 b/seed/static/seed/fonts/jizaRExUiTo99u79D0KExQ.woff2 new file mode 100644 index 0000000000..56df030ffd Binary files /dev/null and b/seed/static/seed/fonts/jizaRExUiTo99u79D0KExQ.woff2 differ diff --git a/seed/static/seed/fonts/jizaRExUiTo99u79D0aExdGM.woff2 b/seed/static/seed/fonts/jizaRExUiTo99u79D0aExdGM.woff2 new file mode 100644 index 0000000000..037bebf166 Binary files /dev/null and b/seed/static/seed/fonts/jizaRExUiTo99u79D0aExdGM.woff2 differ diff --git a/seed/static/seed/fonts/jizaRExUiTo99u79D0yExdGM.woff2 b/seed/static/seed/fonts/jizaRExUiTo99u79D0yExdGM.woff2 new file mode 100644 index 0000000000..bc2c32cc62 Binary files /dev/null and b/seed/static/seed/fonts/jizaRExUiTo99u79D0yExdGM.woff2 differ diff --git a/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0O6tLQ.woff2 b/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0O6tLQ.woff2 new file mode 100644 index 0000000000..ff4ec32014 Binary files /dev/null and b/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0O6tLQ.woff2 differ diff --git a/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0OCtLQ0Z.woff2 b/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0OCtLQ0Z.woff2 new file mode 100644 index 0000000000..54aed69689 Binary files /dev/null and b/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0OCtLQ0Z.woff2 differ diff --git a/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0OOtLQ0Z.woff2 b/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0OOtLQ0Z.woff2 new file mode 100644 index 0000000000..c0db0f4ed6 Binary files /dev/null and b/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0OOtLQ0Z.woff2 differ diff --git a/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0OqtLQ0Z.woff2 b/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0OqtLQ0Z.woff2 new file mode 100644 index 0000000000..fa42b6508b Binary files /dev/null and b/seed/static/seed/fonts/jizfRExUiTo99u79B_mh0OqtLQ0Z.woff2 differ diff --git a/seed/static/seed/images/landing/landing-bg.jpg b/seed/static/seed/images/landing/landing-bg.jpg deleted file mode 100644 index 5b9a3946f4..0000000000 Binary files a/seed/static/seed/images/landing/landing-bg.jpg and /dev/null differ diff --git a/seed/static/seed/js/controllers/about_controller.js b/seed/static/seed/js/controllers/about_controller.js index 8f51804546..63ced175ce 100644 --- a/seed/static/seed/js/controllers/about_controller.js +++ b/seed/static/seed/js/controllers/about_controller.js @@ -1,15 +1,15 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.about', []) -.controller('about_controller', [ - '$scope', - 'version_payload', - function ( - $scope, - version_payload - ) { - $scope.version = version_payload.version; - $scope.sha = version_payload.sha; - }]); + .controller('about_controller', [ + '$scope', + 'version_payload', + function ( + $scope, + version_payload + ) { + $scope.version = version_payload.version; + $scope.sha = version_payload.sha; + }]); diff --git a/seed/static/seed/js/controllers/accounts_controller.js b/seed/static/seed/js/controllers/accounts_controller.js index 684b5f8c7d..7648faea8a 100644 --- a/seed/static/seed/js/controllers/accounts_controller.js +++ b/seed/static/seed/js/controllers/accounts_controller.js @@ -1,5 +1,5 @@ /* - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.accounts', []) diff --git a/seed/static/seed/js/controllers/admin_controller.js b/seed/static/seed/js/controllers/admin_controller.js index 5d9d20f058..4079c0ed88 100644 --- a/seed/static/seed/js/controllers/admin_controller.js +++ b/seed/static/seed/js/controllers/admin_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.admin', []) @@ -16,7 +16,20 @@ angular.module('BE.seed.controller.admin', []) 'users_payload', 'Notification', '$window', - function ($scope, $log, user_service, organization_service, column_mappings_service, uploader_service, auth_payload, organizations_payload, user_profile_payload, users_payload, Notification, $window) { + function ( + $scope, + $log, + user_service, + organization_service, + column_mappings_service, + uploader_service, + auth_payload, + organizations_payload, + user_profile_payload, + users_payload, + Notification, + $window + ) { $scope.is_superuser = auth_payload.auth.requires_superuser; $scope.user = {}; $scope.temp_users = []; @@ -182,12 +195,12 @@ angular.module('BE.seed.controller.admin', []) .then(function (data) { // resolve promise uploader_service.check_progress_loop(data.progress_key, 0, 1, function () { - org.remove_message = 'success'; - get_organizations(); - }, function () { - // Do nothing - }, - org); + org.remove_message = 'success'; + get_organizations(); + }, function () { + // Do nothing + }, + org); }); }; diff --git a/seed/static/seed/js/controllers/api_controller.js b/seed/static/seed/js/controllers/api_controller.js index ca1494c2e1..c467c4d6d1 100644 --- a/seed/static/seed/js/controllers/api_controller.js +++ b/seed/static/seed/js/controllers/api_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.api', []).controller('api_controller', [function () { diff --git a/seed/static/seed/js/controllers/column_mappings_controller.js b/seed/static/seed/js/controllers/column_mappings_controller.js index a459b0e3ac..29922e4bee 100644 --- a/seed/static/seed/js/controllers/column_mappings_controller.js +++ b/seed/static/seed/js/controllers/column_mappings_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.column_mappings', []) @@ -14,17 +14,18 @@ angular.module('BE.seed.controller.column_mappings', []) 'column_mappings', 'organization_payload', 'auth_payload', - function ($scope, - $q, - $state, - $stateParams, - Notification, - column_mappings_service, - spinner_utility, - column_mappings, - organization_payload, - auth_payload) { - + function ( + $scope, + $q, + $state, + $stateParams, + Notification, + column_mappings_service, + spinner_utility, + column_mappings, + organization_payload, + auth_payload + ) { $scope.inventory_type = $stateParams.inventory_type; $scope.org = organization_payload.organization; $scope.auth = auth_payload.auth; diff --git a/seed/static/seed/js/controllers/column_settings_controller.js b/seed/static/seed/js/controllers/column_settings_controller.js index 7d841f4ab1..8161d01860 100644 --- a/seed/static/seed/js/controllers/column_settings_controller.js +++ b/seed/static/seed/js/controllers/column_settings_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.column_settings', []) @@ -20,22 +20,24 @@ angular.module('BE.seed.controller.column_settings', []) 'naturalSort', 'flippers', '$translate', - function ($scope, - $q, - $state, - $stateParams, - Notification, - columns, - organization_payload, - auth_payload, - columns_service, - modified_service, - organization_service, - spinner_utility, - urls, - naturalSort, - flippers, - $translate) { + function ( + $scope, + $q, + $state, + $stateParams, + Notification, + columns, + organization_payload, + auth_payload, + columns_service, + modified_service, + organization_service, + spinner_utility, + urls, + naturalSort, + flippers, + $translate + ) { $scope.inventory_type = $stateParams.inventory_type; $scope.org = organization_payload.organization; $scope.auth = auth_payload.auth; @@ -115,7 +117,7 @@ angular.module('BE.seed.controller.column_settings', []) }); spinner_utility.show(); - $q.all(promises).then(function (results) { + $q.all(promises).then(function (/*results*/) { $scope.columns_updated = true; modified_service.resetModified(); var totalChanged = _.keys(diff).length; diff --git a/seed/static/seed/js/controllers/create_sub_organization_modal_controller.js b/seed/static/seed/js/controllers/create_sub_organization_modal_controller.js index 3df2061126..4c62c4bf62 100644 --- a/seed/static/seed/js/controllers/create_sub_organization_modal_controller.js +++ b/seed/static/seed/js/controllers/create_sub_organization_modal_controller.js @@ -1,51 +1,57 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.create_sub_organization_modal', []) -.controller('create_sub_organization_modal_controller', [ - '$scope', - '$rootScope', - '$uibModalInstance', - 'organization_service', - 'organization', - function ($scope, $rootScope, $uibModalInstance, organization_service, organization) { - $scope.sub_org = {}; - $scope.error_message = ''; + .controller('create_sub_organization_modal_controller', [ + '$scope', + '$rootScope', + '$uibModalInstance', + 'organization_service', + 'organization', + function ( + $scope, + $rootScope, + $uibModalInstance, + organization_service, + organization + ) { + $scope.sub_org = {}; + $scope.error_message = ''; /** - * creates a sub organization with an owner - */ - $scope.submit_form = function () { - organization_service.create_sub_org(organization, $scope.sub_org).then(function () { - $rootScope.$broadcast('organization_list_updated'); - $uibModalInstance.close(); - }, function (data) { - // error data are in the data object - $scope.error_message = data.data.message; - }); - }; + * creates a sub organization with an owner + */ + $scope.submit_form = function () { + organization_service.create_sub_org(organization, $scope.sub_org).then(function () { + $rootScope.$broadcast('organization_list_updated'); + $uibModalInstance.close(); + }, function (data) { + // error data are in the data object + $scope.error_message = data.data.message; + }); + }; - $scope.close = function () { - $uibModalInstance.close(); - }; + $scope.close = function () { + $uibModalInstance.close(); + }; - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; + $scope.cancel = function () { + $uibModalInstance.dismiss('cancel'); + }; - /** - * set the focus on the first input box - */ - _.delay(function () { - angular.element('#createOrganizationName').focus(); - }, 50); + /** + * set the focus on the first input box + */ + _.delay(function () { + angular.element('#createOrganizationName').focus(); + }, 50); - /** - * clear the error message when the user starts typing - */ - $scope.$watch('sub_org.email', function () { - $scope.error_message = ''; - }); - }]); + /** + * clear the error message when the user starts typing + */ + $scope.$watch('sub_org.email', function () { + $scope.error_message = ''; + }); + }]); diff --git a/seed/static/seed/js/controllers/cycle_admin_controller.js b/seed/static/seed/js/controllers/cycle_admin_controller.js index 9ac8cca94a..7076e83df2 100644 --- a/seed/static/seed/js/controllers/cycle_admin_controller.js +++ b/seed/static/seed/js/controllers/cycle_admin_controller.js @@ -1,5 +1,5 @@ /* - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ diff --git a/seed/static/seed/js/controllers/data_quality_admin_controller.js b/seed/static/seed/js/controllers/data_quality_admin_controller.js index ed97bd9db7..83ff0aca37 100644 --- a/seed/static/seed/js/controllers/data_quality_admin_controller.js +++ b/seed/static/seed/js/controllers/data_quality_admin_controller.js @@ -1,375 +1,377 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.data_quality_admin', []) -.controller('data_quality_admin_controller', [ - '$scope', - '$q', - '$state', - '$stateParams', - 'columns', - 'organization_payload', - 'data_quality_rules_payload', - 'auth_payload', - 'labels_payload', - 'data_quality_service', - 'organization_service', - 'label_service', - 'spinner_utility', - '$uibModal', - 'urls', - 'naturalSort', - 'flippers', - '$translate', - function ($scope, - $q, - $state, - $stateParams, - columns, - organization_payload, - data_quality_rules_payload, - auth_payload, - labels_payload, - data_quality_service, - organization_service, - label_service, - spinner_utility, - $uibModal, - urls, - naturalSort, - flippers, - $translate) { - $scope.inventory_type = $stateParams.inventory_type; - $scope.org = organization_payload.organization; - $scope.auth = auth_payload.auth; - $scope.ruleGroups = {}; - - $scope.state = $state.current; - - $scope.data_types = [ - {id: null, label: ''}, - {id: 'number', label: $translate.instant('Number')}, - {id: 'string', label: $translate.instant('Text')}, - {id: 'date', label: $translate.instant('Date')}, - {id: 'year', label: $translate.instant('Year')}, - {id: 'area', label: $translate.instant('Area')}, - {id: 'eui', label: $translate.instant('EUI')} - ]; - - $scope.units = [ - {id: null, label: ''}, - {id: 'ft**2', label: 'square feet'}, - {id: 'm**2', label: 'square metres'}, - {id: 'kBtu/ft**2/year', label: 'kBtu/sq. ft./year'}, - {id: 'GJ/m**2/year', label: 'GJ/m²/year'}, - {id: 'MJ/m**2/year', label: 'MJ/m²/year'}, - {id: 'kWh/m**2/year', label: 'kWh/m²/year'}, - {id: 'kBtu/m**2/year', label: 'kBtu/m²/year'} - ]; - - $scope.columns = columns; - - // if (flippers.is_active('release:orig_columns')) { - // // db may return _orig columns; don't suggest them in the select - // var is_retired_pre_pint_column = function (o) { - // return /_orig$/.test(o.name); - // }; - // _.remove($scope.columns, is_retired_pre_pint_column); - // } - - $scope.all_labels = labels_payload; - // console.log(labels_payload) - - var loadRules = function (rules_payload) { - var ruleGroups = { - properties: {}, - taxlots: {} - }; - _.forEach(rules_payload.rules, function (inventory_type, index) { - _.forEach(inventory_type, function (rule) { - if (!_.has(ruleGroups[index], rule.field)) ruleGroups[index][rule.field] = []; - var row = rule; - if (row.data_type === 'date') { - if (row.min) row.min = moment(row.min, 'YYYYMMDD').toDate(); - if (row.max) row.max = moment(row.max, 'YYYYMMDD').toDate(); - } - if (rule.label) { - // console.log('load: ', rule.label) - var match = _.find(labels_payload, function (label) { - // console.log('found: ', label) - return label.id === rule.label; - }); - if (match) { - // console.log('row label: ', match); - row.label = match; - } - } - ruleGroups[index][rule.field].push(row); - }); - }); - - $scope.ruleGroups = ruleGroups; - }; - loadRules(data_quality_rules_payload); - - // Restores the default rules - $scope.restore_defaults = function () { - spinner_utility.show(); - $scope.defaults_restored = false; - data_quality_service.reset_default_data_quality_rules($scope.org.org_id).then(function (rules) { - loadRules(rules); - $scope.defaults_restored = true; - }, function (data) { - $scope.$emit('app_error', data); - }).finally(function () { - spinner_utility.hide(); - }); - }; - - // Reset all rules - $scope.reset_all_rules = function () { - spinner_utility.show(); - $scope.rules_reset = false; - data_quality_service.reset_all_data_quality_rules($scope.org.org_id).then(function (rules) { - loadRules(rules); - $scope.rules_reset = true; - }, function (data) { - $scope.$emit('app_error', data); - }).finally(function () { - spinner_utility.hide(); - }); - }; - - // Saves the configured rules - $scope.save_settings = function () { - $scope.rules_updated = false; - var rules = { - properties: [], - taxlots: [] - }; - _.forEach($scope.ruleGroups, function (ruleGroups, inventory_type) { - _.forEach(ruleGroups, function (ruleGroup) { - _.forEach(ruleGroup, function (rule) { - // Skip rules that haven't been assigned to a field yet - if (rule.field === null) return; - - var r = { - enabled: rule.enabled, - field: rule.field, - data_type: rule.data_type, - rule_type: rule.rule_type, - required: rule.required, - not_null: rule.not_null, - min: rule.min || null, - max: rule.max || null, - text_match: rule.text_match, - severity: rule.severity, - units: rule.units, - label: null - }; - if (rule.data_type === 'date') { - if (rule.min) r.min = Number(moment(rule.min).format('YYYYMMDD')); - if (rule.max) r.max = Number(moment(rule.max).format('YYYYMMDD')); + .controller('data_quality_admin_controller', [ + '$scope', + '$q', + '$state', + '$stateParams', + 'columns', + 'organization_payload', + 'data_quality_rules_payload', + 'auth_payload', + 'labels_payload', + 'data_quality_service', + 'organization_service', + 'label_service', + 'spinner_utility', + '$uibModal', + 'urls', + 'naturalSort', + 'flippers', + '$translate', + function ( + $scope, + $q, + $state, + $stateParams, + columns, + organization_payload, + data_quality_rules_payload, + auth_payload, + labels_payload, + data_quality_service, + organization_service, + label_service, + spinner_utility, + $uibModal, + urls, + naturalSort, + flippers, + $translate + ) { + $scope.inventory_type = $stateParams.inventory_type; + $scope.org = organization_payload.organization; + $scope.auth = auth_payload.auth; + $scope.ruleGroups = {}; + + $scope.state = $state.current; + + $scope.data_types = [ + {id: null, label: ''}, + {id: 'number', label: $translate.instant('Number')}, + {id: 'string', label: $translate.instant('Text')}, + {id: 'date', label: $translate.instant('Date')}, + {id: 'year', label: $translate.instant('Year')}, + {id: 'area', label: $translate.instant('Area')}, + {id: 'eui', label: $translate.instant('EUI')} + ]; + + $scope.units = [ + {id: null, label: ''}, + {id: 'ft**2', label: 'square feet'}, + {id: 'm**2', label: 'square metres'}, + {id: 'kBtu/ft**2/year', label: 'kBtu/sq. ft./year'}, + {id: 'GJ/m**2/year', label: 'GJ/m²/year'}, + {id: 'MJ/m**2/year', label: 'MJ/m²/year'}, + {id: 'kWh/m**2/year', label: 'kWh/m²/year'}, + {id: 'kBtu/m**2/year', label: 'kBtu/m²/year'} + ]; + + $scope.columns = columns; + + // if (flippers.is_active('release:orig_columns')) { + // // db may return _orig columns; don't suggest them in the select + // var is_retired_pre_pint_column = function (o) { + // return /_orig$/.test(o.name); + // }; + // _.remove($scope.columns, is_retired_pre_pint_column); + // } + + $scope.all_labels = labels_payload; + // console.log(labels_payload) + + var loadRules = function (rules_payload) { + var ruleGroups = { + properties: {}, + taxlots: {} + }; + _.forEach(rules_payload.rules, function (inventory_type, index) { + _.forEach(inventory_type, function (rule) { + if (!_.has(ruleGroups[index], rule.field)) ruleGroups[index][rule.field] = []; + var row = rule; + if (row.data_type === 'date') { + if (row.min) row.min = moment(row.min, 'YYYYMMDD').toDate(); + if (row.max) row.max = moment(row.max, 'YYYYMMDD').toDate(); } if (rule.label) { - // console.log('la: ', rule.label) - r.label = rule.label.id; - } - if (rule.new) { - rule.new = null; + // console.log('load: ', rule.label) var match = _.find(labels_payload, function (label) { - return label.name === rule.label; + // console.log('found: ', label) + return label.id === rule.label; }); - if (match) { - r.label = match.id; + // console.log('row label: ', match); + row.label = match; } } - rules[inventory_type].push(r); + ruleGroups[index][rule.field].push(row); }); }); - }); - spinner_utility.show(); - data_quality_service.save_data_quality_rules($scope.org.org_id, rules).then(function (rules) { - loadRules(rules); - $scope.rules_updated = true; - }, function (data) { - $scope.$emit('app_error', data); - }).finally(function () { - spinner_utility.hide(); - }); - }; + $scope.ruleGroups = ruleGroups; + }; + loadRules(data_quality_rules_payload); + + // Restores the default rules + $scope.restore_defaults = function () { + spinner_utility.show(); + $scope.defaults_restored = false; + data_quality_service.reset_default_data_quality_rules($scope.org.org_id).then(function (rules) { + loadRules(rules); + $scope.defaults_restored = true; + }, function (data) { + $scope.$emit('app_error', data); + }).finally(function () { + spinner_utility.hide(); + }); + }; - // capture rule field dropdown change. - $scope.change_field = function (rule, oldField, index) { - if (oldField === '') oldField = null; - var original = rule.data_type; - var newDataType = _.find(columns, {column_name: rule.field}).data_type; + // Reset all rules + $scope.reset_all_rules = function () { + spinner_utility.show(); + $scope.rules_reset = false; + data_quality_service.reset_all_data_quality_rules($scope.org.org_id).then(function (rules) { + loadRules(rules); + $scope.rules_reset = true; + }, function (data) { + $scope.$emit('app_error', data); + }).finally(function () { + spinner_utility.hide(); + }); + }; + + // Saves the configured rules + $scope.save_settings = function () { + $scope.rules_updated = false; + var rules = { + properties: [], + taxlots: [] + }; + _.forEach($scope.ruleGroups, function (ruleGroups, inventory_type) { + _.forEach(ruleGroups, function (ruleGroup) { + _.forEach(ruleGroup, function (rule) { + // Skip rules that haven't been assigned to a field yet + if (rule.field === null) return; + + var r = { + enabled: rule.enabled, + field: rule.field, + data_type: rule.data_type, + rule_type: rule.rule_type, + required: rule.required, + not_null: rule.not_null, + min: rule.min || null, + max: rule.max || null, + text_match: rule.text_match, + severity: rule.severity, + units: rule.units, + label: null + }; + if (rule.data_type === 'date') { + if (rule.min) r.min = Number(moment(rule.min).format('YYYYMMDD')); + if (rule.max) r.max = Number(moment(rule.max).format('YYYYMMDD')); + } + if (rule.label) { + // console.log('la: ', rule.label) + r.label = rule.label.id; + } + if (rule.new) { + rule.new = null; + var match = _.find(labels_payload, function (label) { + return label.name === rule.label; + }); + + if (match) { + r.label = match.id; + } + } + rules[inventory_type].push(r); + }); + }); + }); - if (_.isNil(newDataType)) newDataType = null; + spinner_utility.show(); + data_quality_service.save_data_quality_rules($scope.org.org_id, rules).then(function (rules) { + loadRules(rules); + $scope.rules_updated = true; + }, function (data) { + $scope.$emit('app_error', data); + }).finally(function () { + spinner_utility.hide(); + }); + }; - // clear columns that are type specific. - if (newDataType !== original) { - rule.text_match = null; - rule.units = ''; + // capture rule field dropdown change. + $scope.change_field = function (rule, oldField, index) { + if (oldField === '') oldField = null; + var original = rule.data_type; + var newDataType = _.find(columns, {column_name: rule.field}).data_type; - if (!_.includes([null, 'number'], original) || !_.includes([null, 'number'], newDataType)) { - // Reset min/max if the data type is something other than null <-> number - rule.min = null; - rule.max = null; + if (_.isNil(newDataType)) newDataType = null; + + // clear columns that are type specific. + if (newDataType !== original) { + rule.text_match = null; + rule.units = ''; + + if (!_.includes([null, 'number'], original) || !_.includes([null, 'number'], newDataType)) { + // Reset min/max if the data type is something other than null <-> number + rule.min = null; + rule.max = null; + } } - } - - rule.data_type = newDataType; - - // move rule to appropriate spot in ruleGroups. - if (!_.has($scope.ruleGroups[$scope.inventory_type], rule.field)) $scope.ruleGroups[$scope.inventory_type][rule.field] = []; - else { - // Rules already exist for the new field name, so match the data_type, required, and not_null columns - var existingRule = _.first($scope.ruleGroups[$scope.inventory_type][rule.field]); - rule.data_type = existingRule.data_type; - rule.required = existingRule.required; - rule.not_null = existingRule.not_null; - } - $scope.ruleGroups[$scope.inventory_type][rule.field].push(rule); - // remove old rule. - if ($scope.ruleGroups[$scope.inventory_type][oldField].length === 1) delete $scope.ruleGroups[$scope.inventory_type][oldField]; - else $scope.ruleGroups[$scope.inventory_type][oldField].splice(index, 1); - rule.autofocus = true; - }; - - // Keep field types consistent for identical fields - $scope.change_data_type = function (rule, oldValue) { - var data_type = rule.data_type; - _.forEach($scope.ruleGroups[$scope.inventory_type][rule.field], function (currentRule) { - currentRule.text_match = null; - - if (!_.includes(['', 'number'], oldValue) || !_.includes([null, 'number'], data_type)) { - // Reset min/max if the data type is something other than null <-> number - currentRule.min = null; - currentRule.max = null; + + rule.data_type = newDataType; + + // move rule to appropriate spot in ruleGroups. + if (!_.has($scope.ruleGroups[$scope.inventory_type], rule.field)) $scope.ruleGroups[$scope.inventory_type][rule.field] = []; + else { + // Rules already exist for the new field name, so match the data_type, required, and not_null columns + var existingRule = _.first($scope.ruleGroups[$scope.inventory_type][rule.field]); + rule.data_type = existingRule.data_type; + rule.required = existingRule.required; + rule.not_null = existingRule.not_null; } - currentRule.data_type = data_type; - }); - }; + $scope.ruleGroups[$scope.inventory_type][rule.field].push(rule); + // remove old rule. + if ($scope.ruleGroups[$scope.inventory_type][oldField].length === 1) delete $scope.ruleGroups[$scope.inventory_type][oldField]; + else $scope.ruleGroups[$scope.inventory_type][oldField].splice(index, 1); + rule.autofocus = true; + }; - // Keep "required field" consistent for identical fields - $scope.change_required = function (rule) { - var required = !rule.required; - _.forEach($scope.ruleGroups[$scope.inventory_type][rule.field], function (currentRule) { - currentRule.required = required; - }); - }; + // Keep field types consistent for identical fields + $scope.change_data_type = function (rule, oldValue) { + var data_type = rule.data_type; + _.forEach($scope.ruleGroups[$scope.inventory_type][rule.field], function (currentRule) { + currentRule.text_match = null; - // Keep "not null" consistent for identical fields - $scope.change_not_null = function (rule) { - var not_null = !rule.not_null; - _.forEach($scope.ruleGroups[$scope.inventory_type][rule.field], function (currentRule) { - currentRule.not_null = not_null; - }); - }; - - $scope.removeLabelFromRule = function (rule) { - rule.label = null; - }; - - // create a new rule. - $scope.create_new_rule = function () { - var field = null; - if (!_.has($scope.ruleGroups[$scope.inventory_type], field)) { - $scope.ruleGroups[$scope.inventory_type][field] = []; - } - - $scope.ruleGroups[$scope.inventory_type][field].push({ - enabled: true, - field: field, - displayName: field, - data_type: 'number', - rule_type: 1, - required: false, - not_null: false, - max: null, - min: null, - text_match: null, - severity: 'error', - units: '', - // label: 'Invalid ' + label, - label: null, - 'new': true, - autofocus: true - }); - }; - - // create label and assign to that rule - $scope.create_label = function (rule) { - var modalInstance = $uibModal.open({ - templateUrl: urls.static_url + 'seed/partials/data_quality_labels_modal.html', - controller: 'data_quality_labels_modal_controller', - resolve: { - org_id: function () { - return $scope.org.org_id; + if (!_.includes(['', 'number'], oldValue) || !_.includes([null, 'number'], data_type)) { + // Reset min/max if the data type is something other than null <-> number + currentRule.min = null; + currentRule.max = null; } + currentRule.data_type = data_type; + }); + }; + + // Keep "required field" consistent for identical fields + $scope.change_required = function (rule) { + var required = !rule.required; + _.forEach($scope.ruleGroups[$scope.inventory_type][rule.field], function (currentRule) { + currentRule.required = required; + }); + }; + + // Keep "not null" consistent for identical fields + $scope.change_not_null = function (rule) { + var not_null = !rule.not_null; + _.forEach($scope.ruleGroups[$scope.inventory_type][rule.field], function (currentRule) { + currentRule.not_null = not_null; + }); + }; + + $scope.removeLabelFromRule = function (rule) { + rule.label = null; + }; + + // create a new rule. + $scope.create_new_rule = function () { + var field = null; + if (!_.has($scope.ruleGroups[$scope.inventory_type], field)) { + $scope.ruleGroups[$scope.inventory_type][field] = []; } - }); - modalInstance.result.then(function (returnedLabels) { - rule.label = returnedLabels; - - //code for multiple labels - // label_service.get_labels().then(function (allLabels) { - // console.log('all: ', allLabels) - // rule.label = _.filter(allLabels, function (label) { - // // console.log(label.id + ' and ' + returnedLabels) - // return _.includes(returnedLabels, label.id); - // }); - // }); - - }, function () { - // Do nothing - }); - }; - - // set rule as deleted. - $scope.delete_rule = function (rule, index) { - if ($scope.ruleGroups[$scope.inventory_type][rule.field].length === 1) delete $scope.ruleGroups[$scope.inventory_type][rule.field]; - else $scope.ruleGroups[$scope.inventory_type][rule.field].splice(index, 1); - }; - - var displayNames = {}; - _.forEach($scope.columns, function (column) { - // TRANSLATION_FIXME - displayNames[column.column_name] = column.displayName; - }); - - $scope.sortedRuleGroups = function () { - var sortedKeys = _.keys($scope.ruleGroups[$scope.inventory_type]).sort(function (a, b) { - return naturalSort(displayNames[a], displayNames[b]); - }); - var nullKey = _.remove(sortedKeys, function (key) { - return key === 'null'; - }); - // Put created unassigned rows first - return nullKey.concat(sortedKeys); - }; + $scope.ruleGroups[$scope.inventory_type][field].push({ + enabled: true, + field: field, + displayName: field, + data_type: 'number', + rule_type: 1, + required: false, + not_null: false, + max: null, + min: null, + text_match: null, + severity: 'error', + units: '', + // label: 'Invalid ' + label, + label: null, + 'new': true, + autofocus: true + }); + }; - $scope.selectAll = function () { - var allEnabled = $scope.allEnabled(); - _.forEach($scope.ruleGroups[$scope.inventory_type], function (ruleGroup) { - _.forEach(ruleGroup, function (rule) { - rule.enabled = !allEnabled; + // create label and assign to that rule + $scope.create_label = function (rule) { + var modalInstance = $uibModal.open({ + templateUrl: urls.static_url + 'seed/partials/data_quality_labels_modal.html', + controller: 'data_quality_labels_modal_controller', + resolve: { + org_id: function () { + return $scope.org.org_id; + } + } + }); + modalInstance.result.then(function (returnedLabels) { + rule.label = returnedLabels; + + //code for multiple labels + // label_service.get_labels().then(function (allLabels) { + // console.log('all: ', allLabels) + // rule.label = _.filter(allLabels, function (label) { + // // console.log(label.id + ' and ' + returnedLabels) + // return _.includes(returnedLabels, label.id); + // }); + // }); + + }, function () { + // Do nothing }); + }; + + // set rule as deleted. + $scope.delete_rule = function (rule, index) { + if ($scope.ruleGroups[$scope.inventory_type][rule.field].length === 1) delete $scope.ruleGroups[$scope.inventory_type][rule.field]; + else $scope.ruleGroups[$scope.inventory_type][rule.field].splice(index, 1); + }; + + var displayNames = {}; + _.forEach($scope.columns, function (column) { + // TRANSLATION_FIXME + displayNames[column.column_name] = column.displayName; }); - }; - - $scope.allEnabled = function () { - var total = 0; - var enabled = _.reduce($scope.ruleGroups[$scope.inventory_type], function (result, ruleGroup) { - total += ruleGroup.length; - return result + _.filter(ruleGroup, 'enabled').length; - }, 0); - return total === enabled; - }; - - }]); + + $scope.sortedRuleGroups = function () { + var sortedKeys = _.keys($scope.ruleGroups[$scope.inventory_type]).sort(function (a, b) { + return naturalSort(displayNames[a], displayNames[b]); + }); + var nullKey = _.remove(sortedKeys, function (key) { + return key === 'null'; + }); + + // Put created unassigned rows first + return nullKey.concat(sortedKeys); + }; + + $scope.selectAll = function () { + var allEnabled = $scope.allEnabled(); + _.forEach($scope.ruleGroups[$scope.inventory_type], function (ruleGroup) { + _.forEach(ruleGroup, function (rule) { + rule.enabled = !allEnabled; + }); + }); + }; + + $scope.allEnabled = function () { + var total = 0; + var enabled = _.reduce($scope.ruleGroups[$scope.inventory_type], function (result, ruleGroup) { + total += ruleGroup.length; + return result + _.filter(ruleGroup, 'enabled').length; + }, 0); + return total === enabled; + }; + + }]); diff --git a/seed/static/seed/js/controllers/data_quality_labels_modal_controller.js b/seed/static/seed/js/controllers/data_quality_labels_modal_controller.js index 54f8fb1eaf..466a23712e 100644 --- a/seed/static/seed/js/controllers/data_quality_labels_modal_controller.js +++ b/seed/static/seed/js/controllers/data_quality_labels_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author * * Controller for the Update Labels modal window. diff --git a/seed/static/seed/js/controllers/data_quality_modal_controller.js b/seed/static/seed/js/controllers/data_quality_modal_controller.js index 6be3f246d8..fa775e6da8 100644 --- a/seed/static/seed/js/controllers/data_quality_modal_controller.js +++ b/seed/static/seed/js/controllers/data_quality_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.data_quality_modal', []) @@ -13,15 +13,17 @@ angular.module('BE.seed.controller.data_quality_modal', []) 'uploaded', 'importFileId', 'orgId', - function ($scope, - $uibModalInstance, - search_service, - naturalSort, - dataQualityResults, - name, - uploaded, - importFileId, - orgId) { + function ( + $scope, + $uibModalInstance, + search_service, + naturalSort, + dataQualityResults, + name, + uploaded, + importFileId, + orgId + ) { $scope.name = name; $scope.uploaded = moment.utc(uploaded).local().format('MMMM Do YYYY, h:mm:ss A Z'); var originalDataQualityResults = dataQualityResults || []; diff --git a/seed/static/seed/js/controllers/data_upload_modal_controller.js b/seed/static/seed/js/controllers/data_upload_modal_controller.js index 61453983bb..30cd2e0e4f 100644 --- a/seed/static/seed/js/controllers/data_upload_modal_controller.js +++ b/seed/static/seed/js/controllers/data_upload_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** @@ -40,21 +40,23 @@ angular.module('BE.seed.controller.data_upload_modal', []) 'dataset', 'cycles', 'organization', - function ($http, - $scope, - $uibModalInstance, - $log, - $timeout, - uploader_service, - $state, - mapping_service, - matching_service, - inventory_service, - spinner_utility, - step, - dataset, - cycles, - organization) { + function ( + $http, + $scope, + $uibModalInstance, + $log, + $timeout, + uploader_service, + $state, + mapping_service, + matching_service, + inventory_service, + spinner_utility, + step, + dataset, + cycles, + organization + ) { $scope.cycles = cycles.cycles; if ($scope.cycles.length) $scope.selectedCycle = $scope.cycles[0]; $scope.step_10_style = 'info'; @@ -197,6 +199,9 @@ angular.module('BE.seed.controller.data_upload_modal', []) case 'upload_error': $scope.step_12_error_message = file.error; $scope.step.number = 12; + // add variables to identify buildingsync bulk uploads + $scope.building_sync_files = (file.source_type === 'BuildingSync'); + $scope.bulk_upload = (_.last(file.filename.split('.')) === 'zip'); break; case 'upload_in_progress': @@ -212,11 +217,14 @@ angular.module('BE.seed.controller.data_upload_modal', []) var current_step = $scope.step.number; $scope.uploader.status_message = 'upload complete'; $scope.dataset.filename = file.filename; + $scope.step_14_message = null; + if (file.source_type === 'BuildingSync') { $scope.uploader.complete = true; $scope.uploader.in_progress = false; $scope.uploader.progress = 100; $scope.step.number = 14; + $scope.step_14_message = (_.size(file.message['warnings']) > 0) ? file.message['warnings'] : null; } else { $scope.dataset.import_file_id = file.file_id; diff --git a/seed/static/seed/js/controllers/dataset_detail_controller.js b/seed/static/seed/js/controllers/dataset_detail_controller.js index 6a256494e6..62ea2fe571 100644 --- a/seed/static/seed/js/controllers/dataset_detail_controller.js +++ b/seed/static/seed/js/controllers/dataset_detail_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.dataset_detail', []) diff --git a/seed/static/seed/js/controllers/dataset_list_controller.js b/seed/static/seed/js/controllers/dataset_list_controller.js index e23eef008c..0a19994637 100644 --- a/seed/static/seed/js/controllers/dataset_list_controller.js +++ b/seed/static/seed/js/controllers/dataset_list_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.dataset', []) diff --git a/seed/static/seed/js/controllers/delete_dataset_modal_controller.js b/seed/static/seed/js/controllers/delete_dataset_modal_controller.js index 104b72f953..d1c024c354 100644 --- a/seed/static/seed/js/controllers/delete_dataset_modal_controller.js +++ b/seed/static/seed/js/controllers/delete_dataset_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.delete_dataset_modal', []) diff --git a/seed/static/seed/js/controllers/delete_file_modal_controller.js b/seed/static/seed/js/controllers/delete_file_modal_controller.js index 6b10f24398..c3a195f6ce 100644 --- a/seed/static/seed/js/controllers/delete_file_modal_controller.js +++ b/seed/static/seed/js/controllers/delete_file_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.delete_file_modal', []) diff --git a/seed/static/seed/js/controllers/delete_modal_controller.js b/seed/static/seed/js/controllers/delete_modal_controller.js index 19804e04a9..b208c8eccb 100644 --- a/seed/static/seed/js/controllers/delete_modal_controller.js +++ b/seed/static/seed/js/controllers/delete_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.delete_modal', []) diff --git a/seed/static/seed/js/controllers/developer_controller.js b/seed/static/seed/js/controllers/developer_controller.js index ac8fc6bf86..df2c6f9f5e 100644 --- a/seed/static/seed/js/controllers/developer_controller.js +++ b/seed/static/seed/js/controllers/developer_controller.js @@ -1,34 +1,34 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.developer', []) -.controller('developer_controller', [ - '$scope', - 'urls', - 'auth_payload', - 'user_profile_payload', - 'user_service', - function ( + .controller('developer_controller', [ + '$scope', + 'urls', + 'auth_payload', + 'user_profile_payload', + 'user_service', + function ( $scope, urls, auth_payload, user_profile_payload, user_service ) { - $scope.is_superuser = auth_payload.auth.requires_superuser; - $scope.user = user_profile_payload; - $scope.new_key_generated = false; - $scope.username = user_profile_payload.first_name + ' ' + user_profile_payload.last_name; + $scope.is_superuser = auth_payload.auth.requires_superuser; + $scope.user = user_profile_payload; + $scope.new_key_generated = false; + $scope.username = user_profile_payload.first_name + ' ' + user_profile_payload.last_name; - /** - * generates a new API key for the user - */ - $scope.generate_api_key = function () { - user_service.generate_api_key().then(function (data) { - $scope.user.api_key = data.api_key; - $scope.new_key_generated = true; - }); - }; + /** + * generates a new API key for the user + */ + $scope.generate_api_key = function () { + user_service.generate_api_key().then(function (data) { + $scope.user.api_key = data.api_key; + $scope.new_key_generated = true; + }); + }; - }]); + }]); diff --git a/seed/static/seed/js/controllers/export_inventory_modal_controller.js b/seed/static/seed/js/controllers/export_inventory_modal_controller.js index f0ccd5ab09..6d2b64f74f 100644 --- a/seed/static/seed/js/controllers/export_inventory_modal_controller.js +++ b/seed/static/seed/js/controllers/export_inventory_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.export_inventory_modal', []).controller('export_inventory_modal_controller', [ diff --git a/seed/static/seed/js/controllers/inventory_detail_controller.js b/seed/static/seed/js/controllers/inventory_detail_controller.js index fe488f664d..89f1685613 100644 --- a/seed/static/seed/js/controllers/inventory_detail_controller.js +++ b/seed/static/seed/js/controllers/inventory_detail_controller.js @@ -1,9 +1,10 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.inventory_detail', []) .controller('inventory_detail_controller', [ + '$http', '$state', '$scope', '$uibModal', @@ -25,27 +26,30 @@ angular.module('BE.seed.controller.inventory_detail', []) 'profiles', 'current_profile', 'labels_payload', - function ($state, - $scope, - $uibModal, - $log, - $filter, - $stateParams, - $anchorScroll, - $location, - $window, - urls, - spinner_utility, - label_service, - inventory_service, - matching_service, - pairing_service, - user_service, - inventory_payload, - columns, - profiles, - current_profile, - labels_payload) { + function ( + $http, + $state, + $scope, + $uibModal, + $log, + $filter, + $stateParams, + $anchorScroll, + $location, + $window, + urls, + spinner_utility, + label_service, + inventory_service, + matching_service, + pairing_service, + user_service, + inventory_payload, + columns, + profiles, + current_profile, + labels_payload + ) { $scope.inventory_type = $stateParams.inventory_type; $scope.organization = user_service.get_organization(); @@ -90,7 +94,7 @@ angular.module('BE.seed.controller.inventory_detail', []) $scope.item_state = inventory_payload.state; // item_parent is the property or the tax lot instead of the PropertyState / TaxLotState - if($scope.inventory_type === 'properties'){ + if($scope.inventory_type === 'properties') { $scope.item_parent = inventory_payload.property; } else { $scope.item_parent = inventory_payload.taxlot; @@ -122,7 +126,7 @@ angular.module('BE.seed.controller.inventory_detail', []) }; var ignoreNextChange = true; - $scope.$watch('currentProfile', function (newProfile, oldProfile) { + $scope.$watch('currentProfile', function (newProfile) { if (ignoreNextChange) { ignoreNextChange = false; return; @@ -133,7 +137,7 @@ angular.module('BE.seed.controller.inventory_detail', []) $window.location.reload(); }); - $scope.gotoMeasureAnchor = function(x) { + $scope.gotoMeasureAnchor = function (x) { $location.hash('measureAnchor' + x); $anchorScroll(); }; @@ -362,6 +366,19 @@ angular.module('BE.seed.controller.inventory_detail', []) }); }; + $scope.export_building_sync = function () { + var the_url = '/api/v2_1/properties/' + $stateParams.view_id + '/building_sync/'; + $http.get(the_url, {}) + .then(function (response) { + var blob = new Blob([response.data], {type: 'application/xml;charset=utf-8;' }); + var downloadLink = angular.element(''); + var filename = 'buildingsync_property_' + $stateParams.view_id + '.xml'; + downloadLink.attr('href', $window.URL.createObjectURL(blob)); + downloadLink.attr('download', filename); + downloadLink[0].click(); + }); + }; + $scope.unpair_property_from_taxlot = function (property_id) { pairing_service.unpair_property_from_taxlot($scope.inventory.view_id, property_id); $state.reload(); diff --git a/seed/static/seed/js/controllers/inventory_detail_notes_controller.js b/seed/static/seed/js/controllers/inventory_detail_notes_controller.js index bdabe1d2ce..8c9374c708 100644 --- a/seed/static/seed/js/controllers/inventory_detail_notes_controller.js +++ b/seed/static/seed/js/controllers/inventory_detail_notes_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.inventory_detail_notes', []) diff --git a/seed/static/seed/js/controllers/inventory_detail_notes_modal_controller.js b/seed/static/seed/js/controllers/inventory_detail_notes_modal_controller.js index 2b69e88288..c71b13c6c9 100644 --- a/seed/static/seed/js/controllers/inventory_detail_notes_modal_controller.js +++ b/seed/static/seed/js/controllers/inventory_detail_notes_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.inventory_detail_notes_modal', []) @@ -10,12 +10,14 @@ angular.module('BE.seed.controller.inventory_detail_notes_modal', []) 'inventoryType', 'viewId', 'orgId', - function ($scope, - $uibModalInstance, - note_service, - inventoryType, - viewId, - orgId) { + function ( + $scope, + $uibModalInstance, + note_service, + inventoryType, + viewId, + orgId + ) { $scope.inventoryType = inventoryType; $scope.newNote = ''; $scope.viewId = viewId; diff --git a/seed/static/seed/js/controllers/inventory_detail_settings_controller.js b/seed/static/seed/js/controllers/inventory_detail_settings_controller.js index 7377b87abf..e30f7f870b 100644 --- a/seed/static/seed/js/controllers/inventory_detail_settings_controller.js +++ b/seed/static/seed/js/controllers/inventory_detail_settings_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.inventory_detail_settings', []) @@ -18,20 +18,22 @@ angular.module('BE.seed.controller.inventory_detail_settings', []) 'current_profile', '$translate', 'i18nService', // from ui-grid - function ($scope, - $window, - $stateParams, - $uibModal, - Notification, - inventory_service, - modified_service, - user_service, - urls, - columns, - profiles, - current_profile, - $translate, - i18nService) { + function ( + $scope, + $window, + $stateParams, + $uibModal, + Notification, + inventory_service, + modified_service, + user_service, + urls, + columns, + profiles, + current_profile, + $translate, + i18nService + ) { $scope.inventory_type = $stateParams.inventory_type; $scope.inventory = { @@ -105,7 +107,7 @@ angular.module('BE.seed.controller.inventory_detail_settings', []) } }); - function switchProfile(newProfile) { + function switchProfile (newProfile) { ignoreNextChange = true; if (newProfile) { $scope.currentProfile = _.find($scope.profiles, {id: newProfile.id}); diff --git a/seed/static/seed/js/controllers/inventory_list_controller.js b/seed/static/seed/js/controllers/inventory_list_controller.js index 107ad5411b..0c7d9ce6e7 100644 --- a/seed/static/seed/js/controllers/inventory_list_controller.js +++ b/seed/static/seed/js/controllers/inventory_list_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.inventory_list', []) @@ -23,27 +23,31 @@ angular.module('BE.seed.controller.inventory_list', []) 'spinner_utility', 'naturalSort', '$translate', + 'uiGridConstants', 'i18nService', // from ui-grid - function ($scope, - $filter, - $window, - $uibModal, - $stateParams, - inventory_service, - label_service, - data_quality_service, - user_service, - inventory, - cycles, - profiles, - current_profile, - labels, - all_columns, - urls, - spinner_utility, - naturalSort, - $translate, - i18nService) { + function ( + $scope, + $filter, + $window, + $uibModal, + $stateParams, + inventory_service, + label_service, + data_quality_service, + user_service, + inventory, + cycles, + profiles, + current_profile, + labels, + all_columns, + urls, + spinner_utility, + naturalSort, + $translate, + uiGridConstants, + i18nService + ) { spinner_utility.show(); $scope.selectedCount = 0; $scope.selectedParentCount = 0; @@ -103,7 +107,7 @@ angular.module('BE.seed.controller.inventory_list', []) }; var ignoreNextChange = true; - $scope.$watch('currentProfile', function (newProfile, oldProfile) { + $scope.$watch('currentProfile', function (newProfile) { if (ignoreNextChange) { ignoreNextChange = false; return; @@ -147,8 +151,8 @@ angular.module('BE.seed.controller.inventory_list', []) } }; - function populated_columns_modal() { - var modalInstance = $uibModal.open({ + function populated_columns_modal () { + $uibModal.open({ backdrop: 'static', templateUrl: urls.static_url + 'seed/partials/show_populated_columns_modal.html', controller: 'show_populated_columns_modal_controller', @@ -181,7 +185,7 @@ angular.module('BE.seed.controller.inventory_list', []) }); }; - function updateApplicableLabels() { + function updateApplicableLabels () { var inventoryIds; if ($scope.inventory_type === 'properties') { inventoryIds = _.map($scope.data, 'property_view_id').sort(); @@ -293,7 +297,7 @@ angular.module('BE.seed.controller.inventory_list', []) var data = new Array($scope.selectedOrder.length); if ($scope.inventory_type === 'properties') { - return inventory_service.get_properties(1, undefined, undefined, undefined, selectedOrder).then(function (inventory_data) { + return inventory_service.get_properties(1, undefined, undefined, -1, selectedOrder).then(function (inventory_data) { _.forEach(selectedOrder, function (id, index) { var match = _.find(inventory_data.results, {id: id}); if (match) { @@ -303,7 +307,7 @@ angular.module('BE.seed.controller.inventory_list', []) return data; }); } else if ($scope.inventory_type === 'taxlots') { - return inventory_service.get_taxlots(1, undefined, undefined, undefined, selectedOrder).then(function (inventory_data) { + return inventory_service.get_taxlots(1, undefined, undefined, -1, selectedOrder).then(function (inventory_data) { _.forEach(selectedOrder, function (id, index) { var match = _.find(inventory_data.results, {id: id}); if (match) { @@ -341,7 +345,7 @@ angular.module('BE.seed.controller.inventory_list', []) data_quality_service.start_data_quality_checks(property_states, taxlot_states).then(function (response) { data_quality_service.data_quality_checks_status(response.progress_key).then(function (result) { - data_quality_service.get_data_quality_results(user_service.get_organization().id, result.unique_id).then(function(dq_result) { + data_quality_service.get_data_quality_results(user_service.get_organization().id, result.unique_id).then(function (dq_result) { var modalInstance = $uibModal.open({ templateUrl: urls.static_url + 'seed/partials/data_quality_modal.html', controller: 'data_quality_modal_controller', @@ -441,7 +445,8 @@ angular.module('BE.seed.controller.inventory_list', []) }); // Data - var processData = function () { + var processData = function (data) { + if (_.isUndefined(data)) data = $scope.data; var visibleColumns = _.map($scope.columns, 'name') .concat(['$$treeLevel', 'notes_count', 'id', 'property_state_id', 'property_view_id', 'taxlot_state_id', 'taxlot_view_id']); @@ -451,7 +456,6 @@ angular.module('BE.seed.controller.inventory_list', []) }, {}); var columnNamesToAggregate = _.keys(columnsToAggregate); - var data = $scope.data; var roots = data.length; for (var i = 0, trueIndex = 0; i < roots; ++i, ++trueIndex) { data[trueIndex].$$treeLevel = 0; @@ -502,21 +506,23 @@ angular.module('BE.seed.controller.inventory_list', []) var refresh_objects = function () { spinner_utility.show(); + var promise; if ($scope.inventory_type === 'properties') { - inventory_service.get_properties($scope.pagination.page, $scope.number_per_page, $scope.cycle.selected_cycle, _.has($scope.currentProfile, 'id') ? $scope.currentProfile.id : undefined).then(function (properties) { - $scope.data = properties.results; + promise = inventory_service.get_properties($scope.pagination.page, $scope.number_per_page, $scope.cycle.selected_cycle, _.has($scope.currentProfile, 'id') ? $scope.currentProfile.id : undefined).then(function (properties) { + processData(properties.results); $scope.pagination = properties.pagination; - processData(); spinner_utility.hide(); }); } else if ($scope.inventory_type === 'taxlots') { - inventory_service.get_taxlots($scope.pagination.page, $scope.number_per_page, $scope.cycle.selected_cycle, _.has($scope.currentProfile, 'id') ? $scope.currentProfile.id : undefined).then(function (taxlots) { - $scope.data = taxlots.results; + promise = inventory_service.get_taxlots($scope.pagination.page, $scope.number_per_page, $scope.cycle.selected_cycle, _.has($scope.currentProfile, 'id') ? $scope.currentProfile.id : undefined).then(function (taxlots) { + processData(taxlots.results); $scope.pagination = taxlots.pagination; - processData(); spinner_utility.hide(); }); } + return promise.then(function () { + $scope.gridApi.core.notifyDataChange(uiGridConstants.dataChange.EDIT); + }); }; $scope.update_cycle = function (cycle) { @@ -662,7 +668,7 @@ angular.module('BE.seed.controller.inventory_list', []) }); }; - function currentColumns() { + function currentColumns () { // Save all columns except first 3 var gridCols = _.filter($scope.gridApi.grid.columns, function (col) { return !_.includes(['treeBaseRowHeaderCol', 'selectionRowHeaderCol', 'notes_count', 'id'], col.name) && col.visible; @@ -763,7 +769,7 @@ angular.module('BE.seed.controller.inventory_list', []) gridApi.colMovable.on.columnPositionChanged($scope, function () { // Ensure that 'notes_count' and 'id' remain first - var idIndex, col; + var col, idIndex; idIndex = _.findIndex($scope.gridApi.grid.columns, {name: 'notes_count'}); if (idIndex !== 2) { col = $scope.gridApi.grid.columns[idIndex]; diff --git a/seed/static/seed/js/controllers/inventory_reports_controller.js b/seed/static/seed/js/controllers/inventory_reports_controller.js index 348ace7aae..4b4634bbd4 100644 --- a/seed/static/seed/js/controllers/inventory_reports_controller.js +++ b/seed/static/seed/js/controllers/inventory_reports_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** @@ -21,18 +21,19 @@ angular.module('BE.seed.controller.inventory_reports', []) 'flippers', '$sce', '$translate', - function ($scope, - $log, - $stateParams, - inventory_reports_service, - simple_modal_service, - columns, - cycles, - organization_payload, - flippers, - $sce, - $translate) { - + function ( + $scope, + $log, + $stateParams, + inventory_reports_service, + simple_modal_service, + columns, + cycles, + organization_payload, + flippers, + $sce, + $translate + ) { $scope.inventory_type = $stateParams.inventory_type; var pretty_unit = function (pint_spec) { @@ -77,14 +78,14 @@ angular.module('BE.seed.controller.inventory_reports', []) return str; }; - var parse_axis_label = function(column) { + var parse_axis_label = function (column) { if (column.column_name.includes('eui')) { return translateAxisLabel(column.displayName, eui_units()); } else if (column.column_name.includes('area')) { return translateAxisLabel(column.displayName, area_units()); } else { return $translate.instant(column.displayName); - }; + } }; /* SCOPE VARS */ @@ -109,21 +110,21 @@ angular.module('BE.seed.controller.inventory_reports', []) 'eui', 'float', 'integer', - 'number', - ] + 'number' + ]; var filtered_columns = _.filter(columns, function (column) { - return _.includes(acceptable_column_types, column.data_type); + return _.includes(acceptable_column_types, column.data_type); }); $scope.xAxisVars = _.map(filtered_columns, function (column) { return { - name: $translate.instant(column.displayName), //short name for variable, used in pulldown - label: $translate.instant(column.displayName), //full name for variable - varName: column.column_name, //name of variable, to be sent to server - axisLabel: parse_axis_label(column), //label to be used in charts, should include units - axisType: 'Measure', //DimpleJS property for axis type - axisTickFormat: ',.0f' //DimpleJS property for axis tick format - } + name: $translate.instant(column.displayName), //short name for variable, used in pulldown + label: $translate.instant(column.displayName), //full name for variable + varName: column.column_name, //name of variable, to be sent to server + axisLabel: parse_axis_label(column), //label to be used in charts, should include units + axisType: 'Measure', //DimpleJS property for axis type + axisTickFormat: ',.0f' //DimpleJS property for axis tick format + }; }); $scope.yAxisVars = [ @@ -175,8 +176,8 @@ angular.module('BE.seed.controller.inventory_reports', []) $scope.aggChartSeries = ['use_description', 'yr_e']; //Currently selected x and y variables - $scope.xAxisSelectedItem = $scope.xAxisVars[0]; //initialize to first var - $scope.yAxisSelectedItem = $scope.yAxisVars[0]; //initialize to first var + $scope.xAxisSelectedItem = $scope.xAxisVars[0]; //initialize to first var + $scope.yAxisSelectedItem = $scope.yAxisVars[0]; //initialize to first var //Chart data $scope.chartData = []; @@ -286,7 +287,7 @@ angular.module('BE.seed.controller.inventory_reports', []) y_axis_label: $translate.instant($scope.yAxisSelectedItem.label) }; } catch (e) { - console.error('$sce issue... missing translation'); + $log.error('$sce issue... missing translation'); interpolationParams = { x_axis_label: $scope.xAxisSelectedItem.label, y_axis_label: $scope.yAxisSelectedItem.label @@ -336,10 +337,10 @@ angular.module('BE.seed.controller.inventory_reports', []) $scope.chartStatusMessage = 'No Data'; } }, - function (data, status) { - $scope.chartStatusMessage = 'Data Load Error'; - $log.error('#InventoryReportsController: Error loading chart data : ' + status); - }) + function (data, status) { + $scope.chartStatusMessage = 'Data Load Error'; + $log.error('#InventoryReportsController: Error loading chart data : ' + status); + }) .finally(function () { $scope.chartIsLoading = false; }); @@ -386,10 +387,10 @@ angular.module('BE.seed.controller.inventory_reports', []) $scope.aggChartStatusMessage = 'No Data'; } }, - function (data, status) { - $scope.aggChartStatusMessage = 'Data Load Error'; - $log.error('#InventoryReportsController: Error loading agg chart data : ' + status); - }) + function (data, status) { + $scope.aggChartStatusMessage = 'Data Load Error'; + $log.error('#InventoryReportsController: Error loading agg chart data : ' + status); + }) .finally(function () { $scope.aggChartIsLoading = false; }); diff --git a/seed/static/seed/js/controllers/inventory_settings_controller.js b/seed/static/seed/js/controllers/inventory_settings_controller.js index 6e35004723..8d43469722 100644 --- a/seed/static/seed/js/controllers/inventory_settings_controller.js +++ b/seed/static/seed/js/controllers/inventory_settings_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.inventory_settings', []) @@ -21,24 +21,25 @@ angular.module('BE.seed.controller.inventory_settings', []) 'flippers', '$translate', 'i18nService', // from ui-grid - function ($scope, - $window, - $uibModalInstance, - $stateParams, - $uibModal, - Notification, - inventory_service, - modified_service, - user_service, - urls, - all_columns, - profiles, - current_profile, - shared_fields_payload, - flippers, - $translate, - i18nService) { - + function ( + $scope, + $window, + $uibModalInstance, + $stateParams, + $uibModal, + Notification, + inventory_service, + modified_service, + user_service, + urls, + all_columns, + profiles, + current_profile, + shared_fields_payload, + flippers, + $translate, + i18nService + ) { $scope.inventory_type = $stateParams.inventory_type; $scope.inventory = { id: $stateParams.inventory_id @@ -113,7 +114,7 @@ angular.module('BE.seed.controller.inventory_settings', []) } }); - function switchProfile(newProfile) { + function switchProfile (newProfile) { ignoreNextChange = true; if (newProfile) { $scope.currentProfile = _.find($scope.profiles, {id: newProfile.id}); diff --git a/seed/static/seed/js/controllers/label_admin_controller.js b/seed/static/seed/js/controllers/label_admin_controller.js index 2e898e2ed7..b1965f3c9d 100644 --- a/seed/static/seed/js/controllers/label_admin_controller.js +++ b/seed/static/seed/js/controllers/label_admin_controller.js @@ -1,160 +1,172 @@ /* - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.label_admin', []) -.controller('label_admin_controller', [ - '$scope', - '$log', - 'urls', - 'organization_payload', - 'labels_payload', - 'auth_payload', - 'label_service', - 'simple_modal_service', - 'Notification', - '$translate', - '$sce', - function ($scope, $log, urls, organization_payload, labels_payload, auth_payload, label_service, simple_modal_service, notification, $translate, $sce) { - $scope.org = organization_payload.organization; - $scope.auth = auth_payload.auth; - - $scope.available_colors = _.map(label_service.get_available_colors(), function (color) { - // label is already used for danger, success, etc. - return _.extend(color, {uiLabel: $translate.instant(color.color)}); - }); - $scope.labels = labels_payload; - - function initialize_new_label () { - $scope.new_label = {color: 'gray', label: 'default', name: ''}; - } - - $scope.showColor = function (label) { - var selected = []; - if(label.color) { - selected = $filter('filter')($scope.available_colors, {value: label.color}); + .controller('label_admin_controller', [ + '$scope', + '$log', + 'urls', + 'organization_payload', + 'labels_payload', + 'auth_payload', + 'label_service', + 'simple_modal_service', + 'Notification', + '$translate', + '$sce', + function ( + $scope, + $log, + urls, + organization_payload, + labels_payload, + auth_payload, + label_service, + simple_modal_service, + notification, + $translate, + $sce + ) { + $scope.org = organization_payload.organization; + $scope.auth = auth_payload.auth; + + $scope.available_colors = _.map(label_service.get_available_colors(), function (color) { + // label is already used for danger, success, etc. + return _.extend(color, {uiLabel: $translate.instant(color.color)}); + }); + $scope.labels = labels_payload; + + function initialize_new_label () { + $scope.new_label = {color: 'gray', label: 'default', name: ''}; } - return selected.length ? selected[0].text : 'Not set'; - }; + + $scope.showColor = function (label) { + var selected = []; + if(label.color) { + selected = $filter('filter')($scope.available_colors, {value: label.color}); + } + return selected.length ? selected[0].text : 'Not set'; + }; - /* Take user input from New Label form and submit + /* Take user input from New Label form and submit to service to create a new label. */ - $scope.submitNewLabelForm = function (form) { - if (form.$invalid) { - return; - } - label_service.create_label_for_org($scope.org.id, $scope.new_label).then(function () { - get_labels(); - var msg = translateMessage('CREATED_LABEL_NAMED', { - label_name: getTruncatedName($scope.new_label.name) + $scope.submitNewLabelForm = function (form) { + if (form.$invalid) { + return; + } + label_service.create_label_for_org($scope.org.id, $scope.new_label).then(function () { + get_labels(); + var msg = translateMessage('CREATED_LABEL_NAMED', { + label_name: getTruncatedName($scope.new_label.name) + }); + notification.primary(msg); + initialize_new_label(); + form.$setPristine(); + }, function (message) { + $log.error('Error creating new label.', message); }); - notification.primary(msg); - initialize_new_label(); - form.$setPristine(); - }, function (message) { - $log.error('Error creating new label.', message); - }); - }; + }; - /* Checks for existing label name for inline edit form. + /* Checks for existing label name for inline edit form. Form assumes function will return a string if there's an existing label */ - $scope.checkEditLabelBeforeSave = function (data, currentLabelName) { - if (data === currentLabelName) { - return; - } - if (data === undefined || data === '') { - return 'Enter at least one character'; - } - if(isLabelNameUsed(data)) { - return 'That label name already exists'; - } - }; - - function isLabelNameUsed (newLabelName) { - var len = $scope.labels.length; - for (var index = 0;index < len;index++) { - var label = $scope.labels[index]; - if (label.name === newLabelName) { - return true; + $scope.checkEditLabelBeforeSave = function (data, currentLabelName) { + if (data === currentLabelName) { + return; } - } - return false; - } + if (data === undefined || data === '') { + return 'Enter at least one character'; + } + if(isLabelNameUsed(data)) { + return 'That label name already exists'; + } + }; - /* Submit edit when 'enter' is pressed */ - $scope.onEditLabelNameKeypress = function (e, form) { - if (e.which === 13) { - form.$submit(); + function isLabelNameUsed (newLabelName) { + var len = $scope.labels.length; + for (var index = 0;index < len;index++) { + var label = $scope.labels[index]; + if (label.name === newLabelName) { + return true; + } + } + return false; } - }; - function translateMessage (msg, params) { - // TODO XSS, discuss with Nick and Alex - return $sce.getTrustedHtml($translate.instant(msg, params)); - } - - $scope.saveLabel = function (label, id, index) { - //Don't update $scope.label until a 'success' from server - angular.extend(label, {id: id}); - label_service.update_label_for_org($scope.org.id, label).then(function (data) { - var msg = translateMessage('Label updated'); - notification.primary(msg); - $scope.labels.splice(index, 1, data); - $scope.label = data; - }, function (message) { - $log.error('Error saving label.', message); - }); - }; + /* Submit edit when 'enter' is pressed */ + $scope.onEditLabelNameKeypress = function (e, form) { + if (e.which === 13) { + form.$submit(); + } + }; + function translateMessage (msg, params) { + // TODO XSS, discuss with Nick and Alex + return $sce.getTrustedHtml($translate.instant(msg, params)); + } - $scope.deleteLabel = function (label, index) { - var modalOptions = { - type: 'default', - okButtonText: $translate.instant('OK'), - cancelButtonText: $translate.instant('Cancel'), - headerText: $translate.instant('Confirm delete'), - bodyText: $translate.instant('DELETE_LABEL_AND_REMOVE', { label_name: label.name }) - }; - simple_modal_service.showModal(modalOptions).then(function () { - //user confirmed delete, so go ahead and do it. - label_service.delete_label_for_org($scope.org.id, label).then(function () { - //server deleted label, so remove it locally - $scope.labels.splice(index, 1); - var msg = translateMessage('DELETED_LABEL_NAMED', { - label_name: getTruncatedName(label.name) - }); + $scope.saveLabel = function (label, id, index) { + //Don't update $scope.label until a 'success' from server + angular.extend(label, {id: id}); + label_service.update_label_for_org($scope.org.id, label).then(function (data) { + var msg = translateMessage('Label updated'); notification.primary(msg); + $scope.labels.splice(index, 1, data); + $scope.label = data; }, function (message) { - $log.error('Error deleting label.', message); + $log.error('Error saving label.', message); }); - }, function () { - //user doesn't want to delete after all. - }); + }; - }; + $scope.deleteLabel = function (label, index) { + var modalOptions = { + type: 'default', + okButtonText: $translate.instant('OK'), + cancelButtonText: $translate.instant('Cancel'), + headerText: $translate.instant('Confirm delete'), + bodyText: $translate.instant('DELETE_LABEL_AND_REMOVE', { label_name: label.name }) + }; + simple_modal_service.showModal(modalOptions).then(function () { + //user confirmed delete, so go ahead and do it. + label_service.delete_label_for_org($scope.org.id, label).then(function () { + //server deleted label, so remove it locally + $scope.labels.splice(index, 1); + var msg = translateMessage('DELETED_LABEL_NAMED', { + label_name: getTruncatedName(label.name) + }); + notification.primary(msg); + }, function (message) { + $log.error('Error deleting label.', message); + }); + }, function () { + //user doesn't want to delete after all. + }); + + }; - function get_labels () { - // gets all labels for an org user - label_service.get_labels_for_org($scope.org.id).then(function (data) { - // resolve promise - $scope.labels = data; - }); - } - function getTruncatedName (name) { - if (name && name.length > 20) { - name = name.substr(0, 20) + '...'; + function get_labels () { + // gets all labels for an org user + label_service.get_labels_for_org($scope.org.id).then(function (data) { + // resolve promise + $scope.labels = data; + }); + } + + function getTruncatedName (name) { + if (name && name.length > 20) { + name = name.substr(0, 20) + '...'; + } + return name; } - return name; - } - initialize_new_label(); + initialize_new_label(); - }]); + }]); diff --git a/seed/static/seed/js/controllers/mapping_controller.js b/seed/static/seed/js/controllers/mapping_controller.js index 986add06c9..76019d6494 100644 --- a/seed/static/seed/js/controllers/mapping_controller.js +++ b/seed/static/seed/js/controllers/mapping_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.mapping', []) @@ -23,27 +23,27 @@ angular.module('BE.seed.controller.mapping', []) 'inventory_service', '$translate', 'i18nService', // from ui-grid - 'flippers', - function ($scope, - $log, - $q, - $filter, - import_file_payload, - suggested_mappings_payload, - raw_columns_payload, - first_five_rows_payload, - cycles, - mapping_service, - spinner_utility, - urls, - $uibModal, - user_service, - uploader_service, - data_quality_service, - inventory_service, - $translate, - i18nService, - flippers) { + function ( + $scope, + $log, + $q, + $filter, + import_file_payload, + suggested_mappings_payload, + raw_columns_payload, + first_five_rows_payload, + cycles, + mapping_service, + spinner_utility, + urls, + $uibModal, + user_service, + uploader_service, + data_quality_service, + inventory_service, + $translate, + i18nService + ) { // let angular-translate be in charge ... need to feed the language-only part of its $translate setting into // ui-grid's i18nService var stripRegion = function (languageTag) { @@ -254,7 +254,10 @@ angular.module('BE.seed.controller.mapping', []) */ $scope.check_reset_mappings = function () { return _.every($scope.mappings, function (col) { - return col.suggestion === col.name && col.suggestion_table_name === 'PropertyState'; + return _.isMatch(col, { + suggestion: col.name, + suggestion_table_name: 'PropertyState' + }); }); }; @@ -300,7 +303,10 @@ angular.module('BE.seed.controller.mapping', []) if (!property_mappings_found) return true; var intersections = _.intersectionWith(required_property_fields, $scope.mappings, function (required_field, raw_col) { - return required_field.column_name === raw_col.suggestion_column_name && required_field.inventory_type === raw_col.suggestion_table_name; + return _.isMatch(required_field, { + column_name: raw_col.suggestion_column_name, + inventory_type: raw_col.suggestion_table_name + }); }).length; return intersections > 0; @@ -319,7 +325,10 @@ angular.module('BE.seed.controller.mapping', []) if (!taxlot_mappings_found) return true; var intersections = _.intersectionWith(required_taxlot_fields, $scope.mappings, function (required_field, raw_col) { - return required_field.column_name === raw_col.suggestion_column_name && required_field.inventory_type === raw_col.suggestion_table_name; + return _.isMatch(required_field, { + column_name: raw_col.suggestion_column_name, + inventory_type: raw_col.suggestion_table_name + }); }).length; return intersections > 0; @@ -345,15 +354,15 @@ angular.module('BE.seed.controller.mapping', []) */ var check_mapping = function (progress_key) { uploader_service.check_progress_loop( - progress_key, // key + progress_key, // key 0, //starting prog bar percentage - 1.0, // progress multiplier + 1.0, // progress multiplier function () { $scope.get_mapped_buildings(); }, function () { // Do nothing }, - $scope.import_file // progress bar obj + $scope.import_file // progress bar obj ); }; @@ -471,7 +480,7 @@ angular.module('BE.seed.controller.mapping', []) // Submit the data quality checks and wait for the results data_quality_service.start_data_quality_checks_for_import_file(user_service.get_organization().id, $scope.import_file.id).then(function (response) { data_quality_service.data_quality_checks_status(response.progress_key).then(function (check_result) { - // Fetch data quality check results + // Fetch data quality check results $scope.data_quality_results_ready = false; $scope.data_quality_results = data_quality_service.get_data_quality_results(user_service.get_organization().id, check_result.unique_id); $scope.data_quality_results.then(function (data) { diff --git a/seed/static/seed/js/controllers/members_controller.js b/seed/static/seed/js/controllers/members_controller.js index ae522538c9..27b26314ec 100644 --- a/seed/static/seed/js/controllers/members_controller.js +++ b/seed/static/seed/js/controllers/members_controller.js @@ -1,5 +1,5 @@ /* - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.members', []) @@ -12,14 +12,16 @@ angular.module('BE.seed.controller.members', []) 'organization_service', 'user_profile_payload', 'urls', - function ($scope, - $uibModal, - users_payload, - organization_payload, - auth_payload, - organization_service, - user_profile_payload, - urls) { + function ( + $scope, + $uibModal, + users_payload, + organization_payload, + auth_payload, + organization_service, + user_profile_payload, + urls + ) { $scope.roles = [ 'member', 'owner', 'viewer' ]; diff --git a/seed/static/seed/js/controllers/menu_controller.js b/seed/static/seed/js/controllers/menu_controller.js index c44f2963aa..a44d76a9ea 100644 --- a/seed/static/seed/js/controllers/menu_controller.js +++ b/seed/static/seed/js/controllers/menu_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.menu', []) @@ -18,21 +18,22 @@ angular.module('BE.seed.controller.menu', []) '$timeout', '$state', '$cookies', - function ($rootScope, - $scope, - $location, - $window, - $uibModal, - $log, - urls, - organization_service, - user_service, - dataset_service, - modified_service, - $timeout, - $state, - $cookies) { - + function ( + $rootScope, + $scope, + $location, + $window, + $uibModal, + $log, + urls, + organization_service, + user_service, + dataset_service, + modified_service, + $timeout, + $state, + $cookies + ) { // initial state of css classes for menu and sidebar $scope.expanded_controller = false; $scope.collapsed_controller = false; diff --git a/seed/static/seed/js/controllers/merge_modal_controller.js b/seed/static/seed/js/controllers/merge_modal_controller.js index b6f29eb3dc..922b8906c3 100644 --- a/seed/static/seed/js/controllers/merge_modal_controller.js +++ b/seed/static/seed/js/controllers/merge_modal_controller.js @@ -1,10 +1,11 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.merge_modal', []) .controller('merge_modal_controller', [ '$scope', + '$log', 'matching_service', '$uibModalInstance', 'Notification', @@ -14,7 +15,7 @@ angular.module('BE.seed.controller.merge_modal', []) 'columns', 'data', 'inventory_type', - function ($scope, matching_service, $uibModalInstance, Notification, spinner_utility, uiGridConstants, naturalSort, columns, data, inventory_type) { + function ($scope, $log, matching_service, $uibModalInstance, Notification, spinner_utility, uiGridConstants, naturalSort, columns, data, inventory_type) { spinner_utility.hide(); $scope.inventory_type = inventory_type; diff --git a/seed/static/seed/js/controllers/modified_modal_controller.js b/seed/static/seed/js/controllers/modified_modal_controller.js index 1ee02915fb..ee39d7200f 100644 --- a/seed/static/seed/js/controllers/modified_modal_controller.js +++ b/seed/static/seed/js/controllers/modified_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.modified_modal', []) diff --git a/seed/static/seed/js/controllers/new_member_modal_controller.js b/seed/static/seed/js/controllers/new_member_modal_controller.js index a363d41162..54666a829e 100644 --- a/seed/static/seed/js/controllers/new_member_modal_controller.js +++ b/seed/static/seed/js/controllers/new_member_modal_controller.js @@ -1,50 +1,57 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.new_member_modal', []) -.controller('new_member_modal_controller', [ - '$scope', - '$uibModalInstance', - 'organization', - 'user_service', - '$timeout', - '$translate', - function ($scope, $uibModalInstance, organization, user_service, $timeout, $translate) { - $scope.roles = [{ - name: $translate.instant('Member'), - value: 'member' - }, { - name: $translate.instant('Owner'), - value: 'owner' - }, { - name: $translate.instant('Viewer'), - value: 'viewer' - }]; - $scope.user = {}; - $scope.user.role = $scope.roles[0]; - $scope.user.organization = organization; + .controller('new_member_modal_controller', [ + '$scope', + '$uibModalInstance', + 'organization', + 'user_service', + '$timeout', + '$translate', + function ( + $scope, + $uibModalInstance, + organization, + user_service, + $timeout, + $translate + ) { + $scope.roles = [{ + name: $translate.instant('Member'), + value: 'member' + }, { + name: $translate.instant('Owner'), + value: 'owner' + }, { + name: $translate.instant('Viewer'), + value: 'viewer' + }]; + $scope.user = {}; + $scope.user.role = $scope.roles[0]; + $scope.user.organization = organization; - /** - * adds a user to the org - */ - $scope.submit_form = function () { - user_service.add($scope.user).then(function () { - $uibModalInstance.close(); - }, function (data) { - $scope.$emit('app_error', data); - }); - }; + /** + * adds a user to the org + */ + $scope.submit_form = function () { + user_service.add($scope.user).then(function () { + $uibModalInstance.close(); + }, function (data) { + $scope.$emit('app_error', data); + }); + }; - $scope.close = function () { - $uibModalInstance.close(); - }; + $scope.close = function () { + $uibModalInstance.close(); + }; - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; + $scope.cancel = function () { + $uibModalInstance.dismiss('cancel'); + }; - $timeout(function () { - angular.element('#newMemberFirstName').focus(); - }, 50); - }]); + $timeout(function () { + angular.element('#newMemberFirstName').focus(); + }, 50); + }]); diff --git a/seed/static/seed/js/controllers/organization_controller.js b/seed/static/seed/js/controllers/organization_controller.js index 6c79ca46b3..4aa8281e67 100644 --- a/seed/static/seed/js/controllers/organization_controller.js +++ b/seed/static/seed/js/controllers/organization_controller.js @@ -1,17 +1,17 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.organization', []) -.controller('organization_controller', [ - '$scope', - '$uibModal', - 'users_payload', - 'organization_payload', - 'auth_payload', - 'organization_service', - 'urls', - function ( + .controller('organization_controller', [ + '$scope', + '$uibModal', + 'users_payload', + 'organization_payload', + 'auth_payload', + 'organization_service', + 'urls', + function ( $scope, $uibModal, users_payload, @@ -20,38 +20,38 @@ angular.module('BE.seed.controller.organization', []) organization_service, urls ) { - $scope.users = users_payload.users; - $scope.org = organization_payload.organization; - $scope.auth = auth_payload.auth; + $scope.users = users_payload.users; + $scope.org = organization_payload.organization; + $scope.auth = auth_payload.auth; - $scope.new_member_modal = function () { - $uibModal.open({ - templateUrl: urls.static_url + 'seed/partials/new_member_modal.html', - controller: 'new_member_modal_controller' - }); - }; + $scope.new_member_modal = function () { + $uibModal.open({ + templateUrl: urls.static_url + 'seed/partials/new_member_modal.html', + controller: 'new_member_modal_controller' + }); + }; - /** - * open the create a sub org modal - */ - $scope.create_sub_organization_modal = function () { - var modalInstance = $uibModal.open({ - templateUrl: urls.static_url + 'seed/partials/create_sub_organization_modal.html', - controller: 'create_sub_organization_modal_controller', - resolve: { - organization: function () { - return $scope.org; + /** + * open the create a sub org modal + */ + $scope.create_sub_organization_modal = function () { + var modalInstance = $uibModal.open({ + templateUrl: urls.static_url + 'seed/partials/create_sub_organization_modal.html', + controller: 'create_sub_organization_modal_controller', + resolve: { + organization: function () { + return $scope.org; + } } - } - }); - modalInstance.result.then(function () { - organization_service.get_organization($scope.org.id) - .then(function (data) { - $scope.org = data.organization; - }); - }, function () { - // dismiss - }); - }; - } -]); + }); + modalInstance.result.then(function () { + organization_service.get_organization($scope.org.id) + .then(function (data) { + $scope.org = data.organization; + }); + }, function () { + // dismiss + }); + }; + } + ]); diff --git a/seed/static/seed/js/controllers/organization_settings_controller.js b/seed/static/seed/js/controllers/organization_settings_controller.js index 73b965a35e..66da69351d 100644 --- a/seed/static/seed/js/controllers/organization_settings_controller.js +++ b/seed/static/seed/js/controllers/organization_settings_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.organization_settings', []).controller('organization_settings_controller', [ @@ -8,11 +8,13 @@ angular.module('BE.seed.controller.organization_settings', []).controller('organ 'auth_payload', 'organization_service', '$translate', - function ($scope, - organization_payload, - auth_payload, - organization_service, - $translate) { + function ( + $scope, + organization_payload, + auth_payload, + organization_service, + $translate + ) { $scope.org = organization_payload.organization; $scope.auth = auth_payload.auth; diff --git a/seed/static/seed/js/controllers/organization_sharing_controller.js b/seed/static/seed/js/controllers/organization_sharing_controller.js index ca9cc6d491..66d59a2a73 100644 --- a/seed/static/seed/js/controllers/organization_sharing_controller.js +++ b/seed/static/seed/js/controllers/organization_sharing_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.organization_sharing', []).controller('organization_sharing_controller', [ @@ -11,14 +11,16 @@ angular.module('BE.seed.controller.organization_sharing', []).controller('organi 'auth_payload', 'organization_service', '$filter', - function ($scope, - all_columns, - organization_payload, - query_threshold_payload, - shared_fields_payload, - auth_payload, - organization_service, - $filter) { + function ( + $scope, + all_columns, + organization_payload, + query_threshold_payload, + shared_fields_payload, + auth_payload, + organization_service, + $filter + ) { $scope.fields = all_columns.columns; $scope.org = organization_payload.organization; $scope.filter_params = {}; diff --git a/seed/static/seed/js/controllers/pairing_controller.js b/seed/static/seed/js/controllers/pairing_controller.js index 3a372ae0c8..bb46ff801d 100644 --- a/seed/static/seed/js/controllers/pairing_controller.js +++ b/seed/static/seed/js/controllers/pairing_controller.js @@ -1,5 +1,5 @@ /* - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.pairing', []).controller('pairing_controller', [ @@ -20,23 +20,25 @@ angular.module('BE.seed.controller.pairing', []).controller('pairing_controller' 'dragulaService', 'naturalSort', '$translate', - function ($scope, - $log, - $q, - import_file_payload, - inventory_service, - pairing_service, - allPropertyColumns, - allTaxlotColumns, - propertyInventory, - taxlotInventory, - cycles, - $state, - $stateParams, - spinner_utility, - dragulaService, - naturalSort, - $translate) { + function ( + $scope, + $log, + $q, + import_file_payload, + inventory_service, + pairing_service, + allPropertyColumns, + allTaxlotColumns, + propertyInventory, + taxlotInventory, + cycles, + $state, + $stateParams, + spinner_utility, + dragulaService, + naturalSort, + $translate + ) { spinner_utility.show(); $scope.import_file = import_file_payload.import_file; @@ -73,8 +75,8 @@ angular.module('BE.seed.controller.pairing', []).controller('pairing_controller' }; var refreshObjects = function () { - var propertyColumnNames = _.map($scope.propertyColumns, 'name'); - var taxlotColumnNames = _.map($scope.taxlotColumns, 'name'); + // var propertyColumnNames = _.map($scope.propertyColumns, 'name'); + // var taxlotColumnNames = _.map($scope.taxlotColumns, 'name'); var promises = []; promises.push(inventory_service.get_properties(1, undefined, $scope.cycle.selected_cycle, undefined)); diff --git a/seed/static/seed/js/controllers/pairing_settings_controller.js b/seed/static/seed/js/controllers/pairing_settings_controller.js index bb813ea348..fb274ab7e5 100644 --- a/seed/static/seed/js/controllers/pairing_settings_controller.js +++ b/seed/static/seed/js/controllers/pairing_settings_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.pairing_settings', []) diff --git a/seed/static/seed/js/controllers/profile_controller.js b/seed/static/seed/js/controllers/profile_controller.js index f1f192c481..1dd7ec2669 100644 --- a/seed/static/seed/js/controllers/profile_controller.js +++ b/seed/static/seed/js/controllers/profile_controller.js @@ -1,5 +1,5 @@ /* - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.profile', []) @@ -9,11 +9,13 @@ angular.module('BE.seed.controller.profile', []) 'auth_payload', 'user_profile_payload', 'user_service', - function ($scope, - urls, - auth_payload, - user_profile_payload, - user_service) { + function ( + $scope, + urls, + auth_payload, + user_profile_payload, + user_service + ) { $scope.is_superuser = auth_payload.auth.requires_superuser; $scope.user = user_profile_payload; $scope.user_updated = false; diff --git a/seed/static/seed/js/controllers/security_controller.js b/seed/static/seed/js/controllers/security_controller.js index fdd5f0efb9..194278d337 100644 --- a/seed/static/seed/js/controllers/security_controller.js +++ b/seed/static/seed/js/controllers/security_controller.js @@ -1,35 +1,35 @@ /* - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.security', []) -.controller('security_controller', [ - '$scope', - 'urls', - 'auth_payload', - 'user_service', - 'user_profile_payload', - function ( + .controller('security_controller', [ + '$scope', + 'urls', + 'auth_payload', + 'user_service', + 'user_profile_payload', + function ( $scope, urls, auth_payload, user_service, user_profile_payload ) { - $scope.is_superuser = auth_payload.auth.requires_superuser; - $scope.username = user_profile_payload.first_name + ' ' + user_profile_payload.last_name; + $scope.is_superuser = auth_payload.auth.requires_superuser; + $scope.username = user_profile_payload.first_name + ' ' + user_profile_payload.last_name; - /** - * sets the user's password - */ - $scope.change_password = function () { - user_service.set_password($scope.current_password, $scope.password_1, $scope.password_2).then(function () { - $scope.password_updated = true; - $scope.error_message = ''; - }, function (response) { - $scope.password_updated = false; - $scope.error_message = response.data.message; - }); - }; + /** + * sets the user's password + */ + $scope.change_password = function () { + user_service.set_password($scope.current_password, $scope.password_1, $scope.password_2).then(function () { + $scope.password_updated = true; + $scope.error_message = ''; + }, function (response) { + $scope.password_updated = false; + $scope.error_message = response.data.message; + }); + }; - }]); + }]); diff --git a/seed/static/seed/js/controllers/settings_profile_modal_controller.js b/seed/static/seed/js/controllers/settings_profile_modal_controller.js index 32ed068356..a9527caecd 100644 --- a/seed/static/seed/js/controllers/settings_profile_modal_controller.js +++ b/seed/static/seed/js/controllers/settings_profile_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.settings_profile_modal', []) diff --git a/seed/static/seed/js/controllers/show_populated_columns_modal_controller.js b/seed/static/seed/js/controllers/show_populated_columns_modal_controller.js index 02ecc9fcdf..12931452f0 100644 --- a/seed/static/seed/js/controllers/show_populated_columns_modal_controller.js +++ b/seed/static/seed/js/controllers/show_populated_columns_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.show_populated_columns_modal', []) @@ -107,7 +107,7 @@ angular.module('BE.seed.controller.show_populated_columns_modal', []) var id = $scope.currentProfile.id; var profile = _.omit($scope.currentProfile, 'id'); profile.columns = columns; - inventory_service.update_settings_profile(id, profile).then(function (updatedProfile) { + inventory_service.update_settings_profile(id, profile).then(function (/*updatedProfile*/) { modified_service.resetModified(); $scope.progress = 100; $scope.state = 'done'; diff --git a/seed/static/seed/js/controllers/unmerge_modal_controller.js b/seed/static/seed/js/controllers/unmerge_modal_controller.js index e205753547..ad9c3652b5 100644 --- a/seed/static/seed/js/controllers/unmerge_modal_controller.js +++ b/seed/static/seed/js/controllers/unmerge_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.unmerge_modal', []) diff --git a/seed/static/seed/js/controllers/update_building_labels_modal_controller.js b/seed/static/seed/js/controllers/update_building_labels_modal_controller.js index 666428f78c..ddb524aed5 100644 --- a/seed/static/seed/js/controllers/update_building_labels_modal_controller.js +++ b/seed/static/seed/js/controllers/update_building_labels_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.controller.update_building_labels_modal', []) diff --git a/seed/static/seed/js/controllers/update_item_labels_modal_controller.js b/seed/static/seed/js/controllers/update_item_labels_modal_controller.js index 6c5b26bef3..7c60cbd91f 100644 --- a/seed/static/seed/js/controllers/update_item_labels_modal_controller.js +++ b/seed/static/seed/js/controllers/update_item_labels_modal_controller.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author * * Controller for the Update Labels modal window. diff --git a/seed/static/seed/js/decorators/ui-grid.js b/seed/static/seed/js/decorators/ui-grid.js index 30d548c355..ee424cf5cf 100644 --- a/seed/static/seed/js/decorators/ui-grid.js +++ b/seed/static/seed/js/decorators/ui-grid.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ diff --git a/seed/static/seed/js/directives/sdBasicPropertyInfoChart.js b/seed/static/seed/js/directives/sdBasicPropertyInfoChart.js index 079a799d3c..b87f2bbf7c 100644 --- a/seed/static/seed/js/directives/sdBasicPropertyInfoChart.js +++ b/seed/static/seed/js/directives/sdBasicPropertyInfoChart.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('sdBasicPropertyInfoChart', []) diff --git a/seed/static/seed/js/directives/sdCheckCycleExists.js b/seed/static/seed/js/directives/sdCheckCycleExists.js index 584f09e18d..27a9f57e57 100644 --- a/seed/static/seed/js/directives/sdCheckCycleExists.js +++ b/seed/static/seed/js/directives/sdCheckCycleExists.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('sdCheckCycleExists', []).directive('sdCheckCycleExists', function () { diff --git a/seed/static/seed/js/directives/sdCheckLabelExists.js b/seed/static/seed/js/directives/sdCheckLabelExists.js index fac78424d9..fab891cd52 100644 --- a/seed/static/seed/js/directives/sdCheckLabelExists.js +++ b/seed/static/seed/js/directives/sdCheckLabelExists.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('sdCheckLabelExists', []).directive('sdCheckLabelExists', function () { diff --git a/seed/static/seed/js/directives/sdDropdown.js b/seed/static/seed/js/directives/sdDropdown.js index 169166fa4c..04294e4c39 100644 --- a/seed/static/seed/js/directives/sdDropdown.js +++ b/seed/static/seed/js/directives/sdDropdown.js @@ -1,33 +1,33 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('sdDropdown', []) -.directive('sdDropdown', ['urls', function (urls) { - return { - restrict: 'E', - require: '^ngModel', - scope: { - ngModel: '=', // selection - items: '=', // items to select from - callback: '&' // callback - }, - link: function (scope, element, attrs) { - element.on('click', function (event) { - event.preventDefault(); - }); + .directive('sdDropdown', ['urls', function (urls) { + return { + restrict: 'E', + require: '^ngModel', + scope: { + ngModel: '=', // selection + items: '=', // items to select from + callback: '&' // callback + }, + link: function (scope, element, attrs) { + element.on('click', function (event) { + event.preventDefault(); + }); - scope.default = 'Please select item'; - scope.isButton = 'isButton' in attrs; + scope.default = 'Please select item'; + scope.isButton = 'isButton' in attrs; - // selection changed handler - scope.select = function (item) { - scope.ngModel = item; - if (scope.callback) { - scope.callback({ item: item }); - } - }; - }, - templateUrl: urls.static_url + 'seed/js/directives/sd-dropdown-template.html' - }; -}]); + // selection changed handler + scope.select = function (item) { + scope.ngModel = item; + if (scope.callback) { + scope.callback({ item: item }); + } + }; + }, + templateUrl: urls.static_url + 'seed/js/directives/sd-dropdown-template.html' + }; + }]); diff --git a/seed/static/seed/js/directives/sdEnter.js b/seed/static/seed/js/directives/sdEnter.js index a2c538bf77..b656e7695b 100644 --- a/seed/static/seed/js/directives/sdEnter.js +++ b/seed/static/seed/js/directives/sdEnter.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/js/directives/sdLabel.js b/seed/static/seed/js/directives/sdLabel.js index d2e1909bfc..8c8ca67e1b 100644 --- a/seed/static/seed/js/directives/sdLabel.js +++ b/seed/static/seed/js/directives/sdLabel.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/js/directives/sdResizable.js b/seed/static/seed/js/directives/sdResizable.js index d2f3e602c7..79ecebf8a9 100644 --- a/seed/static/seed/js/directives/sdResizable.js +++ b/seed/static/seed/js/directives/sdResizable.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ (function () { diff --git a/seed/static/seed/js/directives/sdScrollSync.js b/seed/static/seed/js/directives/sdScrollSync.js index f98df996b8..11985487ea 100644 --- a/seed/static/seed/js/directives/sdScrollSync.js +++ b/seed/static/seed/js/directives/sdScrollSync.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/js/directives/sdUploader.js b/seed/static/seed/js/directives/sdUploader.js index 70fe1b8953..13469c2335 100644 --- a/seed/static/seed/js/directives/sdUploader.js +++ b/seed/static/seed/js/directives/sdUploader.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** @@ -160,7 +160,9 @@ var makeS3Uploader = function (scope, element) { if (_.has(json, 'message')) { error = json.message; } - } catch (e) {} + } catch (e) { + // no-op + } scope.eventfunc({ message: 'upload_error', @@ -310,7 +312,9 @@ var makeFileSystemUploader = function (scope, element) { if (_.has(json, 'message')) { error = json.message; } - } catch (e) {} + } catch (e) { + // no-op + } scope.eventfunc({ message: 'upload_error', @@ -339,7 +343,7 @@ var makeBuildingSyncUploader = function (scope, element) { } }, validation: { - allowedExtensions: ['xml'] + allowedExtensions: ['xml', 'zip'] }, text: { uploadButton: scope.buttontext @@ -397,7 +401,8 @@ var makeBuildingSyncUploader = function (scope, element) { filename: fileName, view_id: _.get(responseJSON, 'data.property_view.id'), cycle_id: (scope.sourceprog === 'PortfolioManager' && scope.$parent.useField) ? 'year_ending' : scope.$parent.selectedCycle.id, - source_type: scope.sourcetype + source_type: scope.sourcetype, + message: _.get(responseJSON, 'message') } }); } @@ -446,7 +451,9 @@ var makeBuildingSyncUploader = function (scope, element) { if (_.has(json, 'message')) { error = json.message; } - } catch (e) {} + } catch (e) { + // no-op + } scope.eventfunc({ message: 'upload_error', @@ -585,7 +592,9 @@ var makeBuildingSyncUpdater = function (scope, element) { if (_.has(json, 'message')) { error = json.message; } - } catch (e) {} + } catch (e) { + // no-op + } scope.eventfunc({ message: 'upload_error', diff --git a/seed/static/seed/js/directives/sdWhenScrolled.js b/seed/static/seed/js/directives/sdWhenScrolled.js index 34e066402d..7e55c4cb2c 100644 --- a/seed/static/seed/js/directives/sdWhenScrolled.js +++ b/seed/static/seed/js/directives/sdWhenScrolled.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/js/filters/district.js b/seed/static/seed/js/filters/district.js index 7e7f74962e..39961454cd 100644 --- a/seed/static/seed/js/filters/district.js +++ b/seed/static/seed/js/filters/district.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/js/filters/fromNow.js b/seed/static/seed/js/filters/fromNow.js index c5c953ca37..87ab4b9a68 100644 --- a/seed/static/seed/js/filters/fromNow.js +++ b/seed/static/seed/js/filters/fromNow.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/js/filters/ignoremap.js b/seed/static/seed/js/filters/ignoremap.js index 887d890ec9..d91bc2e00e 100644 --- a/seed/static/seed/js/filters/ignoremap.js +++ b/seed/static/seed/js/filters/ignoremap.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('ignoremap', []).filter('ignoremap', function () { diff --git a/seed/static/seed/js/filters/startFrom.js b/seed/static/seed/js/filters/startFrom.js index 091475b9da..1e005a63e8 100644 --- a/seed/static/seed/js/filters/startFrom.js +++ b/seed/static/seed/js/filters/startFrom.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/js/filters/stripImportPrefix.js b/seed/static/seed/js/filters/stripImportPrefix.js index 77818faf47..0cc9da5204 100644 --- a/seed/static/seed/js/filters/stripImportPrefix.js +++ b/seed/static/seed/js/filters/stripImportPrefix.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/js/filters/titleCase.js b/seed/static/seed/js/filters/titleCase.js index 99b276b5b2..33880e333f 100644 --- a/seed/static/seed/js/filters/titleCase.js +++ b/seed/static/seed/js/filters/titleCase.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/js/filters/typedNumber.js b/seed/static/seed/js/filters/typedNumber.js index 21e31906f9..d9e41c6f33 100644 --- a/seed/static/seed/js/filters/typedNumber.js +++ b/seed/static/seed/js/filters/typedNumber.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/js/seed.js b/seed/static/seed/js/seed.js index 7d2ad4cd54..ef8167bd6e 100644 --- a/seed/static/seed/js/seed.js +++ b/seed/static/seed/js/seed.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** @@ -27,7 +27,6 @@ angular.module('BE.seed.vendor_dependencies', [ 'ui.router', 'ui.router.stateHelper', 'ui.sortable', - 'ui.tree', 'focus-if', 'xeditable', angularDragula(angular), @@ -173,7 +172,7 @@ SEED_app.run([ $rootScope._ = window._; // ui-router transition actions - $transitions.onStart({}, function (transition) { + $transitions.onStart({}, function (/*transition*/) { if (modified_service.isModified()) { return modified_service.showModifiedDialog().then(function () { modified_service.resetModified(); @@ -185,7 +184,7 @@ SEED_app.run([ } }); - $transitions.onSuccess({}, function (transition) { + $transitions.onSuccess({}, function (/*transition*/) { if ($rootScope.route_load_error && $rootScope.load_error_message === 'Your SEED account is not associated with any organizations. Please contact a SEED administrator.') { $state.go('home'); return; @@ -232,21 +231,21 @@ SEED_app.run([ /** * Initialize release flippers */ -SEED_app.run([ - 'flippers', - function (flippers) { - // wraps some minor UI that we'll need until we migrate to delete the old - // PropertyState columns for EUI and area. This flipper should be removed - // for 2.4 when we remove the archived "_orig" area and EUI columns. - // - // - // flippers.make_flipper('ryan@ryanmccuaig.net', '2018-05-31T00:00:00Z', - // 'release:orig_columns', 'boolean', true); - // - // var make2 = _.partial(flippers.make_flipper, 'nicholas.long@nrel.gov', '2018-01-01T00:00:00Z'); - // make2('release:bricr', 'boolean', true); - } -]); +// SEED_app.run([ +// 'flippers', +// function (flippers) { +// // wraps some minor UI that we'll need until we migrate to delete the old +// // PropertyState columns for EUI and area. This flipper should be removed +// // for 2.4 when we remove the archived "_orig" area and EUI columns. +// // +// // +// // flippers.make_flipper('ryan@ryanmccuaig.net', '2018-05-31T00:00:00Z', +// // 'release:orig_columns', 'boolean', true); +// // +// // var make2 = _.partial(flippers.make_flipper, 'nicholas.long@nrel.gov', '2018-01-01T00:00:00Z'); +// // make2('release:bricr', 'boolean', true); +// } +// ]); /** * Create custom UI-Grid templates @@ -360,7 +359,6 @@ SEED_app.config(['stateHelperProvider', '$urlRouterProvider', '$locationProvider resolve: { columns: ['$stateParams', 'user_service', 'inventory_service', 'naturalSort', function ($stateParams, user_service, inventory_service, naturalSort) { var organization_id = user_service.get_organization().id; - console.log(organization_id); if ($stateParams.inventory_type === 'properties') { return inventory_service.get_property_columns_for_org(organization_id).then(function (columns) { columns = _.reject(columns, 'related'); @@ -1225,10 +1223,10 @@ SEED_app.constant('naturalSort', function (a, b) { * Natural Sort algorithm for Javascript - Version 0.8.1 - Released under MIT license * Author: Jim Palmer (based on chunking idea from Dave Koelle) */ - var re = /(^([+\-]?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?(?=\D|\s|$))|^0x[\da-fA-F]+$|\d+)/g, + var re = /(^([+-]?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?(?=\D|\s|$))|^0x[\da-fA-F]+$|\d+)/g, sre = /^\s+|\s+$/g, // trim pre-post whitespace snre = /\s+/g, // normalize all whitespace to single ' ' character - dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, + dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[/-]\d{1,4}[/-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, ore = /^0/, i = function (s) { return (('' + s).toLowerCase() || '' + s).replace(sre, ''); diff --git a/seed/static/seed/js/services/auth_service.js b/seed/static/seed/js/services/auth_service.js index c0c7395bff..d49f680d23 100644 --- a/seed/static/seed/js/services/auth_service.js +++ b/seed/static/seed/js/services/auth_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.service.auth', []).factory('auth_service', [ diff --git a/seed/static/seed/js/services/column_mappings_service.js b/seed/static/seed/js/services/column_mappings_service.js index 623e600ab1..a6fba25790 100644 --- a/seed/static/seed/js/services/column_mappings_service.js +++ b/seed/static/seed/js/services/column_mappings_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.service.column_mappings', []).factory('column_mappings_service', [ diff --git a/seed/static/seed/js/services/columns_service.js b/seed/static/seed/js/services/columns_service.js index bfa6563c32..982d75bede 100644 --- a/seed/static/seed/js/services/columns_service.js +++ b/seed/static/seed/js/services/columns_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.service.columns', []).factory('columns_service', [ diff --git a/seed/static/seed/js/services/cycle_service.js b/seed/static/seed/js/services/cycle_service.js index 78cd78a9b5..c14b0008ca 100644 --- a/seed/static/seed/js/services/cycle_service.js +++ b/seed/static/seed/js/services/cycle_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.service.cycle', []).factory('cycle_service', [ diff --git a/seed/static/seed/js/services/data_quality_service.js b/seed/static/seed/js/services/data_quality_service.js index e8cb86b0a7..52c0ee0432 100644 --- a/seed/static/seed/js/services/data_quality_service.js +++ b/seed/static/seed/js/services/data_quality_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // data_quality services diff --git a/seed/static/seed/js/services/dataset_service.js b/seed/static/seed/js/services/dataset_service.js index 3e48984ee2..09366fcd13 100644 --- a/seed/static/seed/js/services/dataset_service.js +++ b/seed/static/seed/js/services/dataset_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // dataset services diff --git a/seed/static/seed/js/services/flippers.js b/seed/static/seed/js/services/flippers.js index 904598719f..67ce323822 100644 --- a/seed/static/seed/js/services/flippers.js +++ b/seed/static/seed/js/services/flippers.js @@ -2,7 +2,7 @@ // bit minimum-useable right now .. just want this to squawk after it goes stale so as not to // forget about it. angular.module('BE.seed.service.flippers', []) - .factory('flippers', [function () { + .factory('flippers', ['$log', function ($log) { var registry = {}; var flippers = new Object(); @@ -25,7 +25,7 @@ angular.module('BE.seed.service.flippers', []) var log_stale_flipper = function (flipper) { // TODO throw someplace more useful; raven? sentry? - console.warn('Flipper \'' + flipper.label + '\' is stale; tell ' + flipper.owner + ' to tidy up.'); + $log.warn('Flipper \'' + flipper.label + '\' is stale; tell ' + flipper.owner + ' to tidy up.'); }; flippers.is_active = function (s) { diff --git a/seed/static/seed/js/services/http_serializer.js b/seed/static/seed/js/services/http_serializer.js index 38b854d97a..f1e78a94fa 100644 --- a/seed/static/seed/js/services/http_serializer.js +++ b/seed/static/seed/js/services/http_serializer.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author 'Nicholas Serra ' */ /** diff --git a/seed/static/seed/js/services/inventory_reports_service.js b/seed/static/seed/js/services/inventory_reports_service.js index f4b45765f8..1bf1554756 100644 --- a/seed/static/seed/js/services/inventory_reports_service.js +++ b/seed/static/seed/js/services/inventory_reports_service.js @@ -1,15 +1,17 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.service.inventory_reports', []).factory('inventory_reports_service', [ - '$http', - '$log', - 'user_service', - function ($http, - $log, - user_service) { + '$http', + '$log', + 'user_service', + function ( + $http, + $log, + user_service + ) { /** @@ -39,30 +41,30 @@ angular.module('BE.seed.service.inventory_reports', ] } */ - function get_report_data (xVar, yVar, start, end) { + function get_report_data (xVar, yVar, start, end) { - // Error checks - if (_.isNil(xVar) || _.isNil(yVar) || _.isNil(start) || _.isNil(end)) { - $log.error('#inventory_reports_service.get_report_data(): null parameter'); - throw new Error('Invalid Parameter'); - } - - return $http.get(window.BE.urls.get_inventory_report_data, { - params: { - organization_id: user_service.get_organization().id, - x_var: xVar, - y_var: yVar, - start: start, - end: end - } - }).then(function (response) { - building_reports_factory.report_data = _.has(response.data, 'report_data') ? response.data.report_data : []; - return response.data; - }).catch(function () { - building_reports_factory.reports_data = []; - }); + // Error checks + if (_.isNil(xVar) || _.isNil(yVar) || _.isNil(start) || _.isNil(end)) { + $log.error('#inventory_reports_service.get_report_data(): null parameter'); + throw new Error('Invalid Parameter'); } + return $http.get(window.BE.urls.get_inventory_report_data, { + params: { + organization_id: user_service.get_organization().id, + x_var: xVar, + y_var: yVar, + start: start, + end: end + } + }).then(function (response) { + building_reports_factory.report_data = _.has(response.data, 'report_data') ? response.data.report_data : []; + return response.data; + }).catch(function () { + building_reports_factory.reports_data = []; + }); + } + /** Get aggregated property data given the provided parameters. @@ -73,65 +75,65 @@ angular.module('BE.seed.service.inventory_reports', { "status": "(success or error)", "aggregated_data": { - "chart_data": [ - { - "x": value for x var, - "y": value for secondary grouping - (e.g. '1990-1999' for decade when getting data - where y_var = year_built), - }, + "chart_data": [{ + "x": value for x var, + "y": value for secondary grouping + (e.g. '1990-1999' for decade when getting data + where y_var = year_built), + }, { ... - ], - "property_counts": [ - { - "yr_e": string for year ending - group by - "num_buildings": number of buildings in query results - "num_buildings_w_data" : number of buildings with valid - x and y data in this group. - }, - ... + }], + "property_counts": [{ + "yr_e": string for year ending - group by + "num_buildings": number of buildings in query results + "num_buildings_w_data": number of buildings with valid + x and y data in this group. + }, { + ... + }] } - */ - function get_aggregated_report_data (xVar, yVar, start, end) { - - // Error checks - if (_.isNil(xVar) || _.isNil(yVar) || _.isNil(start) || _.isNil(end)) { - $log.error('#inventory_reports_service.get_aggregated_report_data(): null parameter'); - throw new Error('Invalid Parameter'); - } + } + */ + function get_aggregated_report_data (xVar, yVar, start, end) { - return $http.get(window.BE.urls.get_aggregated_inventory_report_data, { - params: { - organization_id: user_service.get_organization().id, - x_var: xVar, - y_var: yVar, - start: start, - end: end - } - }).then(function (response) { - building_reports_factory.aggregated_reports_data = _.has(response.data, 'report_data') ? response.data.report_data : []; - return response.data; - }).catch(function () { - building_reports_factory.aggregated_reports_data = []; - }); + // Error checks + if (_.isNil(xVar) || _.isNil(yVar) || _.isNil(start) || _.isNil(end)) { + $log.error('#inventory_reports_service.get_aggregated_report_data(): null parameter'); + throw new Error('Invalid Parameter'); } + return $http.get(window.BE.urls.get_aggregated_inventory_report_data, { + params: { + organization_id: user_service.get_organization().id, + x_var: xVar, + y_var: yVar, + start: start, + end: end + } + }).then(function (response) { + building_reports_factory.aggregated_reports_data = _.has(response.data, 'report_data') ? response.data.report_data : []; + return response.data; + }).catch(function () { + building_reports_factory.aggregated_reports_data = []; + }); + } + /* Public API */ - var building_reports_factory = { + var building_reports_factory = { //properties - reports_data: [], - aggregated_reports_data: [], - summary_data: [], + reports_data: [], + aggregated_reports_data: [], + summary_data: [], //functions //get_summary_data : get_summary_data, - get_report_data: get_report_data, - get_aggregated_report_data: get_aggregated_report_data + get_report_data: get_report_data, + get_aggregated_report_data: get_aggregated_report_data - }; + }; - return building_reports_factory; + return building_reports_factory; - }]); + }]); diff --git a/seed/static/seed/js/services/inventory_service.js b/seed/static/seed/js/services/inventory_service.js index ee9cd7a322..da1a23d33d 100644 --- a/seed/static/seed/js/services/inventory_service.js +++ b/seed/static/seed/js/services/inventory_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // inventory services @@ -11,8 +11,7 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [ 'cycle_service', 'spinner_utility', 'naturalSort', - 'flippers', - function ($http, $log, urls, user_service, cycle_service, spinner_utility, naturalSort, flippers) { + function ($http, $log, urls, user_service, cycle_service, spinner_utility, naturalSort) { var inventory_service = { total_properties_for_user: 0, @@ -414,7 +413,7 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [ // Rename display_name to displayName (ui-grid compatibility) columns = _.map(columns, function (col) { - return _.mapKeys(col, function(value, key) { + return _.mapKeys(col, function (value, key) { return key === 'display_name' ? 'displayName' : key; }); }); @@ -431,7 +430,7 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [ return _.includes(iteratee, value, index + 1); }); if (duplicates.length) { - console.error('Duplicate property column names detected:', duplicates); + $log.error('Duplicate property column names detected:', duplicates); } return columns; @@ -451,7 +450,7 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [ // Rename display_name to displayName (ui-grid compatibility) columns = _.map(columns, function (col) { - return _.mapKeys(col, function(value, key) { + return _.mapKeys(col, function (value, key) { return key === 'display_name' ? 'displayName' : key; }); }); @@ -468,7 +467,7 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [ return _.includes(iteratee, value, index + 1); }); if (duplicates.length) { - console.error('Duplicate property column names detected:', duplicates); + $log.error('Duplicate property column names detected:', duplicates); } return columns; @@ -492,7 +491,7 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [ // Rename display_name to displayName (ui-grid compatibility) columns = _.map(columns, function (col) { - return _.mapKeys(col, function(value, key) { + return _.mapKeys(col, function (value, key) { return key === 'display_name' ? 'displayName' : key; }); }); @@ -509,7 +508,7 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [ return _.includes(iteratee, value, index + 1); }); if (duplicates.length) { - console.error('Duplicate tax lot column names detected:', duplicates); + $log.error('Duplicate tax lot column names detected:', duplicates); } return columns; @@ -529,7 +528,7 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [ // Rename display_name to displayName (ui-grid compatibility) columns = _.map(columns, function (col) { - return _.mapKeys(col, function(value, key) { + return _.mapKeys(col, function (value, key) { return key === 'display_name' ? 'displayName' : key; }); }); @@ -546,7 +545,7 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [ return _.includes(iteratee, value, index + 1); }); if (duplicates.length) { - console.error('Duplicate tax lot column names detected:', duplicates); + $log.error('Duplicate tax lot column names detected:', duplicates); } return columns; @@ -924,7 +923,6 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [ organization_id: user_service.get_organization().id } }).then(function (response) { - console.log(angular.copy(response)); return response.data.data; }); }; diff --git a/seed/static/seed/js/services/label_service.js b/seed/static/seed/js/services/label_service.js index 7cfc551c04..eb8c214b3c 100644 --- a/seed/static/seed/js/services/label_service.js +++ b/seed/static/seed/js/services/label_service.js @@ -3,54 +3,56 @@ angular.module('BE.seed.service.label', []) '$http', '$log', 'user_service', - function ($http, $log, user_service) { - - - /** Label Service: - -------------------------------------------------- - Provides methods to CRUD labels on the server - as well as apply and remove labels to properties. - - Note: This is the first service to use proper REST verbs and REST-based - server APIs (provided by django-rest-framework). - If this approach works well, the hope is to refactor all Angular services - to use REST verbs and APIs. - */ - - - /** Returns an array of labels. - - @param {array} selected An array of properties ids corresponding to - selected properties (should be empty if - select_all_checkbox is true). - @param {object} search_params A reference to the Search object, which - includes properties for active filters. - - Returned label objects should have the following properties, - with 'text' and 'color' properties assigned locally. - - id {integer} The id of the label. - name {string} The text that appears in the label. - text {string} Same as name, needed for ngTagsInput control. - color {string} The text description of the label's color (e.g. 'blue'). - label {string} The css class, usually in bootstrap, used to generate - the color style (poorly named, needs refactoring). - is_applied {boolean} If a search object was passed in, this boolean - indicates if properties in the current filtered - set have this label. - - For example... - [ - { + function ( + $http, + $log, + user_service + ) { + + + /** Label Service: + -------------------------------------------------- + Provides methods to CRUD labels on the server + as well as apply and remove labels to properties. + + Note: This is the first service to use proper REST verbs and REST-based + server APIs (provided by django-rest-framework). + If this approach works well, the hope is to refactor all Angular services + to use REST verbs and APIs. + */ + + + /** Returns an array of labels. + + @param {array} selected An array of properties ids corresponding to + selected properties (should be empty if + select_all_checkbox is true). + @param {object} search_params A reference to the Search object, which + includes properties for active filters. + + Returned label objects should have the following properties, + with 'text' and 'color' properties assigned locally. + + id {integer} The id of the label. + name {string} The text that appears in the label. + text {string} Same as name, needed for ngTagsInput control. + color {string} The text description of the label's color (e.g. 'blue'). + label {string} The css class, usually in bootstrap, used to generate + the color style (poorly named, needs refactoring). + is_applied {boolean} If a search object was passed in, this boolean + indicates if properties in the current filtered + set have this label. + + For example... + [{ id: 1, name: "test1", color: "blue", label: "primary", text: "test1", is_applied : true - } - ] - */ + }] + */ function get_labels (selected, search_params) { return get_labels_for_org(user_service.get_organization().id, selected, search_params); @@ -61,7 +63,7 @@ angular.module('BE.seed.service.label', []) organization_id: org_id }, search_params); - // If no inventory_type specified use 'property' just to get the list of all labels + // If no inventory_type specified use 'property' just to get the list of all labels searchArgs.inventory_type = (searchArgs.inventory_type === 'taxlots') ? 'taxlot' : 'property'; return $http.post('/api/v2/labels/filter/', { @@ -74,18 +76,18 @@ angular.module('BE.seed.service.label', []) } - /* Add a label to an organization's list of labels + /* Add a label to an organization's list of labels - @param {object} label Label object to use for creating label on server. + @param {object} label Label object to use for creating label on server. - @return {object} Returns a promise object which will resolve - with either a success if the label was created - on the server, or an error if the label could not be - created on the server. + @return {object} Returns a promise object which will resolve + with either a success if the label was created + on the server, or an error if the label could not be + created on the server. - Return object should also have a 'label' property assigned - to the newly created label object. - */ + Return object should also have a 'label' property assigned + to the newly created label object. + */ function create_label (label) { return create_label_for_org(user_service.get_organization().id, label); } @@ -102,17 +104,17 @@ angular.module('BE.seed.service.label', []) } - /* Update an existing a label in an organization + /* Update an existing a label in an organization - @param {object} label A label object with changed properties to update on server. - The object must include property 'id' for label ID. + @param {object} label A label object with changed properties to update on server. + The object must include property 'id' for label ID. - @return {object} Returns a promise object which will resolve - with either a success if the label was updated, - or an error if not. - Return object will have a 'label' property assigned - to the updated label object. - */ + @return {object} Returns a promise object which will resolve + with either a success if the label was updated, + or an error if not. + Return object will have a 'label' property assigned + to the updated label object. + */ function update_label (label) { return update_label_for_org(user_service.get_organization().id, label); } @@ -127,15 +129,15 @@ angular.module('BE.seed.service.label', []) }); } - /* Delete a label from the set of labels for an organization. + /* Delete a label from the set of labels for an organization. - @param {object} label Label object to delete on server. - Must include property 'id' for label ID. + @param {object} label Label object to delete on server. + Must include property 'id' for label ID. - @return {object} Returns a promise object which will resolve - with either a success if the label was deleted, - or an error if not. - */ + @return {object} Returns a promise object which will resolve + with either a success if the label was deleted, + or an error if not. + */ function delete_label (label) { return delete_label_for_org(user_service.get_organization().id, label); } @@ -151,25 +153,25 @@ angular.module('BE.seed.service.label', []) } - /* FUNCTIONS FOR LABELS WITHIN PROPERTIES */ - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + /* FUNCTIONS FOR LABELS WITHIN PROPERTIES */ + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - /** + /** - This method updates selected Properties with a group - of "add" labels and a group of "remove" labels. + This method updates selected Properties with a group + of "add" labels and a group of "remove" labels. - @param {array} add_label_ids An array of label ids to apply to selected properties. - @param {array} remove_label_ids An array of label ids to remove from selected properties. - @param {array} selected An array of inventory ids corresponding to selected properties or taxlots - (should be empty to get all). - @param {object} search_params A reference to the Search object, which includes - properties for active filters, and inventory_type. - @return {object} A promise object that resolves server response - (success or error). + @param {array} add_label_ids An array of label ids to apply to selected properties. + @param {array} remove_label_ids An array of label ids to remove from selected properties. + @param {array} selected An array of inventory ids corresponding to selected properties or taxlots + (should be empty to get all). + @param {object} search_params A reference to the Search object, which includes + properties for active filters, and inventory_type. + @return {object} A promise object that resolves server response + (success or error). - */ + */ function update_property_labels (add_label_ids, remove_label_ids, selected, search_params) { return $http.put('/api/v2/labels-property/', { inventory_ids: selected, @@ -185,23 +187,23 @@ angular.module('BE.seed.service.label', []) } - /** - This method updates selected Tax Lots with a group - of "add" labels and a group of "remove" labels. + /** + This method updates selected Tax Lots with a group + of "add" labels and a group of "remove" labels. - @param {array} add_label_ids An array of label ids to apply to selected properties. - @param {array} remove_label_ids An array of label ids to remove from selected properties. - @param {array} selected An array of Tax Lot ids corresponding to selected Tax Lots - (should be empty if select_all_checkbox is true). - @param {boolean} select_all_checkbox A boolean indicating whether user checked 'Select all' checkbox. - @param {object} search_params A reference to the Search object, which includes - properties for active filters. + @param {array} add_label_ids An array of label ids to apply to selected properties. + @param {array} remove_label_ids An array of label ids to remove from selected properties. + @param {array} selected An array of Tax Lot ids corresponding to selected Tax Lots + (should be empty if select_all_checkbox is true). + @param {boolean} select_all_checkbox A boolean indicating whether user checked 'Select all' checkbox. + @param {object} search_params A reference to the Search object, which includes + properties for active filters. - @return {object} A promise object that resolves server response - (success or error). + @return {object} A promise object that resolves server response + (success or error). - */ + */ function update_taxlot_labels (add_label_ids, remove_label_ids, selected, search_params) { return $http.put('/api/v2/labels-taxlot/', { inventory_ids: selected, @@ -217,23 +219,23 @@ angular.module('BE.seed.service.label', []) } - /* Gets the list of supported colors for labels, based on default bootstrap - styles for labels. These are defined locally. + /* Gets the list of supported colors for labels, based on default bootstrap + styles for labels. These are defined locally. - @return {array} List of label option objects. + @return {array} List of label option objects. - Label option objects have the following structure - { - 'label' : {string} name of bootstrap class for label - 'color' : {string} text description of color - } + Label option objects have the following structure + { + 'label' : {string} name of bootstrap class for label + 'color' : {string} text description of color + } - NOTE: At some point label colors should be defined on the server and not - directly related to bootstrap colors. If we do stay with Bootstrap colors - we should change the property names to something like 'bootstrap-class' and - 'color-description' (rather than 'label') to make them more clear. + NOTE: At some point label colors should be defined on the server and not + directly related to bootstrap colors. If we do stay with Bootstrap colors + we should change the property names to something like 'bootstrap-class' and + 'color-description' (rather than 'label') to make them more clear. - */ + */ function get_available_colors () { return [{ label: 'success', @@ -273,28 +275,28 @@ angular.module('BE.seed.service.label', []) } } - /* "PRIVATE" METHODS */ - /* ~~~~~~~~~~~~~~~~~ */ + /* "PRIVATE" METHODS */ + /* ~~~~~~~~~~~~~~~~~ */ - /* Add a few properties to the label object so that it - works well with UI components. - */ + /* Add a few properties to the label object so that it + works well with UI components. + */ function update_label_w_local_props (lbl) { if (lbl) { - // add bootstrap label class names + // add bootstrap label class names lbl.label = lookup_label(lbl.color); - // create 'text' property needed for ngTagsInput control + // create 'text' property needed for ngTagsInput control lbl.text = lbl.name; } return lbl; } - /* Public API */ + /* Public API */ var label_factory = { - //functions + //functions get_labels: get_labels, get_labels_for_org: get_labels_for_org, create_label: create_label, diff --git a/seed/static/seed/js/services/main_service.js b/seed/static/seed/js/services/main_service.js index 482b6cb659..cc0b6192aa 100644 --- a/seed/static/seed/js/services/main_service.js +++ b/seed/static/seed/js/services/main_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // dataset services diff --git a/seed/static/seed/js/services/mapping_service.js b/seed/static/seed/js/services/mapping_service.js index 7aecef143d..5ae5a755df 100644 --- a/seed/static/seed/js/services/mapping_service.js +++ b/seed/static/seed/js/services/mapping_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // mapping services diff --git a/seed/static/seed/js/services/matching_service.js b/seed/static/seed/js/services/matching_service.js index 14e1b84226..d094f1b4ac 100644 --- a/seed/static/seed/js/services/matching_service.js +++ b/seed/static/seed/js/services/matching_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ diff --git a/seed/static/seed/js/services/modified_service.js b/seed/static/seed/js/services/modified_service.js index 6d593d280f..e97bd7dde5 100644 --- a/seed/static/seed/js/services/modified_service.js +++ b/seed/static/seed/js/services/modified_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // modified services @@ -14,9 +14,7 @@ angular.module('BE.seed.service.modified', []).factory('modified_service', [ modified_service.setModified = function () { if (!modified) { - $window.onbeforeunload = function () { - return 'You have unsaved changes.'; - }; + $window.onbeforeunload = _.constant('You have unsaved changes.'); modified = true; } }; diff --git a/seed/static/seed/js/services/note_service.js b/seed/static/seed/js/services/note_service.js index 5a45c3127e..7576fbbd04 100644 --- a/seed/static/seed/js/services/note_service.js +++ b/seed/static/seed/js/services/note_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.service.note', []).factory('note_service', [ diff --git a/seed/static/seed/js/services/organization_service.js b/seed/static/seed/js/services/organization_service.js index af831823b1..1c5f605bc5 100644 --- a/seed/static/seed/js/services/organization_service.js +++ b/seed/static/seed/js/services/organization_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // organization services diff --git a/seed/static/seed/js/services/pairing_service.js b/seed/static/seed/js/services/pairing_service.js index 7c42d5b515..3cae6f3c3f 100644 --- a/seed/static/seed/js/services/pairing_service.js +++ b/seed/static/seed/js/services/pairing_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ angular.module('BE.seed.service.pairing', []).factory('pairing_service', [ diff --git a/seed/static/seed/js/services/search_service.js b/seed/static/seed/js/services/search_service.js index 278fb3c01c..f74dc223f5 100644 --- a/seed/static/seed/js/services/search_service.js +++ b/seed/static/seed/js/services/search_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** @@ -38,8 +38,7 @@ angular.module('BE.seed.service.search', []) .factory('search_service', [ '$http', 'spinner_utility', - function ($http, - spinner_utility) { + function ($http, spinner_utility) { /************ * variables */ @@ -67,12 +66,10 @@ angular.module('BE.seed.service.search', []) has_checkbox: true, prefix: '' }; - search_service.next_page_disabled = ( - search_service.number_matching_search <= 10); + search_service.next_page_disabled = search_service.number_matching_search <= 10; search_service.showing = { start: 1, - end: (search_service.number_matching_search > 10) ? 10 : - search_service.number_matching_search + end: (search_service.number_matching_search > 10) ? 10 : search_service.number_matching_search }; var saas; // set to the local instance of the extended search_service this diff --git a/seed/static/seed/js/services/simple_modal_service.js b/seed/static/seed/js/services/simple_modal_service.js index 8bbe424f10..9468c6d68c 100644 --- a/seed/static/seed/js/services/simple_modal_service.js +++ b/seed/static/seed/js/services/simple_modal_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** @@ -45,9 +45,9 @@ angular.module('BE.seed.service.simple_modal', []) var validModalTypes = [TYPE_DEFAULT, TYPE_ERROR]; var modalDefaults = { - type: TYPE_DEFAULT, //can be "default" or "error" - backdrop: 'static', //user cannot click anywhere on screen to close modal, only buttons - keyboard: true, //user can use ESC key to close + type: TYPE_DEFAULT, //can be "default" or "error" + backdrop: 'static', //user cannot click anywhere on screen to close modal, only buttons + keyboard: true, //user can use ESC key to close modalFade: true, templateUrl: urls.static_url + 'seed/partials/simple_modal.html' }; diff --git a/seed/static/seed/js/services/uploader_service.js b/seed/static/seed/js/services/uploader_service.js index 8f32b3d2c1..b0ac22b30d 100644 --- a/seed/static/seed/js/services/uploader_service.js +++ b/seed/static/seed/js/services/uploader_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // uploader services diff --git a/seed/static/seed/js/services/user_service.js b/seed/static/seed/js/services/user_service.js index 6cf0614dea..7cae2a9e96 100644 --- a/seed/static/seed/js/services/user_service.js +++ b/seed/static/seed/js/services/user_service.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // user services diff --git a/seed/static/seed/js/utilities/spinner.js b/seed/static/seed/js/utilities/spinner.js index 4210448634..990918ca73 100644 --- a/seed/static/seed/js/utilities/spinner.js +++ b/seed/static/seed/js/utilities/spinner.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author - Nicholas Serra */ diff --git a/seed/static/seed/partials/data_upload_modal.html b/seed/static/seed/partials/data_upload_modal.html index 8035736199..2f8c078caf 100644 --- a/seed/static/seed/partials/data_upload_modal.html +++ b/seed/static/seed/partials/data_upload_modal.html @@ -197,8 +197,11 @@
-

An error occurred while processing the file. Please ensure that your file meets the required specifications.

-
{$ step_12_error_message $}
+ +

An error occurred while processing the file. Please ensure that your file meets the required specifications.

+

Error(s) occurred while processing the BuildingSync data bulk upload, potentially resulting in a partial import. Fix the errors and re-upload the corrected files.

+

An error occurred while processing the BuildingSync xml file. Please ensure that your file meets the required specifications.

+
{$ step_12_error_message | json $}
@@ -242,7 +245,14 @@
+ translate-values="{ dataset_name: dataset.name, dataset_filename: dataset.filename }">
+
+
+

Warnings:

+
{$ step_14_message | json $}
+
+
+ diff --git a/seed/static/seed/partials/inventory_detail.html b/seed/static/seed/partials/inventory_detail.html index 37c6d85bbb..b74e603ef7 100644 --- a/seed/static/seed/partials/inventory_detail.html +++ b/seed/static/seed/partials/inventory_detail.html @@ -42,10 +42,40 @@

+
+
+ + +
+
+
+
+
+
- {$:: 'Labels' | translate $}: (no labels applied)
@@ -54,12 +84,6 @@

- - - -
@@ -68,6 +92,18 @@

+
+
+
+ + +
{$ uploader.progress | number:0 $}% {$:: 'Complete' | translate $} {$ uploader.status_message ? ': ' + uploader.status_message : '' $}
+
+
+
+
@@ -247,20 +283,6 @@

{$:: 'Files (Master State Only)' | translate $}

- -
-
-
{$:: 'Upload BuildingSync Data' | translate $}
- -
-
- - -
{$ uploader.progress | number:0 $}% {$:: 'Complete' | translate $} {$ uploader.status_message ? ': ' + uploader.status_message : '' $}
-
-
diff --git a/seed/static/seed/scss/fonts.scss b/seed/static/seed/scss/fonts.scss new file mode 100644 index 0000000000..5351a62378 --- /dev/null +++ b/seed/static/seed/scss/fonts.scss @@ -0,0 +1,128 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'PT Sans'; + font-style: normal; + font-weight: 400; + src: local('PT Sans'), local('PTSans-Regular'), url(../fonts/jizaRExUiTo99u79D0-ExdGM.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'PT Sans'; + font-style: normal; + font-weight: 400; + src: local('PT Sans'), local('PTSans-Regular'), url(../fonts/jizaRExUiTo99u79D0aExdGM.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* latin-ext */ +@font-face { + font-family: 'PT Sans'; + font-style: normal; + font-weight: 400; + src: local('PT Sans'), local('PTSans-Regular'), url(../fonts/jizaRExUiTo99u79D0yExdGM.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'PT Sans'; + font-style: normal; + font-weight: 400; + src: local('PT Sans'), local('PTSans-Regular'), url(../fonts/jizaRExUiTo99u79D0KExQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'PT Sans'; + font-style: normal; + font-weight: 700; + src: local('PT Sans Bold'), local('PTSans-Bold'), url(../fonts/jizfRExUiTo99u79B_mh0OOtLQ0Z.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'PT Sans'; + font-style: normal; + font-weight: 700; + src: local('PT Sans Bold'), local('PTSans-Bold'), url(../fonts/jizfRExUiTo99u79B_mh0OqtLQ0Z.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* latin-ext */ +@font-face { + font-family: 'PT Sans'; + font-style: normal; + font-weight: 700; + src: local('PT Sans Bold'), local('PTSans-Bold'), url(../fonts/jizfRExUiTo99u79B_mh0OCtLQ0Z.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'PT Sans'; + font-style: normal; + font-weight: 700; + src: local('PT Sans Bold'), local('PTSans-Bold'), url(../fonts/jizfRExUiTo99u79B_mh0O6tLQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'PT Sans Narrow'; + font-style: normal; + font-weight: 400; + src: local('PT Sans Narrow'), local('PTSans-Narrow'), url(../fonts/BngRUXNadjH0qYEzV7ab-oWlsbCLwR26eg.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'PT Sans Narrow'; + font-style: normal; + font-weight: 400; + src: local('PT Sans Narrow'), local('PTSans-Narrow'), url(../fonts/BngRUXNadjH0qYEzV7ab-oWlsbCCwR26eg.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* latin-ext */ +@font-face { + font-family: 'PT Sans Narrow'; + font-style: normal; + font-weight: 400; + src: local('PT Sans Narrow'), local('PTSans-Narrow'), url(../fonts/BngRUXNadjH0qYEzV7ab-oWlsbCIwR26eg.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'PT Sans Narrow'; + font-style: normal; + font-weight: 400; + src: local('PT Sans Narrow'), local('PTSans-Narrow'), url(../fonts/BngRUXNadjH0qYEzV7ab-oWlsbCGwR0.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'PT Sans Narrow'; + font-style: normal; + font-weight: 700; + src: local('PT Sans Narrow Bold'), local('PTSans-NarrowBold'), url(../fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiIW_3QRQ.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'PT Sans Narrow'; + font-style: normal; + font-weight: 700; + src: local('PT Sans Narrow Bold'), local('PTSans-NarrowBold'), url(../fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiBW_3QRQ.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* latin-ext */ +@font-face { + font-family: 'PT Sans Narrow'; + font-style: normal; + font-weight: 700; + src: local('PT Sans Narrow Bold'), local('PTSans-NarrowBold'), url(../fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiLW_3QRQ.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'PT Sans Narrow'; + font-style: normal; + font-weight: 700; + src: local('PT Sans Narrow Bold'), local('PTSans-NarrowBold'), url(../fonts/BngSUXNadjH0qYEzV7ab-oWlsbg95AiFW_0.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/seed/static/seed/scss/style.scss b/seed/static/seed/scss/style.scss index 6d7918d6b0..8625df1466 100755 --- a/seed/static/seed/scss/style.scss +++ b/seed/static/seed/scss/style.scss @@ -1,3 +1,5 @@ +@import "fonts.scss"; + @-webkit-keyframes fadein { from { opacity: 0; @@ -860,7 +862,7 @@ a:not([href]) { } } .jumbotron { - background: url('../images/kc_2.jpg') no-repeat; + background: url('../../seed/images/kc_2.jpg') no-repeat; height: 402px; margin-bottom: 0; padding: 30px 10%; @@ -948,7 +950,7 @@ a:not([href]) { height: 400px; overflow-y: scroll; border-bottom: 1px solid $gray_lighter; - background: url('../images/bg_first_td.png') repeat-x top center; + background: url('../../seed/images/bg_first_td.png') repeat-x top center; } .table_list_container { &.has_borders { @@ -1359,10 +1361,10 @@ a:not([href]) { } //.table-striped tbody tr:nth-child(1) td { - // background: url('../images/bg_first_td.png') repeat-x; + // background: url('../../seed/images/bg_first_td.png') repeat-x; // // &.sorted { - // background: url('../images/bg_first_td.png') repeat-x; + // background: url('../../seed/images/bg_first_td.png') repeat-x; // } //} .table-striped tbody tr td h3 { @@ -2677,7 +2679,11 @@ gs-input .tags .tag-item .remove-button { } } -#inventory-actions-dropdown, #inventory-detail-edit { +#inventory-actions-dropdown, #inventory-detail-actions-dropdown, #inventory-detail-edit { + &#inventory-detail-actions-dropdown { + width: 200px; + } + li { cursor: default; } @@ -3189,6 +3195,19 @@ $pairedCellWidth: 60px; .pink-bg { background-color: rgba(255, 0, 0, 0.07); + + &:hover { + background-color: rgba(255, 0, 0, 0.12) !important; + } +} + +.yellow-bg { + background-color: #f0ad4e; + color: #fff !important; + + &:hover { + background-color: #ec971f !important; + } } :not(.active) .typeahead-native { @@ -3204,3 +3223,21 @@ $pairedCellWidth: 60px; color: #444; padding-left: 6px; } + +.text-wrap { + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +} + +.upload-list-item { + > div { + padding: 3px 20px; + } + + &:hover { + background-color: #f5f5f5; + } +} diff --git a/seed/static/seed/tests/admin_controller.spec.js b/seed/static/seed/tests/admin_controller.spec.js index 32c658b5b3..6d60e81e93 100644 --- a/seed/static/seed/tests/admin_controller.spec.js +++ b/seed/static/seed/tests/admin_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: admin_controller', function () { diff --git a/seed/static/seed/tests/create_sub_organization_modal_controller.spec.js b/seed/static/seed/tests/create_sub_organization_modal_controller.spec.js index f706eb0547..6b1c1ea10b 100644 --- a/seed/static/seed/tests/create_sub_organization_modal_controller.spec.js +++ b/seed/static/seed/tests/create_sub_organization_modal_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: create_sub_organization_modal_controller', function () { diff --git a/seed/static/seed/tests/data_quality_admin_controller.spec.js b/seed/static/seed/tests/data_quality_admin_controller.spec.js index fdf0e14e2c..92eb56ec0a 100644 --- a/seed/static/seed/tests/data_quality_admin_controller.spec.js +++ b/seed/static/seed/tests/data_quality_admin_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: data_quality_admin_controller', function () { diff --git a/seed/static/seed/tests/data_quality_modal_controller.spec.js b/seed/static/seed/tests/data_quality_modal_controller.spec.js index 44d8aea57a..f0fe7e4a0c 100644 --- a/seed/static/seed/tests/data_quality_modal_controller.spec.js +++ b/seed/static/seed/tests/data_quality_modal_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: data_quality_modal_controller', function () { diff --git a/seed/static/seed/tests/data_upload_modal_controller.spec.js b/seed/static/seed/tests/data_upload_modal_controller.spec.js index 641e80adf8..a3e9691b4b 100644 --- a/seed/static/seed/tests/data_upload_modal_controller.spec.js +++ b/seed/static/seed/tests/data_upload_modal_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: data_upload_modal_controller', function () { diff --git a/seed/static/seed/tests/dataset_detail_controller.spec.js b/seed/static/seed/tests/dataset_detail_controller.spec.js index 8ea9d56011..4e5e7db2a0 100644 --- a/seed/static/seed/tests/dataset_detail_controller.spec.js +++ b/seed/static/seed/tests/dataset_detail_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: dataset_detail_controller', function () { diff --git a/seed/static/seed/tests/dataset_list_controller.spec.js b/seed/static/seed/tests/dataset_list_controller.spec.js index b4b5eb081e..bcba02d022 100644 --- a/seed/static/seed/tests/dataset_list_controller.spec.js +++ b/seed/static/seed/tests/dataset_list_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: dataset_list_controller', function () { diff --git a/seed/static/seed/tests/district.spec.js b/seed/static/seed/tests/district.spec.js index bc43b47b4e..15fe0079db 100644 --- a/seed/static/seed/tests/district.spec.js +++ b/seed/static/seed/tests/district.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // create dummy angularJS app to attach filter(s) diff --git a/seed/static/seed/tests/fromNow.spec.js b/seed/static/seed/tests/fromNow.spec.js index 5388744554..d4e32b3540 100644 --- a/seed/static/seed/tests/fromNow.spec.js +++ b/seed/static/seed/tests/fromNow.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/tests/ignoremap.spec.js b/seed/static/seed/tests/ignoremap.spec.js index 2878004d1c..6d973441ff 100644 --- a/seed/static/seed/tests/ignoremap.spec.js +++ b/seed/static/seed/tests/ignoremap.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // create dummy angularJS app to attach filter(s) diff --git a/seed/static/seed/tests/inventory_detail_controller.spec.js b/seed/static/seed/tests/inventory_detail_controller.spec.js index 4f900685e1..602ed8ce2d 100644 --- a/seed/static/seed/tests/inventory_detail_controller.spec.js +++ b/seed/static/seed/tests/inventory_detail_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ diff --git a/seed/static/seed/tests/mapping_controller.spec.js b/seed/static/seed/tests/mapping_controller.spec.js index e04b0ec69e..b2c497d432 100644 --- a/seed/static/seed/tests/mapping_controller.spec.js +++ b/seed/static/seed/tests/mapping_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: mapping_controller', function () { diff --git a/seed/static/seed/tests/members_controller.spec.js b/seed/static/seed/tests/members_controller.spec.js index 88ba0c7ff0..2206b6e5b4 100644 --- a/seed/static/seed/tests/members_controller.spec.js +++ b/seed/static/seed/tests/members_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: members_controller', function () { diff --git a/seed/static/seed/tests/menu_controller.spec.js b/seed/static/seed/tests/menu_controller.spec.js index 526b348975..141cb97a5a 100644 --- a/seed/static/seed/tests/menu_controller.spec.js +++ b/seed/static/seed/tests/menu_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('Controller: menu_controller', function () { diff --git a/seed/static/seed/tests/new_member_modal_controller.spec.js b/seed/static/seed/tests/new_member_modal_controller.spec.js index 03ad352b68..7508e297c1 100644 --- a/seed/static/seed/tests/new_member_modal_controller.spec.js +++ b/seed/static/seed/tests/new_member_modal_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: new_member_modal_controller', function () { diff --git a/seed/static/seed/tests/property_detail_controller.spec.js b/seed/static/seed/tests/property_detail_controller.spec.js index dda69d3a50..6cb374f905 100644 --- a/seed/static/seed/tests/property_detail_controller.spec.js +++ b/seed/static/seed/tests/property_detail_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: inventory_detail_controller', function () { diff --git a/seed/static/seed/tests/protractor-tests/adminCreateOrgs.spec.js b/seed/static/seed/tests/protractor-tests/adminCreateOrgs.spec.js index f62eff5e85..599fb384d7 100644 --- a/seed/static/seed/tests/protractor-tests/adminCreateOrgs.spec.js +++ b/seed/static/seed/tests/protractor-tests/adminCreateOrgs.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // create test orgs diff --git a/seed/static/seed/tests/protractor-tests/adminLogin.spec.js b/seed/static/seed/tests/protractor-tests/adminLogin.spec.js index 88eff1e4ee..f54112645e 100644 --- a/seed/static/seed/tests/protractor-tests/adminLogin.spec.js +++ b/seed/static/seed/tests/protractor-tests/adminLogin.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ //Login diff --git a/seed/static/seed/tests/protractor-tests/adminLogout.spec.js b/seed/static/seed/tests/protractor-tests/adminLogout.spec.js index 83bac40ad1..9789631b07 100644 --- a/seed/static/seed/tests/protractor-tests/adminLogout.spec.js +++ b/seed/static/seed/tests/protractor-tests/adminLogout.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ //admin delete test orgs diff --git a/seed/static/seed/tests/protractor-tests/datasetMapping.spec.js b/seed/static/seed/tests/protractor-tests/datasetMapping.spec.js index 8581a306d0..0e73d855c6 100644 --- a/seed/static/seed/tests/protractor-tests/datasetMapping.spec.js +++ b/seed/static/seed/tests/protractor-tests/datasetMapping.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // check inventory pages after import and delete test dataset diff --git a/seed/static/seed/tests/protractor-tests/datasetPages.spec.js b/seed/static/seed/tests/protractor-tests/datasetPages.spec.js index da5940c16a..5794b8cbdf 100644 --- a/seed/static/seed/tests/protractor-tests/datasetPages.spec.js +++ b/seed/static/seed/tests/protractor-tests/datasetPages.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // create and test new dataset with import diff --git a/seed/static/seed/tests/protractor-tests/datasetPairing.spec.js b/seed/static/seed/tests/protractor-tests/datasetPairing.spec.js index 86ed0765d0..174c233e4f 100644 --- a/seed/static/seed/tests/protractor-tests/datasetPairing.spec.js +++ b/seed/static/seed/tests/protractor-tests/datasetPairing.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // test Data Quality, Sharing, Reports, delete function and other misc items after data is loaded diff --git a/seed/static/seed/tests/protractor-tests/jasmineTests.spec.js b/seed/static/seed/tests/protractor-tests/jasmineTests.spec.js index 72868eae8b..6a243fc19c 100644 --- a/seed/static/seed/tests/protractor-tests/jasmineTests.spec.js +++ b/seed/static/seed/tests/protractor-tests/jasmineTests.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // run jasmine tests diff --git a/seed/static/seed/tests/protractor-tests/miscellaneous.spec.js b/seed/static/seed/tests/protractor-tests/miscellaneous.spec.js index ecb89b7650..b7ce25df28 100644 --- a/seed/static/seed/tests/protractor-tests/miscellaneous.spec.js +++ b/seed/static/seed/tests/protractor-tests/miscellaneous.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // test Data Quality, labels, delete function and other misc items after data is loaded diff --git a/seed/static/seed/tests/protractor-tests/orgPages.spec.js b/seed/static/seed/tests/protractor-tests/orgPages.spec.js index 6161af8f7e..595267c324 100644 --- a/seed/static/seed/tests/protractor-tests/orgPages.spec.js +++ b/seed/static/seed/tests/protractor-tests/orgPages.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // test new orgs and sub orgs diff --git a/seed/static/seed/tests/protractor-tests/propPages.spec.js b/seed/static/seed/tests/protractor-tests/propPages.spec.js index 927a09d2c5..36eaba201f 100644 --- a/seed/static/seed/tests/protractor-tests/propPages.spec.js +++ b/seed/static/seed/tests/protractor-tests/propPages.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // check inventory pages after import and delete test dataset diff --git a/seed/static/seed/tests/protractor-tests/protractorConfig.js b/seed/static/seed/tests/protractor-tests/protractorConfig.js index 77d6d52b4c..ed7ba46872 100644 --- a/seed/static/seed/tests/protractor-tests/protractorConfig.js +++ b/seed/static/seed/tests/protractor-tests/protractorConfig.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // config for protractor tests diff --git a/seed/static/seed/tests/protractor-tests/protractorConfigCoverage.js b/seed/static/seed/tests/protractor-tests/protractorConfigCoverage.js index 470cb90f00..3148396810 100644 --- a/seed/static/seed/tests/protractor-tests/protractorConfigCoverage.js +++ b/seed/static/seed/tests/protractor-tests/protractorConfigCoverage.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // config for protractor tests diff --git a/seed/static/seed/tests/protractor-tests/taxlotPages.spec.js b/seed/static/seed/tests/protractor-tests/taxlotPages.spec.js index 48f08780a1..73a50a95d4 100644 --- a/seed/static/seed/tests/protractor-tests/taxlotPages.spec.js +++ b/seed/static/seed/tests/protractor-tests/taxlotPages.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // check inventory pages after import and delete test dataset diff --git a/seed/static/seed/tests/run_jasmine.js b/seed/static/seed/tests/run_jasmine.js index fa04dc7363..fca78217d8 100644 --- a/seed/static/seed/tests/run_jasmine.js +++ b/seed/static/seed/tests/run_jasmine.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ /** diff --git a/seed/static/seed/tests/sdLabel.spec.js b/seed/static/seed/tests/sdLabel.spec.js index 3b5123bdb4..a5c406313b 100644 --- a/seed/static/seed/tests/sdLabel.spec.js +++ b/seed/static/seed/tests/sdLabel.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // taken from the angularjs testing page diff --git a/seed/static/seed/tests/sdUploader.spec.js b/seed/static/seed/tests/sdUploader.spec.js index 9a997e3e6d..acd2fd2399 100644 --- a/seed/static/seed/tests/sdUploader.spec.js +++ b/seed/static/seed/tests/sdUploader.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // taken from the angularjs testing page diff --git a/seed/static/seed/tests/search_service.spec.js b/seed/static/seed/tests/search_service.spec.js index 862e72c109..5a4c13304c 100644 --- a/seed/static/seed/tests/search_service.spec.js +++ b/seed/static/seed/tests/search_service.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // create dummy angularJS app to attach filter(s) diff --git a/seed/static/seed/tests/settings_controller.spec.js b/seed/static/seed/tests/settings_controller.spec.js index 4832a04c13..7c80078fcd 100644 --- a/seed/static/seed/tests/settings_controller.spec.js +++ b/seed/static/seed/tests/settings_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: organization_settings_controller', function () { diff --git a/seed/static/seed/tests/stripImportPrefix.spec.js b/seed/static/seed/tests/stripImportPrefix.spec.js index 3318829bbb..096d1de0a6 100644 --- a/seed/static/seed/tests/stripImportPrefix.spec.js +++ b/seed/static/seed/tests/stripImportPrefix.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // create dummy angularJS app to attach filter(s) diff --git a/seed/static/seed/tests/taxlot_detail_controller.spec.js b/seed/static/seed/tests/taxlot_detail_controller.spec.js index 05d6d0115c..6f8481f705 100644 --- a/seed/static/seed/tests/taxlot_detail_controller.spec.js +++ b/seed/static/seed/tests/taxlot_detail_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: inventory_detail_controller', function () { diff --git a/seed/static/seed/tests/titleCase.spec.js b/seed/static/seed/tests/titleCase.spec.js index dcd7df63f9..2325a8b180 100644 --- a/seed/static/seed/tests/titleCase.spec.js +++ b/seed/static/seed/tests/titleCase.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ // create dummy angularJS app to attach filter(s) diff --git a/seed/static/seed/tests/typedNumber.spec.js b/seed/static/seed/tests/typedNumber.spec.js index bb20fcc375..e69de29bb2 100644 --- a/seed/static/seed/tests/typedNumber.spec.js +++ b/seed/static/seed/tests/typedNumber.spec.js @@ -1,41 +0,0 @@ -/** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. - * :author - */ -// create dummy angularJS app to attach filter(s) -var myTypedNumberFilterApp = angular.module('myTypedNumberFilterApp', ['typedNumber']); - -describe('The typedNumber filter', function () { - var typedNumberFilter; - - beforeEach(function () { - module('myTypedNumberFilterApp'); - inject(function (_typedNumberFilter_) { - typedNumberFilter = _typedNumberFilter_; - }); - }); - - it('should parse strings as strings and return them', function () { - expect(typedNumberFilter('tester')).toBe('tester'); - }); - - it('should parse strings as strings and return them, even if they look like numbers', function () { - expect(typedNumberFilter('123.1456')).toBe('123.1456'); - }); - - it('should parse numbers as numbers and return them', function () { - expect(typedNumberFilter('123.00001', 'number')).toBe('123'); - }); - - it('should allow the user to set the number of sig digits', function () { - expect(typedNumberFilter('123.321', 'number', 'not_year', 1)).toBe('123.3'); - }); - - it('should add commas to number greater than 999', function () { - expect(typedNumberFilter('123456789', 'number', 'not_year', 0)).toBe('123,456,789'); - }); - - it('should parse year_built and not add commas', function () { - expect(typedNumberFilter('1946', 'number', 'year_built', 1)).toBe('1946'); - }); -}); diff --git a/seed/static/seed/tests/update_item_labels_controller.spec.js b/seed/static/seed/tests/update_item_labels_controller.spec.js index e9b9e250f6..7d4910858b 100644 --- a/seed/static/seed/tests/update_item_labels_controller.spec.js +++ b/seed/static/seed/tests/update_item_labels_controller.spec.js @@ -1,5 +1,5 @@ /** - * :copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. + * :copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. * :author */ describe('controller: update_item_labels_modal_controller', function () { diff --git a/seed/tasks.py b/seed/tasks.py index 2bdca3f473..1304f34a90 100644 --- a/seed/tasks.py +++ b/seed/tasks.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from __future__ import absolute_import @@ -60,12 +60,46 @@ def invite_to_seed(domain, email_address, token, user_pk, first_name): 'seed/account_create_email.html', context ) - reset_email = settings.SERVER_EMAIL - send_mail(subject, email_body, reset_email, [email_address]) + send_mail(subject, email_body, settings.SERVER_EMAIL, [email_address]) try: bcc_address = settings.SEED_ACCOUNT_CREATION_BCC new_subject = "{} ({})".format(subject, email_address) - send_mail(new_subject, email_body, reset_email, [bcc_address]) + send_mail(new_subject, email_body, settings.SERVER_EMAIL, [bcc_address]) + except AttributeError: + pass + + +@shared_task +def invite_to_organization(domain, new_user, requested_by, new_org): + """Send invitation to a newly created organization. + + domain -- The domain name of the running seed instance + email_address -- The address to send the invitation to + token -- generated by Django's default_token_generator + user_pk --primary key for this user record + first_name -- First name of the new user + + Returns: nothing + """ + context = { + 'new_user': new_user, + 'first_name': new_user.first_name, + 'domain': domain, + 'protocol': 'https', + 'new_org': new_org, + 'requested_by': requested_by, + } + + subject = 'Your SEED account has been added to an organization' + email_body = loader.render_to_string( + 'seed/account_org_added.html', + context + ) + send_mail(subject, email_body, settings.SERVER_EMAIL, [new_user.email]) + try: + bcc_address = settings.SEED_ACCOUNT_CREATION_BCC + new_subject = "{} ({})".format(subject, new_user.email) + send_mail(new_subject, email_body, settings.SERVER_EMAIL, [bcc_address]) except AttributeError: pass diff --git a/seed/templates/seed/_header.html b/seed/templates/seed/_header.html index 9008359c82..d8da84229c 100644 --- a/seed/templates/seed/_header.html +++ b/seed/templates/seed/_header.html @@ -33,8 +33,8 @@
  • Loading...
  • -
  • - {$ org.name $} +
  • + {$ org.name $}
  • diff --git a/seed/templates/seed/account_org_added.html b/seed/templates/seed/account_org_added.html new file mode 100644 index 0000000000..776c1a2e6f --- /dev/null +++ b/seed/templates/seed/account_org_added.html @@ -0,0 +1,11 @@ +{% load i18n %}{% autoescape off %} +{% blocktrans %}Hello {{ first_name }}, {% endblocktrans %} + +{% blocktrans %}You are receiving this e-mail because you have been added to the '{{ new_org }}' organization by '{{ requested_by }}'. Please disregard this message if you are not expecting access to SEED.{% endblocktrans %} + +{% blocktrans %}You can view your new organization by logging into the SEED instance here:{% endblocktrans %} +{{ protocol }}://{{ domain }} + +{% blocktrans %}The SEED Team{% endblocktrans %} + +{% endautoescape %} diff --git a/seed/templates/seed/base.html b/seed/templates/seed/base.html index 3b4320f1e9..ede77ea5bf 100644 --- a/seed/templates/seed/base.html +++ b/seed/templates/seed/base.html @@ -2,7 +2,7 @@ {% load i18n %} - + {% block title %}{% trans "SEED Platform™" %}{% endblock title %} @@ -31,23 +31,26 @@ - {% compress css %} - - - - - - - - - - + + + + + + + + + {% endcompress %} {% block css %}{{block.super}} {% compress css %} - + + {% endcompress %} {% endblock %} @@ -65,9 +68,9 @@ window.BE.initial_org_id = "{{ initial_org_id }}"; window.BE.initial_org_user_role = "{{ initial_org_user_role }}"; window.BE.initial_org_name = "{{ initial_org_name }}"; - window.BE.FILE_UPLOAD_DESTINATION = "{{FILE_UPLOAD_DESTINATION}}"; - window.BE.AWS_UPLOAD_BUCKET_NAME = "{{AWS_UPLOAD_BUCKET_NAME}}"; - window.BE.AWS_CLIENT_ACCESS_KEY = "{{AWS_CLIENT_ACCESS_KEY}}"; + window.BE.FILE_UPLOAD_DESTINATION = "{{ FILE_UPLOAD_DESTINATION }}"; + window.BE.AWS_UPLOAD_BUCKET_NAME = "{{ AWS_UPLOAD_BUCKET_NAME }}"; + window.BE.AWS_CLIENT_ACCESS_KEY = "{{ AWS_CLIENT_ACCESS_KEY }}"; {# js CSRF config #} window.BE.csrf_token = "{{ csrf_token }}"; @@ -80,60 +83,59 @@ {% include "seed/_js_urls.html" %} {% compress js %} - - - + + + - - - + + + {% if not debug %} - + {% else %} - + {% endif %} - - - - - + + + + + {% if not debug and SENTRY_JS_DSN %} - - + + {% endif %} - - - - - - - - + + + + + + + - - + + - - - - + + + + - - - - - + + + + + - + {% endcompress %} diff --git a/seed/templates/seed/index.html b/seed/templates/seed/index.html index 79f0dff769..d82d592810 100644 --- a/seed/templates/seed/index.html +++ b/seed/templates/seed/index.html @@ -4,7 +4,7 @@ {% endblock %} {% block content %} -
    +
    {% include "seed/_sidebar.html" %} diff --git a/seed/templates/seed/jasmine_tests/AngularJSTests.html b/seed/templates/seed/jasmine_tests/AngularJSTests.html index a59237259c..f440c69762 100644 --- a/seed/templates/seed/jasmine_tests/AngularJSTests.html +++ b/seed/templates/seed/jasmine_tests/AngularJSTests.html @@ -4,46 +4,45 @@ SEED JS Spec Runner - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% include "seed/_js_urls.html" %} diff --git a/seed/templatetags/__init__.py b/seed/templatetags/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/templatetags/__init__.py +++ b/seed/templatetags/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/templatetags/breadcrumbs.py b/seed/templatetags/breadcrumbs.py index 0c345f263e..ea1aacd464 100644 --- a/seed/templatetags/breadcrumbs.py +++ b/seed/templatetags/breadcrumbs.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ """ diff --git a/seed/test_helpers/__init__.py b/seed/test_helpers/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/test_helpers/__init__.py +++ b/seed/test_helpers/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/test_helpers/factory/__init__.py b/seed/test_helpers/factory/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/test_helpers/factory/__init__.py +++ b/seed/test_helpers/factory/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/test_helpers/factory/helpers.py b/seed/test_helpers/factory/helpers.py index bf9c1af29d..91d334bcb4 100644 --- a/seed/test_helpers/factory/helpers.py +++ b/seed/test_helpers/factory/helpers.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import base64 diff --git a/seed/test_helpers/fake.py b/seed/test_helpers/fake.py index 7a8309b895..a6eb55cf9e 100644 --- a/seed/test_helpers/fake.py +++ b/seed/test_helpers/fake.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/tests/__init__.py b/seed/tests/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/tests/__init__.py +++ b/seed/tests/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/tests/api/seed_readingtools.py b/seed/tests/api/seed_readingtools.py index 845a72013e..c79b921978 100644 --- a/seed/tests/api/seed_readingtools.py +++ b/seed/tests/api/seed_readingtools.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import csv @@ -190,6 +190,12 @@ def check_status(result_out, part_msg, log, piid_flag=None): log.info(part_msg + passed) log.debug(msg) + + elif result_out.status_code in [204]: + msg = result_out.content + log.info(part_msg + passed) + log.debug(msg) + else: msg = result_out.reason log.error(part_msg + failed) diff --git a/seed/tests/api/test_modules.py b/seed/tests/api/test_modules.py index 01a9298749..4de6dde3b7 100644 --- a/seed/tests/api/test_modules.py +++ b/seed/tests/api/test_modules.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import datetime as dt @@ -274,6 +274,46 @@ def account(header, main_url, username, log): headers=header) check_status(result, partmsg, log) + # Create an organization + print('API Function: create_org\n'), + partmsg = 'create_org' + payload = { + 'user_id': user_pk, + 'organization_name': 'TestOrg_JoZ2wSd2boQWifGau3qxdFFu76oIy9r0' # hopefully ensuring a unique org name + } + result = requests.post(main_url + '/api/v2/organizations/', + headers=header, + json=payload) + check_status(result, partmsg, log) + org_id = result.json()['organization']['org_id'] + + # Delete an organization + print('API Function: delete_org\n'), + partmsg = 'delete_org' + result = requests.delete(main_url + '/api/v2/organizations/%s/' % org_id, + headers=header) + check_status(result, partmsg, log) + + # Create a suborganization + print('API Function: create_sub_org\n'), + partmsg = 'create_sub_org' + payload = { + 'sub_org_name': 'TestSuborg', + 'sub_org_owner_email': username + } + result = requests.post(main_url + '/api/v2/organizations/%s/sub_org/' % organization_id, + headers=header, + data=payload) + check_status(result, partmsg, log) + suborg_id = result.json()['organization_id'] + + # Delete a suborganization + print('API Function: delete_sub_org\n'), + partmsg = 'delete_sub_org' + result = requests.delete(main_url + '/api/v2/organizations/%s/' % suborg_id, + headers=header) + check_status(result, partmsg, log) + return organization_id @@ -358,3 +398,151 @@ def cycles(header, main_url, organization_id, log): # TODO: Test deleting a cycle return cycle_id + + +def labels(header, main_url, organization_id, cycle_id, log): + + # Create label + print('API Function: create_label\n') + partmsg = 'create_label' + params = { + 'organization_id': organization_id + } + payload = { + 'name': 'TestLabel', + 'color': 'red' + } + result = requests.post(main_url + '/api/v2/labels/', + headers=header, + params=params, + json=payload) + check_status(result, partmsg, log) + label_id = result.json()['id'] + + # Get IDs for all properties + params = { + 'organization_id': organization_id, + 'cycle': cycle_id, + 'page': 1, + 'per_page': 999999999 + } + result = requests.post(main_url + '/api/v2/properties/filter/', + headers=header, + params=params) + inventory_ids = [prop['id'] for prop in result.json()['results']] + + # Apply label to properties + print('API Function: apply_label\n') + partmsg = 'apply_label' + params = { + 'organization_id': organization_id + } + payload = { + 'add_label_ids': [label_id], + 'inventory_ids': inventory_ids + } + result = requests.put(main_url + '/api/v2/labels-property/', + headers=header, + params=params, + json=payload) + check_status(result, partmsg, log) + + # Delete label + print('API Function: delete_label\n') + partmsg = 'delete_label' + params = { + 'organization_id': organization_id + } + result = requests.delete(main_url + '/api/v2/labels/%s/' % label_id, + headers=header, + params=params) + check_status(result, partmsg, log) + + +def data_quality(header, main_url, organization_id, log): + + # get the data quality rules for the organization + print('API Function: get_data_quality_rules\n') + partmsg = 'get_data_quality_rules' + params = { + 'organization_id': organization_id + } + result = requests.get(main_url + '/api/v2/data_quality_checks/data_quality_rules', + headers=header, + params=params) + check_status(result, partmsg, log) + rules = result.json()['rules'] + prop_rules = rules['properties'] + tax_rules = rules['taxlots'] + + # create a new rule + print('API Function: create_data_quality_rule\n') + partmsg = 'create_data_quality_rule' + params = { + 'organization_id': organization_id + } + new_rule = {'field': 'city', + 'enabled': True, + 'data_type': 'string', + 'rule_type': 1, + 'required': False, + 'not_null': True, + 'min': None, + 'max': None, + 'text_match': None, + 'severity': 'warning', + 'units': '', + 'label': None} + payload = {'data_quality_rules': {'properties': prop_rules + [new_rule], 'taxlots': tax_rules}} + result = requests.post(main_url + '/api/v2/data_quality_checks/save_data_quality_rules/', + headers=header, + params=params, + json=payload) + check_status(result, partmsg, log) + + # delete the new rule + print('API Function: delete_data_quality_rule\n') + partmsg = 'delete_data_quality_rule' + params = { + 'organization_id': organization_id + } + payload = {'data_quality_rules': {'properties': prop_rules, 'taxlots': tax_rules}} + result = requests.post(main_url + '/api/v2/data_quality_checks/save_data_quality_rules/', + headers=header, + params=params, + json=payload) + check_status(result, partmsg, log) + + # get some property state ids + result = requests.get(main_url + '/api/v2/property_states/', + headers=header) + prop_state_ids = [prop['id'] for prop in result.json()['properties']] + + # create a new data quality check process + print('API Function: create_data_quality_check\n') + partmsg = 'create_data_quality_check' + params = { + 'organization_id': organization_id + } + payload = { + 'property_state_ids': prop_state_ids, + 'taxlot_state_ids': [] + } + result = requests.post(main_url + '/api/v2/data_quality_checks/', + headers=header, + params=params, + json=payload) + check_status(result, partmsg, log) + data_quality_id = result.json()['progress']['unique_id'] + + # perform the data quality check + print('API Function: perform_data_quality_check\n') + partmsg = 'perform_data_quality_check' + params = { + 'organization_id': organization_id, + 'data_quality_id': data_quality_id + } + result = requests.get(main_url + '/api/v2/data_quality_checks/results/', + headers=header, + params=params) + check_status(result, partmsg, log) diff --git a/seed/tests/api/test_seed_host_api.py b/seed/tests/api/test_seed_host_api.py index 7c5c3ad079..c103df1cd7 100644 --- a/seed/tests/api/test_seed_host_api.py +++ b/seed/tests/api/test_seed_host_api.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author Claudine Custodio / Baptiste Ravache """ """ @@ -47,7 +47,7 @@ import requests from seed_readingtools import check_status, setup_logger -from test_modules import cycles, upload_match_sort, account, delete_set +from test_modules import cycles, upload_match_sort, account, delete_set, labels, data_quality location = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) print("Running from {}".format(location)) @@ -135,11 +135,13 @@ cycle_id = cycles(header, main_url, organization_id, log) # Create a dataset -print('\n\n|-------Create Dateset-------|') +print('\n\n|-------Create Dataset-------|') partmsg = 'create_dataset' +params = {'organization_id': organization_id} payload = {'name': 'API Test'} -result = requests.post(main_url + '/api/v2/datasets/?organization_id=%s' % organization_id, +result = requests.post(main_url + '/api/v2/datasets/', headers=header, + params=params, data=payload) check_status(result, partmsg, log) @@ -153,11 +155,20 @@ raw_map_file, log) # Upload and test the portfolio manager file -print('\n|---Portfolio Manager File---|\n') +# print ('\n|---Portfolio Manager File---|\n') # upload_match_sort(header, main_url, organization_id, dataset_id, cycle_id, pm_building_file, 'Portfolio Raw', # pm_map_file, log) -# Delete dataset and building +# Data quality +print('\n|---Data Quality---|\n') +data_quality(header, main_url, organization_id, log) + +# -- Labels +print('\n\n|-------Labels-------|') +labels(header, main_url, organization_id, cycle_id, log) + +# Delete dataset +print('\n|---Delete Dataset---|\n') delete_set(header, main_url, organization_id, dataset_id, log) time2 = dt.datetime.now() diff --git a/seed/tests/test_account_views.py b/seed/tests/test_account_views.py index 48f21e1061..8a4f4d088d 100644 --- a/seed/tests/test_account_views.py +++ b/seed/tests/test_account_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/tests/test_address_normalization.py b/seed/tests/test_address_normalization.py index 638d81a915..c1dc1859b7 100644 --- a/seed/tests/test_address_normalization.py +++ b/seed/tests/test_address_normalization.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from django.test import TestCase diff --git a/seed/tests/test_admin_views.py b/seed/tests/test_admin_views.py index 7ff320ee72..368c6ff087 100644 --- a/seed/tests/test_admin_views.py +++ b/seed/tests/test_admin_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/tests/test_api.py b/seed/tests/test_api.py index 89aed6d135..b010d96a36 100644 --- a/seed/tests/test_api.py +++ b/seed/tests/test_api.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import base64 diff --git a/seed/tests/test_api_mixins.py b/seed/tests/test_api_mixins.py index 789771c820..bcc2d22815 100644 --- a/seed/tests/test_api_mixins.py +++ b/seed/tests/test_api_mixins.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/tests/test_building_file.py b/seed/tests/test_building_file.py index 07f3a00d1f..2bb87452ae 100644 --- a/seed/tests/test_building_file.py +++ b/seed/tests/test_building_file.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ @@ -69,6 +69,23 @@ def test_buildingsync_constructor_diff_ns(self): self.assertEqual(property_state.address_line_1, '1215 - 18th St') self.assertEqual(messages, {'errors': [], 'warnings': []}) + def test_buildingsync_constructor_single_scenario(self): + # test having only 1 measure and 1 scenario + filename = path.join(BASE_DIR, 'seed', 'building_sync', 'tests', 'data', 'test_single_scenario.xml') + file = open(filename, 'rb') + simple_uploaded_file = SimpleUploadedFile(file.name, file.read()) + + bf = BuildingFile.objects.create( + file=simple_uploaded_file, + filename=filename, + file_type=BuildingFile.BUILDINGSYNC, + ) + + status, property_state, property_view, messages = bf.process(self.org.id, self.org.cycles.first()) + self.assertTrue(status) + self.assertEqual(property_state.address_line_1, '123 Main St') + self.assertEqual(messages, {'errors': [], 'warnings': []}) + def test_hpxml_constructor(self): filename = path.join(BASE_DIR, 'seed', 'hpxml', 'tests', 'data', 'audit.xml') file = open(filename, 'rb') diff --git a/seed/tests/test_building_file_views.py b/seed/tests/test_building_file_views.py index c84eaa5adc..4ac13cc0e8 100644 --- a/seed/tests/test_building_file_views.py +++ b/seed/tests/test_building_file_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json @@ -84,7 +84,7 @@ def test_upload_and_get_building_sync(self): self.assertEqual(response.status_code, 200) result = json.loads(response.content) self.assertEqual(result['status'], 'success') - self.assertEqual(result['message'], 'successfully imported file') + self.assertEqual(result['message'], {'warnings': []}) self.assertEqual(result['data']['property_view']['state']['year_built'], 1967) self.assertEqual(result['data']['property_view']['state']['postal_code'], '94111') @@ -95,6 +95,28 @@ def test_upload_and_get_building_sync(self): self.assertIn('1967', response.content.decode("utf-8")) + def test_upload_batch_building_sync(self): + # import a zip file of BuildingSync xmls + # import_record = + filename = path.join(BASE_DIR, 'seed', 'building_sync', 'tests', 'data', 'valid_xml_ex1_ex2.zip') + + url = '/api/v2/building_file/' + fsysparams = { + 'file': open(filename, 'rb'), + 'file_type': 'BuildingSync', + 'organization_id': self.org.id, + 'cycle_id': self.cycle.id + } + + response = self.client.post(url, fsysparams) + self.assertEqual(response.status_code, 200) + result = json.loads(response.content) + + self.assertEqual(result['status'], 'success') + self.assertEqual(result['message'], {'warnings': []}) + self.assertEqual(result['data']['property_view']['state']['year_built'], 1967) + self.assertEqual(result['data']['property_view']['state']['postal_code'], '94111') + def test_upload_with_measure_duplicates(self): # import_record = filename = path.join(BASE_DIR, 'seed', 'building_sync', 'tests', 'data', 'buildingsync_ex01_measures.xml') @@ -110,7 +132,7 @@ def test_upload_with_measure_duplicates(self): self.assertEqual(response.status_code, 200) result = json.loads(response.content) self.assertEqual(result['status'], 'success') - expected_message = "successfully imported file with warnings ['Measure category and name is not valid other_electric_motors_and_drives:replace_with_higher_efficiency', 'Measure category and name is not valid other_hvac:install_demand_control_ventilation', 'Measure associated with scenario not found. Scenario: Replace with higher efficiency Only, Measure name: Measure22', 'Measure associated with scenario not found. Scenario: Install demand control ventilation Only, Measure name: Measure24']" + expected_message = {'warnings': ['Measure category and name is not valid other_electric_motors_and_drives:replace_with_higher_efficiency', 'Measure category and name is not valid other_hvac:install_demand_control_ventilation', 'Measure associated with scenario not found. Scenario: Replace with higher efficiency Only, Measure name: Measure22', 'Measure associated with scenario not found. Scenario: Install demand control ventilation Only, Measure name: Measure24']} self.assertEqual(result['message'], expected_message) self.assertEqual(len(result['data']['property_view']['state']['measures']), 28) self.assertEqual(len(result['data']['property_view']['state']['scenarios']), 31) @@ -150,7 +172,7 @@ def test_upload_and_get_building_sync_diff_ns(self): self.assertEqual(response.status_code, 200) result = json.loads(response.content) self.assertEqual(result['status'], 'success') - self.assertEqual(result['message'], 'successfully imported file') + self.assertEqual(result['message'], {'warnings': []}) self.assertEqual(result['data']['property_view']['state']['year_built'], 1889) # now get the building sync that was just uploaded diff --git a/seed/tests/test_certification_models.py b/seed/tests/test_certification_models.py index 20ba4f75b4..910db3aa26 100644 --- a/seed/tests/test_certification_models.py +++ b/seed/tests/test_certification_models.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/tests/test_certification_serializers.py b/seed/tests/test_certification_serializers.py index bbf71be9d0..173cbe199a 100644 --- a/seed/tests/test_certification_serializers.py +++ b/seed/tests/test_certification_serializers.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # encoding: utf-8 """ -copyright (c) 2014 - 2018 The Regents of the University of California, +copyright (c) 2014 - 2019 The Regents of the University of California, through Lawrence Berkeley National Laboratory(subject to receipt of any required approvals from the US. Department of Energy) and contributors. All rights reserved diff --git a/seed/tests/test_column_list_settings.py b/seed/tests/test_column_list_settings.py index b6076520fe..e0439af1b5 100644 --- a/seed/tests/test_column_list_settings.py +++ b/seed/tests/test_column_list_settings.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/tests/test_column_list_settings_views.py b/seed/tests/test_column_list_settings_views.py index 276f8fae92..40c59ebb13 100644 --- a/seed/tests/test_column_list_settings_views.py +++ b/seed/tests/test_column_list_settings_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/tests/test_column_mapping_views.py b/seed/tests/test_column_mapping_views.py index 07f4de856e..0f2501685e 100644 --- a/seed/tests/test_column_mapping_views.py +++ b/seed/tests/test_column_mapping_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/tests/test_column_views.py b/seed/tests/test_column_views.py index d4f69c1e2d..452f358425 100644 --- a/seed/tests/test_column_views.py +++ b/seed/tests/test_column_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/tests/test_columns.py b/seed/tests/test_columns.py index db0948e557..c121b6a6b4 100644 --- a/seed/tests/test_columns.py +++ b/seed/tests/test_columns.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/tests/test_cycle.py b/seed/tests/test_cycle.py index 1e3d56f988..1ef7c35afe 100644 --- a/seed/tests/test_cycle.py +++ b/seed/tests/test_cycle.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/tests/test_data_quality_checks.py b/seed/tests/test_data_quality_checks.py index 850914f8ca..57d0286e47 100644 --- a/seed/tests/test_data_quality_checks.py +++ b/seed/tests/test_data_quality_checks.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/tests/test_data_quality_checks_views.py b/seed/tests/test_data_quality_checks_views.py index 3478c16ee7..8259c8a5ac 100644 --- a/seed/tests/test_data_quality_checks_views.py +++ b/seed/tests/test_data_quality_checks_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/tests/test_decorators.py b/seed/tests/test_decorators.py index f177f9db6e..6e2cb31bcb 100644 --- a/seed/tests/test_decorators.py +++ b/seed/tests/test_decorators.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/tests/test_labels_api_views.py b/seed/tests/test_labels_api_views.py index 2693a7baaa..32e39f3fa6 100644 --- a/seed/tests/test_labels_api_views.py +++ b/seed/tests/test_labels_api_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author 'Piper Merriam ', Paul Munday Unit tests for seed/views/labels.py diff --git a/seed/tests/test_measures.py b/seed/tests/test_measures.py index a61ddd8e82..cb16ab9192 100644 --- a/seed/tests/test_measures.py +++ b/seed/tests/test_measures.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/tests/test_meter_views.py b/seed/tests/test_meter_views.py index babe4e99df..5af92a19aa 100644 --- a/seed/tests/test_meter_views.py +++ b/seed/tests/test_meter_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/tests/test_note.py b/seed/tests/test_note.py index ebb9f9b406..64977fc10f 100644 --- a/seed/tests/test_note.py +++ b/seed/tests/test_note.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author nicholas.long@nrel.gov """ diff --git a/seed/tests/test_note_views.py b/seed/tests/test_note_views.py index 1422165436..35dc5a2dba 100644 --- a/seed/tests/test_note_views.py +++ b/seed/tests/test_note_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author nicholas.long@nrel.gov """ diff --git a/seed/tests/test_numeric_expression_parser.py b/seed/tests/test_numeric_expression_parser.py index e72bd6b875..b7373bd19b 100644 --- a/seed/tests/test_numeric_expression_parser.py +++ b/seed/tests/test_numeric_expression_parser.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author 'Piper Merriam ' """ import itertools diff --git a/seed/tests/test_organization_utils.py b/seed/tests/test_organization_utils.py index ce502172c7..6d658e6214 100644 --- a/seed/tests/test_organization_utils.py +++ b/seed/tests/test_organization_utils.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author 'Piper Merriam ' """ from django.test import TestCase diff --git a/seed/tests/test_permissions.py b/seed/tests/test_permissions.py index 80c3af1afb..d2d780c932 100644 --- a/seed/tests/test_permissions.py +++ b/seed/tests/test_permissions.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/tests/test_portfoliomanager.py b/seed/tests/test_portfoliomanager.py index c67d46a207..4c6b8d95fe 100644 --- a/seed/tests/test_portfoliomanager.py +++ b/seed/tests/test_portfoliomanager.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA @@ -31,10 +31,11 @@ try: pm_avail_check = requests.get('http://isthewallbuilt.us/api.json', timeout=5) string_response = pm_avail_check.json()['status'] - if string_response == 'no': - skip_due_to_espm_down = True - else: + if string_response != 'no': skip_due_to_espm_down = False + else: + skip_due_to_espm_down = True + if skip_due_to_espm_down: pm_skip_test_check = skip('ESPM is likely down temporarily, ESPM tests will not run') except Exception: diff --git a/seed/tests/test_project_views.py b/seed/tests/test_project_views.py index 8acd2eacee..503a4d7324 100644 --- a/seed/tests/test_project_views.py +++ b/seed/tests/test_project_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/tests/test_properties_serializers.py b/seed/tests/test_properties_serializers.py index 153d13c002..d3a4a384bf 100644 --- a/seed/tests/test_properties_serializers.py +++ b/seed/tests/test_properties_serializers.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # encoding: utf-8 """ -copyright (c) 2014 - 2018 The Regents of the University of California, +copyright (c) 2014 - 2019 The Regents of the University of California, through Lawrence Berkeley National Laboratory(subject to receipt of any required approvals from the US. Department of Energy) and contributors. All rights reserved diff --git a/seed/tests/test_property_views.py b/seed/tests/test_property_views.py index 1d3e44eae8..f4cc264e2c 100644 --- a/seed/tests/test_property_views.py +++ b/seed/tests/test_property_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/tests/test_renderers.py b/seed/tests/test_renderers.py index a80dc6b45d..3dc6d336f2 100644 --- a/seed/tests/test_renderers.py +++ b/seed/tests/test_renderers.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/tests/test_scenarios.py b/seed/tests/test_scenarios.py index d60a4f7a8f..873fcbc058 100644 --- a/seed/tests/test_scenarios.py +++ b/seed/tests/test_scenarios.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/tests/test_sharing.py b/seed/tests/test_sharing.py index b17271874a..b30f0bf3b0 100644 --- a/seed/tests/test_sharing.py +++ b/seed/tests/test_sharing.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author Tests related to sharing of data between users, orgs, suborgs, etc. """ diff --git a/seed/tests/test_string_expression_parser.py b/seed/tests/test_string_expression_parser.py index c229c5dddd..99738ebef2 100644 --- a/seed/tests/test_string_expression_parser.py +++ b/seed/tests/test_string_expression_parser.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author 'Piper Merriam ' """ import itertools diff --git a/seed/tests/test_tasks.py b/seed/tests/test_tasks.py index 1cc79906b3..13a344627d 100644 --- a/seed/tests/test_tasks.py +++ b/seed/tests/test_tasks.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import logging diff --git a/seed/tests/test_tax_lot_property.py b/seed/tests/test_tax_lot_property.py index cb20452d5b..52143b905f 100644 --- a/seed/tests/test_tax_lot_property.py +++ b/seed/tests/test_tax_lot_property.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/tests/test_utils.py b/seed/tests/test_utils.py index 775a86c437..53cc22a4ed 100644 --- a/seed/tests/test_utils.py +++ b/seed/tests/test_utils.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from datetime import datetime diff --git a/seed/tests/test_views.py b/seed/tests/test_views.py index 6dcae57295..346b224c38 100644 --- a/seed/tests/test_views.py +++ b/seed/tests/test_views.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/tests/tests.py b/seed/tests/tests.py index a1d862efa2..44f46ce889 100644 --- a/seed/tests/tests.py +++ b/seed/tests/tests.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/tests/util.py b/seed/tests/util.py index 49c0c2d1e6..318b60c707 100644 --- a/seed/tests/util.py +++ b/seed/tests/util.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/token_generators.py b/seed/token_generators.py index 6579b38e6f..d00be1c25c 100644 --- a/seed/token_generators.py +++ b/seed/token_generators.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author: Aleck Landgraf token_generator.py - taken from django core master branch diff --git a/seed/urls.py b/seed/urls.py index 236bc7d2d9..82899c3252 100644 --- a/seed/urls.py +++ b/seed/urls.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/utils/__init__.py b/seed/utils/__init__.py index eb6589d82f..90e6b32855 100644 --- a/seed/utils/__init__.py +++ b/seed/utils/__init__.py @@ -1,6 +1,6 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/utils/address.py b/seed/utils/address.py index 1070f30be4..cef3d580cc 100644 --- a/seed/utils/address.py +++ b/seed/utils/address.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/utils/api.py b/seed/utils/api.py index 873f0311a1..758f770fb4 100644 --- a/seed/utils/api.py +++ b/seed/utils/api.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/utils/buildings.py b/seed/utils/buildings.py index 529c98ec69..233fb89f47 100644 --- a/seed/utils/buildings.py +++ b/seed/utils/buildings.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/utils/cache.py b/seed/utils/cache.py index a9aaa98ab8..3528b473a9 100644 --- a/seed/utils/cache.py +++ b/seed/utils/cache.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from django.core.cache import cache as django_cache diff --git a/seed/utils/generic.py b/seed/utils/generic.py index b69809c166..6541076b25 100644 --- a/seed/utils/generic.py +++ b/seed/utils/generic.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import json diff --git a/seed/utils/nocache.py b/seed/utils/nocache.py index 6565e254c5..85657b03ad 100644 --- a/seed/utils/nocache.py +++ b/seed/utils/nocache.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/utils/organizations.py b/seed/utils/organizations.py index afbf178816..3bc43eddad 100644 --- a/seed/utils/organizations.py +++ b/seed/utils/organizations.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/utils/pagination.py b/seed/utils/pagination.py index 6fcbfa575c..62a64df978 100644 --- a/seed/utils/pagination.py +++ b/seed/utils/pagination.py @@ -3,7 +3,7 @@ # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/utils/properties.py b/seed/utils/properties.py index 7a047828b6..4088d4addd 100644 --- a/seed/utils/properties.py +++ b/seed/utils/properties.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/utils/search.py b/seed/utils/search.py index c2f166a003..9809651db8 100644 --- a/seed/utils/search.py +++ b/seed/utils/search.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author 'Piper Merriam 0: return JsonResponse({ 'success': True, 'status': 'success', - 'message': 'successfully imported file with warnings %s' % messages['warnings'], + 'message': {'warnings': messages['warnings']}, 'data': { 'property_view': PropertyViewAsStateSerializer(property_view).data, # 'property_state': PropertyStateWritableSerializer(property_state).data, @@ -87,7 +147,7 @@ def create(self, request): return JsonResponse({ 'success': True, 'status': 'success', - 'message': 'successfully imported file', + 'message': {'warnings': []}, 'data': { 'property_view': PropertyViewAsStateSerializer(property_view).data, # 'property_state': PropertyStateWritableSerializer(property_state).data, @@ -97,5 +157,5 @@ def create(self, request): return JsonResponse({ 'success': False, 'status': 'error', - 'message': "Could not process building file with messages %s" % messages + 'message': messages }, status=status.HTTP_400_BAD_REQUEST) diff --git a/seed/views/certification.py b/seed/views/certification.py index f39788a37e..28e1f3f9f0 100644 --- a/seed/views/certification.py +++ b/seed/views/certification.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/views/column_list_settings.py b/seed/views/column_list_settings.py index 4c5a9802ab..5b56be47f0 100644 --- a/seed/views/column_list_settings.py +++ b/seed/views/column_list_settings.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/views/column_mappings.py b/seed/views/column_mappings.py index 80c3020f79..0f78b47788 100644 --- a/seed/views/column_mappings.py +++ b/seed/views/column_mappings.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/views/columns.py b/seed/views/columns.py index 8dc927c0e6..cb93c85d32 100644 --- a/seed/views/columns.py +++ b/seed/views/columns.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/views/cycles.py b/seed/views/cycles.py index 1ad70d8748..49eb004dc6 100644 --- a/seed/views/cycles.py +++ b/seed/views/cycles.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/views/data_quality.py b/seed/views/data_quality.py index 4ce444e0df..a04d36287e 100644 --- a/seed/views/data_quality.py +++ b/seed/views/data_quality.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/views/datasets.py b/seed/views/datasets.py index 0ef4b7ad1c..9915dce2de 100644 --- a/seed/views/datasets.py +++ b/seed/views/datasets.py @@ -1,6 +1,6 @@ # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/views/labels.py b/seed/views/labels.py index 9763df57ba..158c76b2f5 100644 --- a/seed/views/labels.py +++ b/seed/views/labels.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author 'Piper Merriam ' """ from collections import namedtuple diff --git a/seed/views/main.py b/seed/views/main.py index b6cdef213e..b7c94a9a6f 100644 --- a/seed/views/main.py +++ b/seed/views/main.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ diff --git a/seed/views/measures.py b/seed/views/measures.py index ab7665d361..7db9b9485f 100644 --- a/seed/views/measures.py +++ b/seed/views/measures.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ # import json diff --git a/seed/views/meters.py b/seed/views/meters.py index 0d4d6c12a3..674998bb31 100644 --- a/seed/views/meters.py +++ b/seed/views/meters.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ # import json diff --git a/seed/views/notes.py b/seed/views/notes.py index 2267a4d184..1fd9f410b4 100644 --- a/seed/views/notes.py +++ b/seed/views/notes.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author 'Piper Merriam ' """ import logging diff --git a/seed/views/organizations.py b/seed/views/organizations.py index 408bd50d1b..b1cefe4548 100644 --- a/seed/views/organizations.py +++ b/seed/views/organizations.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import logging @@ -26,6 +26,7 @@ OrganizationUser, ) from seed.models import Cycle, PropertyView, TaxLotView, Column +from seed.tasks import invite_to_organization from seed.utils.api import api_endpoint_class from seed.utils.organizations import create_organization, create_suborganization @@ -419,12 +420,15 @@ def remove_user(self, request, pk=None): 'message': 'user does not exist' }, status=status.HTTP_404_NOT_FOUND) - if not OrganizationUser.objects.filter( + # A super user can remove a user. The superuser logic is also part of the decorator which + # checks if super permissions have been limited per the ALLOW_SUPER_USER_PERMS setting. + org_owner = OrganizationUser.objects.filter( user=request.user, organization=org, role_level=ROLE_OWNER - ).exists(): + ).exists() + if not request.user.is_superuser and not org_owner: return JsonResponse({ 'status': 'error', - 'message': 'only the organization owner can remove a member' + 'message': 'only the organization owner or superuser can remove a member' }, status=status.HTTP_403_FORBIDDEN) is_last_member = not OrganizationUser.objects.filter( @@ -453,11 +457,13 @@ def remove_user(self, request, pk=None): # check the user and make sure they still have a valid organization to belong to if request.user.default_organization == org: - # find the first org and set it to that + # find the first org and set it to that. It is okay if first_org is none. + # it simply means the user has no allowed organizations and will need an admin to + # assign them to a new organization if they want to use the account again. first_org_user = OrganizationUser.objects.filter(user=user).order_by('id').first() - # it is okay if first_org is none. It means the user has no allowed organizations - request.user.default_organization = first_org_user.organization - request.user.save() + if first_org_user: + request.user.default_organization = first_org_user.organization + request.user.save() return JsonResponse({'status': 'success'}) @@ -541,7 +547,17 @@ def add_user(self, request, pk=None): org = Organization.objects.get(pk=pk) user = User.objects.get(pk=body['user_id']) - org.add_member(user) + _orguser, status = org.add_member(user) + + # Send an email if a new user has been added to the organization + if status: + try: + domain = request.get_host() + except Exception: + domain = 'seed-platform.org' + invite_to_organization( + domain, user, request.user.username, org.name + ) return JsonResponse({'status': 'success'}) @@ -616,8 +632,7 @@ def warn_bad_units(kind, unit_string): warn_bad_pint_spec('area', desired_display_units_area) desired_display_significant_figures = posted_org.get('display_significant_figures') - if isinstance(desired_display_significant_figures, int) \ - and desired_display_significant_figures >= 0: + if isinstance(desired_display_significant_figures, int) and desired_display_significant_figures >= 0: # noqa org.display_significant_figures = desired_display_significant_figures elif desired_display_significant_figures is not None: _log.warn("got bad sig figs {0} for org {1}".format( @@ -763,7 +778,8 @@ def sub_org(self, request, pk=None): 'message': 'User with email address (%s) does not exist' % email }, status=status.HTTP_400_BAD_REQUEST) - created, mess_or_org, _ = create_suborganization(user, org, body['sub_org_name'], ROLE_OWNER) + created, mess_or_org, _ = create_suborganization(user, org, body['sub_org_name'], + ROLE_OWNER) if created: return JsonResponse({ 'status': 'success', diff --git a/seed/views/portfoliomanager.py b/seed/views/portfoliomanager.py index 551fa84739..20a3a59f08 100644 --- a/seed/views/portfoliomanager.py +++ b/seed/views/portfoliomanager.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/views/projects.py b/seed/views/projects.py index 048212e63b..0cd354fc14 100644 --- a/seed/views/projects.py +++ b/seed/views/projects.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ # system imports diff --git a/seed/views/properties.py b/seed/views/properties.py index 02e6e14abf..8f803523b7 100644 --- a/seed/views/properties.py +++ b/seed/views/properties.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/views/reports.py b/seed/views/reports.py index a4162560a8..adc6690cf0 100644 --- a/seed/views/reports.py +++ b/seed/views/reports.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from collections import defaultdict diff --git a/seed/views/scenarios.py b/seed/views/scenarios.py index bc7537f373..fb626c8dde 100644 --- a/seed/views/scenarios.py +++ b/seed/views/scenarios.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ from rest_framework.parsers import JSONParser, FormParser diff --git a/seed/views/tax_lot_properties.py b/seed/views/tax_lot_properties.py index e27f3b4d0b..cb92d66ea7 100644 --- a/seed/views/tax_lot_properties.py +++ b/seed/views/tax_lot_properties.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/views/taxlots.py b/seed/views/taxlots.py index 51c8903a60..6b78da72ac 100644 --- a/seed/views/taxlots.py +++ b/seed/views/taxlots.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA diff --git a/seed/views/users.py b/seed/views/users.py index 048674a201..5481eea7dd 100644 --- a/seed/views/users.py +++ b/seed/views/users.py @@ -1,7 +1,7 @@ # !/usr/bin/env python # encoding: utf-8 """ -:copyright (c) 2014 - 2018, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA +:copyright (c) 2014 - 2019, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Department of Energy) and contributors. All rights reserved. # NOQA :author """ import logging diff --git a/setup.py b/setup.py index 0b0dae48ee..b1ccbd28be 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ setup( name='seed', - version='2.4.1', + version='2.4.2', packages=find_packages(), url='', license='revised BSD', diff --git a/vendors/package.json b/vendors/package.json new file mode 100644 index 0000000000..5808f4d478 --- /dev/null +++ b/vendors/package.json @@ -0,0 +1,44 @@ +{ + "name": "SEED-dependencies", + "version": "0.0.1", + "dependencies": { + "angular": "~1.6.10", + "angular-animate": "~1.6.10", + "angular-aria": "~1.6.10", + "angular-cookies": "~1.6.10", + "angular-dragula": "~1.2.8", + "angular-mocks": "~1.6.10", + "angular-sanitize": "~1.6.10", + "angular-translate": "~2.16.0", + "angular-translate-interpolation-messageformat": "~2.16.0", + "angular-translate-loader-static-files": "~2.16.0", + "angular-ui-bootstrap": "~1.3.3", + "angular-ui-grid": "=4.0.6", + "angular-ui-notification": "~0.3.6", + "angular-ui-router": "~1.0.20", + "angular-ui-router.statehelper": "~1.3.1", + "angular-ui-sortable": "~0.13.4", + "angular-xeditable": "~0.9.0", + "bootstrap": "~3.3.7", + "d3": "=3.5.4", + "dimple": "PMSI-AlignAlytics/dimple#2.2.0", + "file-saver": "=1.3.3", + "fine-uploader": "~5.16.2", + "font-awesome": "~4.7.0", + "jquery": "~3.3.1", + "jquery-ui-dist": "~1.12.1", + "lodash": "~4.17.11", + "moment": "~2.24.0", + "ng-focus-if": "~1.0.7", + "ng-tags-input": "~3.0.0", + "raven-js": "~3.22.1", + "spin.js": "~2.3.2", + "ui-grid-draggable-rows": "~0.3.3" + }, + "devDependencies": { + "napa": "~3.0.0" + }, + "scripts": { + "install": "napa jasmine/jasmine#v1.3.1:jasmine" + } +}