├── .editorconfig ├── .gitignore ├── CONTRIBUTORS.md ├── Dockerfile ├── INSTALL.md ├── LICENSE.md ├── README.md ├── RELEASES.md ├── assets ├── scripts │ └── application.js └── styles │ ├── application.scss │ ├── bootstrap │ └── _variables.scss │ ├── codehilite │ └── _monokai.scss │ ├── fontawesome │ └── _variables.scss │ └── reports.scss ├── bower.json ├── gulpfile.js ├── package.json ├── project ├── boh │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── behaviors.py │ ├── filters.py │ ├── forms.py │ ├── helpers.py │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ └── cron.py │ ├── managers.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_load_data.py │ │ ├── 0003_v1_0_1.py │ │ ├── 0004_v1_0_2.py │ │ ├── 0005_v1_0_3.py │ │ ├── 0006_v0_0_6.py │ │ └── __init__.py │ ├── models.py │ ├── reports.py │ ├── static │ │ └── boh │ │ │ ├── css │ │ │ ├── application.min.css │ │ │ ├── datepicker.min.css │ │ │ ├── select2-spinner.gif │ │ │ ├── select2.png │ │ │ └── select2x2.png │ │ │ ├── favicons │ │ │ ├── android-chrome-144x144.png │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-36x36.png │ │ │ ├── android-chrome-48x48.png │ │ │ ├── android-chrome-72x72.png │ │ │ ├── android-chrome-96x96.png │ │ │ ├── apple-touch-icon-114x114.png │ │ │ ├── apple-touch-icon-120x120.png │ │ │ ├── apple-touch-icon-144x144.png │ │ │ ├── apple-touch-icon-152x152.png │ │ │ ├── apple-touch-icon-180x180.png │ │ │ ├── apple-touch-icon-57x57.png │ │ │ ├── apple-touch-icon-60x60.png │ │ │ ├── apple-touch-icon-72x72.png │ │ │ ├── apple-touch-icon-76x76.png │ │ │ ├── apple-touch-icon-precomposed.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── browserconfig.xml │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon-96x96.png │ │ │ ├── favicon.ico │ │ │ ├── manifest.json │ │ │ ├── mstile-144x144.png │ │ │ ├── mstile-150x150.png │ │ │ ├── mstile-310x150.png │ │ │ ├── mstile-310x310.png │ │ │ └── mstile-70x70.png │ │ │ ├── fonts │ │ │ ├── bootstrap │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ │ └── glyphicons-halflings-regular.woff2 │ │ │ └── fontawesome │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ └── fontawesome-webfont.woff2 │ │ │ ├── img │ │ │ ├── bag_black.png │ │ │ ├── bag_white.png │ │ │ └── brand.png │ │ │ └── js │ │ │ ├── application.min.js │ │ │ ├── chart.min.js │ │ │ ├── datepicker.min.js │ │ │ └── modernizr.min.js │ ├── templates │ │ ├── boh │ │ │ ├── activity │ │ │ │ ├── add.html │ │ │ │ ├── base_activities.html │ │ │ │ ├── detail.html │ │ │ │ └── edit.html │ │ │ ├── application │ │ │ │ ├── add.html │ │ │ │ ├── add_relation.html │ │ │ │ ├── base_applications.html │ │ │ │ ├── edit_relation.html │ │ │ │ ├── engagements.html │ │ │ │ ├── environments.html │ │ │ │ ├── list.html │ │ │ │ ├── overview.html │ │ │ │ ├── people.html │ │ │ │ └── settings │ │ │ │ │ ├── base_settings.html │ │ │ │ │ ├── custom_fields.html │ │ │ │ │ ├── danger.html │ │ │ │ │ ├── data_elements.html │ │ │ │ │ ├── general.html │ │ │ │ │ ├── metadata.html │ │ │ │ │ ├── owasp_asvs.html │ │ │ │ │ ├── service_level_agreements.html │ │ │ │ │ └── services.html │ │ │ ├── base.html │ │ │ ├── dashboard │ │ │ │ ├── base_dashboard.html │ │ │ │ ├── metrics.html │ │ │ │ ├── my_dashboard.html │ │ │ │ ├── reports.html │ │ │ │ └── team_dashboard.html │ │ │ ├── engagement │ │ │ │ ├── add.html │ │ │ │ ├── base_engagements.html │ │ │ │ ├── detail.html │ │ │ │ └── edit.html │ │ │ ├── environment │ │ │ │ ├── add.html │ │ │ │ ├── base_environments.html │ │ │ │ └── edit │ │ │ │ │ ├── base_edit.html │ │ │ │ │ ├── credentials.html │ │ │ │ │ ├── danger.html │ │ │ │ │ ├── general.html │ │ │ │ │ └── locations.html │ │ │ ├── management │ │ │ │ ├── activity_types │ │ │ │ │ ├── activity_types.html │ │ │ │ │ ├── add.html │ │ │ │ │ ├── documentation.html │ │ │ │ │ └── edit.html │ │ │ │ ├── application_tags │ │ │ │ │ ├── add.html │ │ │ │ │ ├── application_tags.html │ │ │ │ │ └── edit.html │ │ │ │ ├── base_management.html │ │ │ │ ├── data_elements │ │ │ │ │ ├── add.html │ │ │ │ │ ├── data_elements.html │ │ │ │ │ └── edit.html │ │ │ │ ├── overview.html │ │ │ │ ├── service_level_agreements │ │ │ │ │ ├── add.html │ │ │ │ │ ├── edit.html │ │ │ │ │ └── service_level_agreements.html │ │ │ │ ├── services.html │ │ │ │ ├── threadfix │ │ │ │ │ ├── add.html │ │ │ │ │ ├── edit.html │ │ │ │ │ ├── import.html │ │ │ │ │ └── import_done.html │ │ │ │ └── users.html │ │ │ ├── organization │ │ │ │ ├── add.html │ │ │ │ ├── applications.html │ │ │ │ ├── base_organizations.html │ │ │ │ ├── overview.html │ │ │ │ ├── people.html │ │ │ │ └── settings │ │ │ │ │ ├── base_settings.html │ │ │ │ │ ├── danger.html │ │ │ │ │ ├── general.html │ │ │ │ │ └── people.html │ │ │ ├── person │ │ │ │ ├── add.html │ │ │ │ ├── base_person.html │ │ │ │ ├── detail.html │ │ │ │ ├── edit.html │ │ │ │ └── list.html │ │ │ ├── reports │ │ │ │ ├── app_summary.html │ │ │ │ ├── base.css │ │ │ │ ├── base.html │ │ │ │ ├── engagement_coverage.html │ │ │ │ └── threadfix_summary.html │ │ │ ├── snippets │ │ │ │ ├── application │ │ │ │ │ ├── _dcl.html │ │ │ │ │ └── _engagement.html │ │ │ │ ├── common │ │ │ │ │ ├── _activity_label.html │ │ │ │ │ └── tag_label.html │ │ │ │ ├── dashboard │ │ │ │ │ ├── _activity.html │ │ │ │ │ └── _engagement.html │ │ │ │ ├── engagement │ │ │ │ │ └── _activity.html │ │ │ │ ├── form │ │ │ │ │ ├── _checkbox.html │ │ │ │ │ ├── _general.html │ │ │ │ │ └── _markdown.html │ │ │ │ └── management │ │ │ │ │ └── tags │ │ │ │ │ ├── selectable_colors.html │ │ │ │ │ └── selectable_colors.js │ │ │ └── user │ │ │ │ ├── base_user.html │ │ │ │ ├── change_password.html │ │ │ │ └── profile.html │ │ └── registration │ │ │ ├── logged_out.html │ │ │ ├── login.html │ │ │ ├── password_change_done.html │ │ │ └── password_change_form.html │ ├── templatetags │ │ ├── __init__.py │ │ ├── boh_humanize.py │ │ ├── boh_tags.py │ │ ├── icon_filters.py │ │ └── markdown_render.py │ ├── test_models.py │ ├── urls.py │ └── views.py ├── boh_api │ ├── __init__.py │ ├── admin.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── templates │ │ └── rest_framework │ │ │ └── api.html │ ├── tests.py │ ├── urls.py │ ├── views.py │ └── viewsets.py ├── locale │ └── pt_BR │ │ └── LC_MESSAGES │ │ └── django.po ├── manage.py ├── project │ ├── __init__.py │ ├── settings │ │ ├── __init__.py │ │ ├── base.py │ │ ├── dev_aparsons.py │ │ └── local.py │ ├── urls.py │ └── wsgi.py └── sample_data.json ├── requirements.txt └── requirements ├── base.txt ├── dev.txt ├── local.txt ├── prod.txt └── test.txt /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig - http://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | indent_style = space 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.{css,py,sass,scss}] 13 | indent_size = 4 14 | 15 | [*.{html,js,json}] 16 | indent_size = 2 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Excluding migrations until model is finalized 2 | project/*/migrations/* 3 | !project/*/migrations/__init__.py 4 | !project/boh/migrations/0001_initial.py 5 | !project/boh/migrations/0002_load_data.py 6 | !project/boh/migrations/0003_v1_0_1.py 7 | !project/boh/migrations/0004_v1_0_2.py 8 | !project/boh/migrations/0005_v1_0_3.py 9 | !project/boh/migrations/0006_v0_0_6.py 10 | .idea 11 | 12 | project/project/settings/dev_aparsons.py 13 | 14 | # Byte-compiled / optimized / DLL files 15 | __pycache__/ 16 | *.py[cod] 17 | 18 | # C extensions 19 | *.so 20 | 21 | # Distribution / packaging 22 | .Python 23 | env/ 24 | py*env/ 25 | build/ 26 | libs/ 27 | develop-eggs/ 28 | dist/ 29 | downloads/ 30 | eggs/ 31 | lib/ 32 | lib64/ 33 | parts/ 34 | sdist/ 35 | var/ 36 | *.egg-info/ 37 | .installed.cfg 38 | *.egg 39 | 40 | # PyInstaller 41 | # Usually these files are written by a python script from a template 42 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 43 | *.manifest 44 | *.spec 45 | 46 | # Installer logs 47 | pip-log.txt 48 | pip-delete-this-directory.txt 49 | 50 | # Unit test / coverage reports 51 | htmlcov/ 52 | .tox/ 53 | .coverage 54 | .cache 55 | nosetests.xml 56 | coverage.xml 57 | 58 | # Translations 59 | *.mo 60 | *.pot 61 | 62 | # Django 63 | *.log 64 | db.sqlite3 65 | /static/ 66 | /media/ 67 | 68 | # Sphinx documentation 69 | docs/_build/ 70 | 71 | # PyBuilder 72 | target/ 73 | 74 | # Node 75 | node_modules 76 | .temp 77 | .sass-cache 78 | bower_components 79 | -------------------------------------------------------------------------------- /CONTRIBUTORS.md: -------------------------------------------------------------------------------- 1 | * Adam Parsons 2 | * Matt Tesauro 3 | * Aaron Weaver 4 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:alpine as base 2 | 3 | FROM base as builder 4 | 5 | COPY requirements.txt . 6 | COPY requirements/ requirements/ 7 | 8 | RUN apk add --update \ 9 | build-base \ 10 | python3-dev \ 11 | mariadb-dev && \ 12 | mkdir libs && \ 13 | pip3 install -r requirements.txt -t libs 14 | 15 | FROM base 16 | 17 | ENV PYTHONUNBUFFERED 1 18 | 19 | RUN mkdir /bag-of-holding 20 | WORKDIR /bag-of-holding 21 | COPY . /bag-of-holding/ 22 | 23 | COPY --from=builder /libs /libs 24 | ENV PYTHONPATH $PYTHONPATH:/libs 25 | 26 | RUN python3 /bag-of-holding/project/manage.py makemigrations && \ 27 | python3 /bag-of-holding/project/manage.py migrate && \ 28 | python3 /bag-of-holding/project/manage.py loaddata /bag-of-holding/project/sample_data.json 29 | 30 | ENTRYPOINT [ "python3", "/bag-of-holding/project/manage.py", "runserver", "0.0.0.0:8000" ] -------------------------------------------------------------------------------- /INSTALL.md: -------------------------------------------------------------------------------- 1 | # Development Installation Guide 2 | The following guide outlines how to setup your development environment to work with this project. 3 | 4 | ## Debian Setup 5 | The following should work for Ubuntu, Xubuntu, or any other Debian-based Linux. 6 | 7 | Depending on your storage engine you may need to install additional packages to your operating system. For example, you may need to install ```libmysqlclient``` to use the MySQL storage engine. 8 | 9 | Django has documentation for database configuration available here: 10 | - [PostgreSQL](https://docs.djangoproject.com/en/1.9/ref/databases/#postgresql-notes) 11 | - [MySQL](https://docs.djangoproject.com/en/1.9/ref/databases/#mysql-notes) 12 | - [Oracle](https://docs.djangoproject.com/en/1.9/ref/databases/#oracle-notes) 13 | 14 | --- 15 | 16 | **Install pip** 17 | 18 | ```sh 19 | sudo apt-get install python3-pip 20 | ``` 21 | 22 | **Install virtualenv** 23 | 24 | ```sh 25 | sudo pip3 install virtualenv 26 | ``` 27 | 28 | 29 | **Open the directory** 30 | 31 | ```sh 32 | cd bag-of-holding 33 | ``` 34 | 35 | **Create your virtual environment** 36 | 37 | ```sh 38 | virtualenv env 39 | ``` 40 | You can name your environment whatever you wish, just remember to use your new name in future commands instead of 'env'. Be sure not to commit it to the repository by adding it to the [.gitignore](.gitignore) file. 'env' is already being ignored. 41 | 42 | 43 | **Activate the virtual environment** 44 | 45 | ```sh 46 | source ./env/bin/activate 47 | ``` 48 | 49 | You should see (env) $ at your prompt, letting you know that you're running under the 'env' virtualenv install. To stop using the virtual environment at any time, just type: 50 | 51 | ```sh 52 | deactivate 53 | ``` 54 | 55 | **Install project requirements** 56 | 57 | ```sh 58 | pip install -r requirements.txt 59 | ``` 60 | 61 | ## Common Commands 62 | 63 | **Create and update migrations** 64 | 65 | ```sh 66 | python manage.py makemigrations 67 | ``` 68 | 69 | **Migrate the database to latest data model** 70 | 71 | ```sh 72 | python manage.py migrate 73 | ``` 74 | 75 | **Load some sample data** 76 | 77 | ```sh 78 | python manage.py loaddata sample_data.json 79 | ``` 80 | 81 | **Create a super user account** 82 | 83 | ```sh 84 | python manage.py createsuperuser 85 | ``` 86 | 87 | **Run the development server** 88 | 89 | ```sh 90 | python manage.py runserver 91 | ``` 92 | 93 | ## Translations 94 | 95 | Configure your language in settings file. The base directory to translations files is project/locale. 96 | 97 | **Generate a new translation file** 98 | 99 | ```sh 100 | django-admin.py makemessages -l 101 | ``` 102 | 103 | After the file has been generated, edit the po file at project/locale/<YOUR_LANGUAGE>/LC_MESSAGES/django.po and 104 | translate all messages to your language if it still doesn't exist. 105 | 106 | **Tells django to compile the translated files** 107 | 108 | ```sh 109 | django-admin.py compilemessages 110 | ``` 111 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2016 [CONTRIBUTORS.md](CONTRIBUTORS.md) 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | 15 | Portions of this work are reproduced from work created and shared by 16 | Denim Group and used according to the terms described in the 17 | applicable license. Pearson is not otherwise affiliated with the 18 | development of this work. 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bag of Holding 2 | 3 | The **Bag of Holding** is an application to assist in the organization and prioritization of software security activities. 4 | 5 | Check out these talks which cover building your own AppSec pipeline: 6 | 7 | * [Matt Tesauro - Taking AppSec to 11: Pipelines, DevOps and making things better](https://www.youtube.com/watch?v=LfVhB3EiDDs) 8 | * [Aaron Weaver - Building An AppSec Pipeline: Keeping Your Program, And Your Life, Sane](https://www.youtube.com/watch?v=1CDSOSl4DQU) 9 | * [Matt Tesauro - Lessons From DevOps: Taking DevOps Practices Into Your AppSec Life](https://www.youtube.com/watch?v=tDnyFitE0y4) 10 | 11 | ## Releases 12 | 13 | For information about **what's new** as well as **known issues**, see [RELEASES.md](RELEASES.md) 14 | 15 | ## Development Setup 16 | 17 | For information on setting up a development environment, see [INSTALL.md](INSTALL.md). 18 | 19 | ## Docker Startup 20 | 21 | Build and start the container 22 | 23 | ```sh 24 | docker build -t bag-of-holding . 25 | docker run -d -p 8000:8000 --name boh-server bag-of-holding:latest 26 | ``` 27 | 28 | Create super-user 29 | 30 | ```sh 31 | docker exec -it boh-server sh 32 | python3 /bag-of-holding/project/manage.py createsuperuser 33 | ``` 34 | 35 | ## Commands 36 | 37 | #### ThreadFix 38 | 39 | The following command will retrieve the latest metrics from ThreadFix for connected applications. We recommend this be run daily as a Cron job. 40 | 41 | ```sh 42 | python manage.py cron --threadfix 43 | ``` 44 | 45 | ## License 46 | 47 | * [Licensed under the Apache License, Version 2.0](LICENSE.md). 48 | -------------------------------------------------------------------------------- /assets/scripts/application.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | $(".alert-success").delay(4000).slideUp(500, function(){ 3 | $(this).alert('close'); 4 | }); 5 | 6 | $('[data-toggle="tooltip"]').tooltip(); 7 | 8 | $('select').select2(); 9 | 10 | $(".markdown").markdown({ 11 | iconlibrary: "fa", 12 | resize: "vertical", 13 | hiddenButtons: ["cmdCode"], 14 | reorderButtonGroups: ["groupFont", "groupLink", "groupMisc", "groupCustom", "groupUtil"], 15 | additionalButtons: [ 16 | [{ 17 | name: "groupCustom", 18 | data: [{ 19 | name: "codeHighlight", 20 | title: "Highlight Code", 21 | icon: { glyph: 'glyphicon glyphicon-asterisk', fa: 'fa fa-code' }, 22 | callback: function(e) { 23 | // Prepend/Give - surround the selection 24 | var chunk, cursor, selected = e.getSelection(),content = e.getContent(); 25 | // transform selection and set the cursor into chunked text 26 | if (selected.length === 0) { 27 | // Give extra word 28 | chunk = e.__localize('code here'); 29 | e.replaceSelection(' ' + chunk); 30 | // Set the cursor 31 | cursor = selected.start + 4; 32 | } else { 33 | if (selected.text.indexOf('\n') < 0) { 34 | chunk = selected.text; 35 | e.replaceSelection(' ' + chunk); 36 | // Set the cursor 37 | cursor = selected.start + 6; 38 | } else { 39 | var list = []; 40 | list = selected.text.split('\n'); 41 | chunk = list[0]; 42 | $.each(list, function(k, v) { 43 | list[k] = ' ' + v; 44 | }); 45 | e.replaceSelection('' + list.join('\n')); 46 | // Set the cursor 47 | cursor = selected.start + 4; 48 | } 49 | } 50 | // Set the cursor 51 | e.setSelection(cursor, cursor + chunk.length); 52 | } 53 | }, { 54 | name: "toc", 55 | title: "Table of Contents", 56 | icon: { glyph: 'glyphicon glyphicon-book', fa: 'fa fa-book' }, 57 | callback: function(e) { 58 | var selected = e.getSelection(); 59 | e.replaceSelection('\n[TOC]\n'); 60 | e.setSelection(selected.start,selected.start+8); 61 | } 62 | }] 63 | }] 64 | ], 65 | footer: '' 66 | }); 67 | 68 | $(".threadfix-process").click(function(event) { 69 | var $this = $(this); 70 | $this.hide() 71 | $this.parent().append(''); 72 | }); 73 | 74 | $(window).on('unload', function() { 75 | $(".fa-spinner").hide(function() { 76 | $(".threadfix-process").show(); 77 | }); 78 | }); 79 | 80 | }); 81 | -------------------------------------------------------------------------------- /assets/styles/application.scss: -------------------------------------------------------------------------------- 1 | @import "bootstrap/variables"; 2 | @import "bootstrap"; 3 | @import "bootstrap/theme"; 4 | 5 | @import "fontawesome/variables"; 6 | @import "font-awesome"; 7 | 8 | @import "codehilite/monokai"; 9 | 10 | // margin adjustments 11 | .margin-bottom { 12 | margin-bottom: $line-height-computed; 13 | } 14 | 15 | .no-margin-top { 16 | margin-top: 0px; 17 | } 18 | 19 | .no-margin-bottom { 20 | margin-bottom: 0px; 21 | } 22 | 23 | .no-margin-bottom-md { 24 | @media (min-width: $screen-md-min) and (max-width: $screen-md-max) { 25 | margin-bottom: 0px; 26 | } 27 | } 28 | 29 | .no-margin-bottom-lg { 30 | @media (min-width: $screen-lg-min) { 31 | margin-bottom: 0px; 32 | } 33 | } 34 | 35 | .horizontal-bar { 36 | margin-top: $line-height-computed; 37 | margin-bottom: $line-height-computed; 38 | } 39 | 40 | .badge-danger { 41 | background-color: $brand-danger; 42 | } 43 | 44 | // Vulnerability colors 45 | $color-critical: #D43F3A; 46 | $color-high: #D57A1D; 47 | $color-medium: #E4AB18; 48 | $color-low: #4CAE4C; 49 | $color-info: #357ABD; 50 | 51 | .bg-vuln-critical { 52 | background-color: $color-critical; 53 | } 54 | 55 | .bg-vuln-high { 56 | background-color: $color-high; 57 | } 58 | 59 | .bg-vuln-medium { 60 | background-color: $color-medium; 61 | } 62 | 63 | .bg-vuln-low { 64 | background-color: $color-low; 65 | } 66 | 67 | .bg-vuln-info { 68 | background-color: $color-info; 69 | } 70 | 71 | .bg-muted { 72 | background-color: $gray-light; 73 | } 74 | 75 | .vuln-count { 76 | color: #ffffff; 77 | font-size: ceil(($font-size-base * 1.5)); 78 | font-weight: bold; 79 | small { 80 | font-size: $font-size-small; 81 | font-weight: normal; 82 | } 83 | } 84 | 85 | // Tweaking Markdown Editor to look more like Bootstrap 86 | .md-editor { 87 | background-color: $input-bg; 88 | background-image: none; 89 | border: 1px solid $input-border; 90 | border-radius: $input-border-radius; 91 | @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); 92 | @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s); 93 | 94 | .md-header { 95 | border-top-left-radius: $input-border-radius; 96 | border-top-right-radius: $input-border-radius; 97 | } 98 | 99 | textarea { 100 | padding: 6px 9px; 101 | background-color: #fff; 102 | border-bottom-left-radius: $input-border-radius; 103 | border-bottom-right-radius: $input-border-radius; 104 | } 105 | 106 | .md-preview { 107 | padding: 6px 9px; 108 | border-bottom-left-radius: $input-border-radius; 109 | border-bottom-right-radius: $input-border-radius; 110 | } 111 | 112 | .md-footer { 113 | border-bottom-left-radius: $input-border-radius; 114 | border-bottom-right-radius: $input-border-radius; 115 | } 116 | 117 | } 118 | 119 | /* Sticky footer */ 120 | $footer-height: $navbar-height; 121 | $footer-color: $gray-lighter; 122 | $footer-padding-vertical: (($footer-height - $line-height-computed) / 2); 123 | 124 | html { 125 | position: relative; 126 | min-height: 100%; 127 | } 128 | body { 129 | margin-bottom: $footer-height; 130 | } 131 | 132 | .wrapper { 133 | padding-bottom: $line-height-computed; 134 | } 135 | 136 | .footer { 137 | position: absolute; 138 | bottom: 0; 139 | width: 100%; 140 | height: $footer-height; 141 | @include gradient-vertical($start-color: $footer-color, $end-color: darken($footer-color, 10%)); 142 | background-color: $footer-color; 143 | padding: $footer-padding-vertical 0; 144 | } 145 | -------------------------------------------------------------------------------- /assets/styles/codehilite/_monokai.scss: -------------------------------------------------------------------------------- 1 | .codehilite pre { 2 | color: #fff; 3 | background-color: #272822; 4 | border: none; 5 | } 6 | 7 | .hll { background-color: #49483e } 8 | .c { color: #75715e } /* Comment */ 9 | .err { color: #960050; background-color: #1e0010 } /* Error */ 10 | .k { color: #66d9ef } /* Keyword */ 11 | .l { color: #ae81ff } /* Literal */ 12 | .n { color: #f8f8f2 } /* Name */ 13 | .o { color: #f92672 } /* Operator */ 14 | .p { color: #f8f8f2 } /* Punctuation */ 15 | .cm { color: #75715e } /* Comment.Multiline */ 16 | .cp { color: #75715e } /* Comment.Preproc */ 17 | .c1 { color: #75715e } /* Comment.Single */ 18 | .cs { color: #75715e } /* Comment.Special */ 19 | .gd { color: #f92672 } /* Generic.Deleted */ 20 | .ge { font-style: italic } /* Generic.Emph */ 21 | .gi { color: #a6e22e } /* Generic.Inserted */ 22 | .gs { font-weight: bold } /* Generic.Strong */ 23 | .gu { color: #75715e } /* Generic.Subheading */ 24 | .kc { color: #66d9ef } /* Keyword.Constant */ 25 | .kd { color: #66d9ef } /* Keyword.Declaration */ 26 | .kn { color: #f92672 } /* Keyword.Namespace */ 27 | .kp { color: #66d9ef } /* Keyword.Pseudo */ 28 | .kr { color: #66d9ef } /* Keyword.Reserved */ 29 | .kt { color: #66d9ef } /* Keyword.Type */ 30 | .ld { color: #e6db74 } /* Literal.Date */ 31 | .m { color: #ae81ff } /* Literal.Number */ 32 | .s { color: #e6db74 } /* Literal.String */ 33 | .na { color: #a6e22e } /* Name.Attribute */ 34 | .nb { color: #f8f8f2 } /* Name.Builtin */ 35 | .nc { color: #a6e22e } /* Name.Class */ 36 | .no { color: #66d9ef } /* Name.Constant */ 37 | .nd { color: #a6e22e } /* Name.Decorator */ 38 | .ni { color: #f8f8f2 } /* Name.Entity */ 39 | .ne { color: #a6e22e } /* Name.Exception */ 40 | .nf { color: #a6e22e } /* Name.Function */ 41 | .nl { color: #f8f8f2 } /* Name.Label */ 42 | .nn { color: #f8f8f2 } /* Name.Namespace */ 43 | .nx { color: #a6e22e } /* Name.Other */ 44 | .py { color: #f8f8f2 } /* Name.Property */ 45 | .nt { color: #f92672 } /* Name.Tag */ 46 | .nv { color: #f8f8f2 } /* Name.Variable */ 47 | .ow { color: #f92672 } /* Operator.Word */ 48 | .w { color: #f8f8f2 } /* Text.Whitespace */ 49 | .mb { color: #ae81ff } /* Literal.Number.Bin */ 50 | .mf { color: #ae81ff } /* Literal.Number.Float */ 51 | .mh { color: #ae81ff } /* Literal.Number.Hex */ 52 | .mi { color: #ae81ff } /* Literal.Number.Integer */ 53 | .mo { color: #ae81ff } /* Literal.Number.Oct */ 54 | .sb { color: #e6db74 } /* Literal.String.Backtick */ 55 | .sc { color: #e6db74 } /* Literal.String.Char */ 56 | .sd { color: #e6db74 } /* Literal.String.Doc */ 57 | .s2 { color: #e6db74 } /* Literal.String.Double */ 58 | .se { color: #ae81ff } /* Literal.String.Escape */ 59 | .sh { color: #e6db74 } /* Literal.String.Heredoc */ 60 | .si { color: #e6db74 } /* Literal.String.Interpol */ 61 | .sx { color: #e6db74 } /* Literal.String.Other */ 62 | .sr { color: #e6db74 } /* Literal.String.Regex */ 63 | .s1 { color: #e6db74 } /* Literal.String.Single */ 64 | .ss { color: #e6db74 } /* Literal.String.Symbol */ 65 | .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ 66 | .vc { color: #f8f8f2 } /* Name.Variable.Class */ 67 | .vg { color: #f8f8f2 } /* Name.Variable.Global */ 68 | .vi { color: #f8f8f2 } /* Name.Variable.Instance */ 69 | .il { color: #ae81ff } /* Literal.Number.Integer.Long */ 70 | -------------------------------------------------------------------------------- /assets/styles/reports.scss: -------------------------------------------------------------------------------- 1 | 2 | 3 | // Colors 4 | $pearson-orange: rgb(237, 107, 6); 5 | $pearson-purple: rgb(157, 19, 72); 6 | $pearson-blue: rgb(54, 67, 149); 7 | 8 | $pearson-green: rgb(0, 139, 93); 9 | $pearson-green-1: rgb(0, 161, 95); 10 | $pearson-green-2: rgb(63, 168, 93); 11 | $pearson-green-3: rgb(97, 174, 91); 12 | $pearson-green-4: rgb(125, 182, 88); 13 | 14 | $pearson-cream: rgb(251, 245, 234); 15 | 16 | $pearson-fonts: 'Gill Sans', 'Gill Sans MT', Calibri, sans-serif; 17 | 18 | // Overridden Bootstrap properties 19 | $brand-primary: $pearson-green; 20 | 21 | $font-size-base: 12px; 22 | $font-family-sans-serif: $pearson-fonts; 23 | 24 | $headings-font-family: $pearson-fonts; 25 | $headings-font-weight: bold; 26 | $headings-color: $pearson-green; 27 | 28 | $table-bg-accent: #ffffff; 29 | $table-bg-accent: darken($pearson-cream, 5%); 30 | 31 | $page-header-border-color: $pearson-green; 32 | $hr-border: $pearson-green; 33 | 34 | 35 | // Core variables and mixins 36 | @import "bootstrap/variables"; 37 | @import "bootstrap/mixins"; 38 | 39 | // Reset and dependencies 40 | @import "bootstrap/normalize"; 41 | @import "bootstrap/print"; 42 | 43 | @media print { 44 | hr { 45 | border-color: #000 !important; 46 | } 47 | .page-header { 48 | border-color: #000 !important; 49 | margin-top: 0; 50 | padding-top: 0; 51 | } 52 | } 53 | 54 | // @import "bootstrap/glyphicons"; 55 | 56 | // Core CSS 57 | @import "bootstrap/scaffolding"; 58 | @import "bootstrap/type"; 59 | @import "bootstrap/code"; 60 | @import "bootstrap/grid"; 61 | @import "bootstrap/tables"; 62 | // @import "bootstrap/forms"; 63 | @import "bootstrap/buttons"; 64 | 65 | // Components 66 | // @import "bootstrap/component-animations"; 67 | // @import "bootstrap/dropdowns"; 68 | @import "bootstrap/button-groups"; 69 | @import "bootstrap/input-groups"; 70 | @import "bootstrap/navs"; 71 | // @import "bootstrap/navbar"; 72 | // @import "bootstrap/breadcrumbs"; 73 | // @import "bootstrap/pagination"; 74 | // @import "bootstrap/pager"; 75 | @import "bootstrap/labels"; 76 | @import "bootstrap/badges"; 77 | @import "bootstrap/jumbotron"; 78 | @import "bootstrap/thumbnails"; 79 | @import "bootstrap/alerts"; 80 | @import "bootstrap/progress-bars"; 81 | @import "bootstrap/media"; 82 | @import "bootstrap/list-group"; 83 | @import "bootstrap/panels"; 84 | // @import "bootstrap/responsive-embed"; 85 | @import "bootstrap/wells"; 86 | // @import "bootstrap/close"; 87 | 88 | // Components w/ JavaScript 89 | // @import "bootstrap/modals"; 90 | // @import "bootstrap/tooltip"; 91 | // @import "bootstrap/popovers"; 92 | // @import "bootstrap/carousel"; 93 | 94 | // Utility classes 95 | @import "bootstrap/utilities"; 96 | @import "bootstrap/responsive-utilities"; 97 | 98 | //@import "bootstrap/theme"; 99 | 100 | h1 { 101 | color: $pearson-green; 102 | } 103 | 104 | body { 105 | background-color: $pearson-cream; 106 | font-family: $pearson-fonts; 107 | } 108 | 109 | // Vulnerability colors 110 | $color-critical: #D43F3A; 111 | $color-high: #D57A1D; 112 | $color-medium: #E4AB18; 113 | $color-low: #4CAE4C; 114 | $color-info: #357ABD; 115 | 116 | .bg-vuln-critical { 117 | background-color: $color-critical; 118 | } 119 | 120 | .bg-vuln-high { 121 | background-color: $color-high; 122 | } 123 | 124 | .bg-vuln-medium { 125 | background-color: $color-medium; 126 | } 127 | 128 | .bg-vuln-low { 129 | background-color: $color-low; 130 | } 131 | 132 | .bg-vuln-info { 133 | background-color: $color-info; 134 | } 135 | 136 | .bg-muted { 137 | background-color: $gray-light; 138 | } 139 | 140 | .white { 141 | color: #ffffff; 142 | } 143 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bag-of-holding", 3 | "version": "0.0.6", 4 | "private": true, 5 | "ignore": [ 6 | "**/.*", 7 | "node_modules", 8 | "bower_components", 9 | "test", 10 | "tests" 11 | ], 12 | "dependencies": { 13 | "bootstrap-sass": "~3.3.4", 14 | "fontawesome": "~4.3.0", 15 | "modernizer": "~2.8.2", 16 | "bootstrap-datepicker": "~1.4.0", 17 | "bootstrap-markdown": "~2.8.0", 18 | "markdown": "~0.5.0", 19 | "Chart.js": "~1.0.2", 20 | "select2": "~3.5.2", 21 | "select2-bootstrap-css": "~1.4.6" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bag-of-holding", 3 | "version": "0.0.6", 4 | "description": "The **Bag of Holding** is an application security utility to assist in the organization and prioritization of software security activities.", 5 | "repository": { 6 | "type": "git", 7 | "url": "ssh://git@github.com:PearsonEducation/bag-of-holding.git" 8 | }, 9 | "license": "Apache 2", 10 | "devDependencies": { 11 | "bower": "^1.4.1", 12 | "gulp": "^3.9.0", 13 | "gulp-add-src": "^0.2.0", 14 | "gulp-concat": "^2.5.2", 15 | "gulp-minify-css": "^1.0.0", 16 | "gulp-rename": "^1.2.0", 17 | "gulp-sass": "^1.3.3", 18 | "gulp-uglify": "^1.1.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /project/boh/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '0.0.5' 2 | 3 | default_app_config = 'boh.apps.BagOfHoldingConfig' 4 | -------------------------------------------------------------------------------- /project/boh/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BagOfHoldingConfig(AppConfig): 5 | name = 'boh' 6 | verbose_name = "Bag of Holding" 7 | -------------------------------------------------------------------------------- /project/boh/behaviors.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class TimeStampedModel(models.Model): 5 | """An abstract model allowing models to track its creation and last modified times.""" 6 | 7 | created_date = models.DateTimeField(auto_now_add=True) 8 | modified_date = models.DateTimeField(auto_now=True) 9 | 10 | class Meta: 11 | abstract = True 12 | -------------------------------------------------------------------------------- /project/boh/filters.py: -------------------------------------------------------------------------------- 1 | import django_filters 2 | 3 | from .models import Organization, Application 4 | 5 | 6 | class ApplicationFilter(django_filters.FilterSet): 7 | name = django_filters.CharFilter(lookup_expr='icontains') 8 | organization = django_filters.ModelMultipleChoiceFilter(queryset=Organization.objects.all()) 9 | business_criticality = django_filters.MultipleChoiceFilter(choices=Application.BUSINESS_CRITICALITY_CHOICES) 10 | platform = django_filters.MultipleChoiceFilter(choices=Application.PLATFORM_CHOICES) 11 | lifecycle = django_filters.MultipleChoiceFilter(choices=Application.LIFECYCLE_CHOICES) 12 | origin = django_filters.MultipleChoiceFilter(choices=Application.ORIGIN_CHOICES) 13 | asvs_level = django_filters.MultipleChoiceFilter(choices=Application.ASVS_CHOICES) 14 | 15 | class Meta: 16 | model = Application 17 | fields = [ 18 | 'name', 'organization', 'business_criticality', 'platform', 'lifecycle', 'origin', 'external_audience', 19 | 'internet_accessible', 'technologies', 'regulations', 'service_level_agreements', 'tags', 'asvs_level' 20 | ] 21 | -------------------------------------------------------------------------------- /project/boh/helpers.py: -------------------------------------------------------------------------------- 1 | def data_sensitivity_value(data_elements): 2 | """Calculates the data sensitivity value.""" 3 | from .models import DataElement 4 | vector = { 5 | DataElement.GLOBAL_CATEGORY: 1.0, 6 | DataElement.PERSONAL_CATEGORY: 0.0, 7 | DataElement.STUDENT_CATEGORY: 0.0, 8 | DataElement.GOVERNMENT_CATEGORY: 0.0, 9 | DataElement.PCI_CATEGORY: 0.0, 10 | DataElement.MEDICAL_CATEGORY: 0.0, 11 | DataElement.COMPANY_CATEGORY: 0.0, 12 | } 13 | 14 | for data_element in data_elements: 15 | vector[data_element.category] += data_element.weight 16 | 17 | # DSV = Global * (Personal + Student + Government) + PCI + Medical + Company 18 | dsv = ( 19 | vector[DataElement.GLOBAL_CATEGORY] * 20 | ( 21 | vector[DataElement.PERSONAL_CATEGORY] + 22 | vector[DataElement.STUDENT_CATEGORY] + 23 | vector[DataElement.GOVERNMENT_CATEGORY] 24 | ) + 25 | vector[DataElement.PCI_CATEGORY] + 26 | vector[DataElement.MEDICAL_CATEGORY] + 27 | vector[DataElement.COMPANY_CATEGORY] 28 | ) 29 | 30 | return dsv 31 | 32 | 33 | def data_classification_level(dsv): 34 | """Returns the data classification level of the calculated data sensitivity value.""" 35 | if dsv < 15: 36 | return 1 37 | elif 15 <= dsv < 100: 38 | return 2 39 | elif 100 <= dsv < 150: 40 | return 3 41 | else: 42 | return 4 43 | -------------------------------------------------------------------------------- /project/boh/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/management/__init__.py -------------------------------------------------------------------------------- /project/boh/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/management/commands/__init__.py -------------------------------------------------------------------------------- /project/boh/management/commands/cron.py: -------------------------------------------------------------------------------- 1 | from django.core.management.base import BaseCommand, CommandError 2 | 3 | from threadfix_api import threadfix 4 | 5 | from ... import models 6 | 7 | 8 | class Command(BaseCommand): 9 | 10 | help = 'Available commands designed to be run as cron tasks.' 11 | 12 | def add_arguments(self, parser): 13 | parser.add_argument('--threadfix', action='store_true', dest='threadfix', default=False, help='Retrieves metrics from ThreadFix. Recommended to be run once daily.') 14 | 15 | def handle(self, *args, **options): 16 | if options['threadfix']: 17 | self._threadfix() 18 | 19 | def _threadfix(self): 20 | applications = models.Application.objects.threadfix_associated() 21 | 22 | errors = [] 23 | for application in applications: 24 | tf_api = threadfix.ThreadFixAPI(host=application.threadfix.host, api_key=application.threadfix.api_key, verify_ssl=application.threadfix.verify_ssl) 25 | 26 | response = tf_api.get_application(application_id=application.threadfix_application_id) 27 | if response.success: 28 | critical_count = response.data['criticalVulnCount'] 29 | high_count = response.data['highVulnCount'] 30 | medium_count = response.data['mediumVulnCount'] 31 | low_count = response.data['lowVulnCount'] 32 | informational_count = response.data['infoVulnCount'] 33 | 34 | models.ThreadFixMetrics.objects.create( 35 | application=application, 36 | critical_count=critical_count, 37 | high_count=high_count, 38 | medium_count=medium_count, 39 | low_count=low_count, 40 | informational_count=informational_count 41 | ).save() 42 | else: 43 | error = 'Unable to retrieve ThreadFix data from "' + application.threadfix.name + '" for "' + application.name + '": ' + response.message 44 | self.stderr.write(error) 45 | errors.append(error) 46 | 47 | if len(errors) > 0: 48 | raise CommandError(errors) 49 | -------------------------------------------------------------------------------- /project/boh/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/migrations/__init__.py -------------------------------------------------------------------------------- /project/boh/reports.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.http import HttpResponse 3 | from django.template import loader, Context 4 | from django.utils import timezone 5 | from django.utils.translation import ugettext_lazy as _ 6 | 7 | from . import models 8 | 9 | 10 | class Report(object): 11 | """Base class used for generating reports.""" 12 | 13 | def __init__(self, report_type, file_name, file_format, requester): 14 | self.report_type = report_type 15 | self.file_name = file_name 16 | self.file_format = file_format 17 | self.requester = requester 18 | 19 | content_types = { 20 | 'csv': 'text/csv', 21 | 'html': 'text/html' 22 | } 23 | 24 | self.content_type = content_types[file_format] 25 | 26 | def __str__(self): 27 | return '%s: %s.%s' % (self.report_type, self.file_name, self.file_format) 28 | 29 | def generate(self): 30 | raise NotImplementedError(_('Subclasses must override generate()')) 31 | 32 | def response(self): 33 | response = HttpResponse(content_type=self.content_type) 34 | if not settings.DEBUG: 35 | response['Content-Disposition'] = 'attachment; filename="%s.%s"' % (self.file_name, self.file_format) 36 | response.write(self.generate()) 37 | return response 38 | 39 | 40 | class EngagementCoverageReport(Report): 41 | 42 | def __init__(self, file_name, file_format, organizations, requester): 43 | super(EngagementCoverageReport, self).__init__(_('Engagement Coverage Report'), file_name, file_format, requester) 44 | self.organizations = organizations 45 | 46 | def generate(self): 47 | if not self.organizations: 48 | self.organizations = models.Organization.objects.all() 49 | 50 | if self.file_format == 'html': 51 | template = loader.get_template('boh/reports/engagement_coverage.html') 52 | context = Context({ 53 | 'current_datetime': timezone.now(), 54 | 'requester': self.requester, 55 | 'organizations': self.organizations 56 | }) 57 | return template.render(context) 58 | else: 59 | return 'test, test' 60 | 61 | 62 | class ThreadFixSummaryReport(Report): 63 | 64 | def __init__(self, file_name, file_format, organizations, requester): 65 | super(ThreadFixSummaryReport, self).__init__(_('ThreadFix Summary Report'), file_name, file_format, requester) 66 | self.organizations = organizations 67 | 68 | def generate(self): 69 | if not self.organizations: 70 | self.organizations = models.Organization.objects.all() 71 | 72 | if self.file_format == 'html': 73 | template = loader.get_template('boh/reports/threadfix_summary.html') 74 | context = Context({ 75 | 'current_datetime': timezone.now(), 76 | 'requester': self.requester, 77 | 'organizations': self.organizations 78 | }) 79 | return template.render(context) 80 | else: 81 | return 'test, test' 82 | 83 | 84 | class AppSummaryReport(Report): 85 | 86 | def __init__(self, file_name, file_format, applications, requester): 87 | super(AppSummaryReport, self).__init__(_('Application Summary Report'), file_name, file_format, requester) 88 | self.applications = applications 89 | 90 | def generate(self): 91 | if not self.applications: 92 | self.applications = models.Application.objects.all() 93 | 94 | if self.file_format == 'html': 95 | template = loader.get_template('boh/reports/app_summary.html') 96 | context = Context({ 97 | 'current_datetime': timezone.now(), 98 | 'requester': self.requester, 99 | 'applications': self.applications 100 | }) 101 | return template.render(context) 102 | else: 103 | return 'test, test' 104 | -------------------------------------------------------------------------------- /project/boh/static/boh/css/select2-spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/css/select2-spinner.gif -------------------------------------------------------------------------------- /project/boh/static/boh/css/select2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/css/select2.png -------------------------------------------------------------------------------- /project/boh/static/boh/css/select2x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/css/select2x2.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/android-chrome-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/android-chrome-144x144.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/android-chrome-192x192.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/android-chrome-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/android-chrome-36x36.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/android-chrome-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/android-chrome-48x48.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/android-chrome-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/android-chrome-72x72.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/android-chrome-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/android-chrome-96x96.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | #2b5797 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/favicon-96x96.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/favicon.ico -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Bag of Holding", 3 | "icons": [ 4 | { 5 | "src": "\/android-chrome-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "\/android-chrome-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "\/android-chrome-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "\/android-chrome-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "\/android-chrome-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "\/android-chrome-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/mstile-144x144.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/mstile-150x150.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/mstile-310x150.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/mstile-310x310.png -------------------------------------------------------------------------------- /project/boh/static/boh/favicons/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/favicons/mstile-70x70.png -------------------------------------------------------------------------------- /project/boh/static/boh/fonts/bootstrap/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/fonts/bootstrap/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /project/boh/static/boh/fonts/bootstrap/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/fonts/bootstrap/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /project/boh/static/boh/fonts/bootstrap/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/fonts/bootstrap/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /project/boh/static/boh/fonts/bootstrap/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/fonts/bootstrap/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /project/boh/static/boh/fonts/fontawesome/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/fonts/fontawesome/FontAwesome.otf -------------------------------------------------------------------------------- /project/boh/static/boh/fonts/fontawesome/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/fonts/fontawesome/fontawesome-webfont.eot -------------------------------------------------------------------------------- /project/boh/static/boh/fonts/fontawesome/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/fonts/fontawesome/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /project/boh/static/boh/fonts/fontawesome/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/fonts/fontawesome/fontawesome-webfont.woff -------------------------------------------------------------------------------- /project/boh/static/boh/fonts/fontawesome/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/fonts/fontawesome/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /project/boh/static/boh/img/bag_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/img/bag_black.png -------------------------------------------------------------------------------- /project/boh/static/boh/img/bag_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/img/bag_white.png -------------------------------------------------------------------------------- /project/boh/static/boh/img/brand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/static/boh/img/brand.png -------------------------------------------------------------------------------- /project/boh/templates/boh/activity/add.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/activity/base_activities.html" %} 2 | {% load i18n %} 3 | 4 | {% block title %}{{ application.name }} | {{ engagement.start_date }} - {{ engagement.end_date }} | {% trans 'New Activity' %}{% endblock %} 5 | 6 | {% block engagement_breadcrumb %} 7 |
  • {% trans 'Engagements' %}
  • 8 |
  • {{ engagement.start_date }} - {{ engagement.end_date }}
  • 9 |
  • {% trans 'New Activity' %}
  • 10 | {% endblock engagement_breadcrumb %} 11 | 12 | {% block activity_content %} 13 |
    14 |
    15 |
    16 | {% csrf_token %} 17 |
    18 |
    19 |

    {% trans 'New Activity' %}

    20 |
    21 |
    22 | {% include "boh/snippets/form/_general.html" with control=form.activity_type %} 23 | {% include "boh/snippets/form/_markdown.html" with control=form.description %} 24 | {% include "boh/snippets/form/_general.html" with control=form.users %} 25 |
    26 | 30 |
    31 |
    32 |
    33 |
    34 | 37 |
    38 |
    39 | {% endblock activity_content %} 40 | -------------------------------------------------------------------------------- /project/boh/templates/boh/activity/base_activities.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/engagement/base_engagements.html" %} 2 | 3 | {% block engagement_content %} 4 | {% block activity_content %} 5 | {% endblock activity_content %} 6 | {% endblock engagement_content %} 7 | -------------------------------------------------------------------------------- /project/boh/templates/boh/activity/edit.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/activity/base_activities.html" %} 2 | {% load i18n %} 3 | 4 | {% block title %}{{ application.name }} | {{ activity.engagement.start_date }} - {{ activity.engagement.end_date }} | {{ activity.activity_type.name }} | {% trans 'Edit Activity' %}{% endblock %} 5 | 6 | {% block engagement_breadcrumb %} 7 |
  • {% trans 'Engagements' %}
  • 8 |
  • {{ activity.engagement.start_date }} - {{ activity.engagement.end_date }}
  • 9 |
  • {{ activity.activity_type.name }}
  • 10 |
  • {% trans 'Edit Activity' %}
  • 11 | {% endblock engagement_breadcrumb %} 12 | 13 | {% block activity_content %} 14 |
    15 |
    16 |
    17 | {% csrf_token %} 18 |
    19 |
    20 |

    {% trans 'Edit Activity' %}

    21 |
    22 |
    23 | {% include "boh/snippets/form/_general.html" with control=form.status %} 24 | {% include "boh/snippets/form/_general.html" with control=form.activity_type %} 25 | {% include "boh/snippets/form/_markdown.html" with control=form.description %} 26 | {% include "boh/snippets/form/_general.html" with control=form.users %} 27 |
    28 | 32 |
    33 |
    34 |
    35 |
    36 | 39 |
    40 | {% csrf_token %} 41 | 42 |
    43 |
    44 |
    45 | {% endblock activity_content %} 46 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/add.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | {% load i18n %} 3 | 4 | {% block title %}{% trans 'Add Application' %}{% endblock %} 5 | 6 | {% block content %} 7 |
    8 |
    9 |
    10 | {% csrf_token %} 11 |
    12 |
    13 |

    {% trans 'New Application' %}

    14 |
    15 |
    16 | {% include "boh/snippets/form/_general.html" with control=form.organization %} 17 | {% include "boh/snippets/form/_general.html" with control=form.name %} 18 | {% include "boh/snippets/form/_markdown.html" with control=form.description %} 19 |
    20 | 24 |
    25 |
    26 |
    27 |
    28 | 31 |
    32 |
    33 | {% endblock %} 34 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/add_relation.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/base_applications.html" %} 2 | {% load i18n %} 3 | 4 | {% block title %}{{ application.name }} | {% trans 'People' %} | {% trans 'Add Person' %}{% endblock %} 5 | 6 | {% block application_content %} 7 |
    8 |
    9 |
    10 | {% csrf_token %} 11 |
    12 |
    13 |

    {% trans 'New Related Person' %}

    14 |
    15 |
    16 | {% include "boh/snippets/form/_general.html" with control=relation_form.person %} 17 | {% include "boh/snippets/form/_checkbox.html" with control=relation_form.owner %} 18 | {% include "boh/snippets/form/_checkbox.html" with control=relation_form.emergency %} 19 | {% include "boh/snippets/form/_general.html" with control=relation_form.notes %} 20 |
    21 | 25 |
    26 |
    27 |
    28 |
    29 | 32 |
    33 |
    34 | {% endblock application_content %} 35 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/base_applications.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 | 17 | 18 | {% block application_content %} 19 | {% endblock application_content %} 20 | {% endblock content %} 21 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/edit_relation.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/base_applications.html" %} 2 | {% load i18n %} 3 | 4 | {% block title %}{{ application.name }} | {% trans 'People' %} | {% trans 'Add Person' %}{% endblock %} 5 | 6 | {% block application_content %} 7 |
    8 |
    9 |
    10 | {% csrf_token %} 11 |
    12 |
    13 |

    {% trans 'Edit Person' %}

    14 |
    15 |
    16 | {% include "boh/snippets/form/_general.html" with control=relation_form.person %} 17 | {% include "boh/snippets/form/_checkbox.html" with control=relation_form.owner %} 18 | {% include "boh/snippets/form/_checkbox.html" with control=relation_form.emergency %} 19 | {% include "boh/snippets/form/_general.html" with control=relation_form.notes %} 20 |
    21 | 25 |
    26 |
    27 |
    28 |
    29 | 32 |
    33 | {% csrf_token %} 34 | 35 |
    36 |
    37 |
    38 | {% endblock application_content %} 39 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/engagements.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/base_applications.html" %} 2 | {% load i18n %} 3 | 4 | {% block title %}{{ application.name }} | {% trans 'Engagements' %}{% endblock %} 5 | 6 | {% block application_content %} 7 |
    8 |
    9 | 10 | 11 |
    12 | 13 |
    14 |
    15 |

    {% trans 'Pending' %}

    16 |
    17 |
    18 | {% for engagement in pending_engagements %} 19 | {% include "boh/snippets/application/_engagement.html" with engagement=engagement %} 20 | {% empty %} 21 |
  • {% trans 'There are no pending engagements.' %}
  • 22 | {% endfor %} 23 |
    24 |
    25 | 26 |
    27 |
    28 |

    {% trans 'Open' %}

    29 |
    30 |
    31 | {% for engagement in open_engagements %} 32 | {% include "boh/snippets/application/_engagement.html" with engagement=engagement %} 33 | {% empty %} 34 |
  • {% trans 'There are no open engagements.' %}
  • 35 | {% endfor %} 36 |
    37 |
    38 | 39 |
    40 |
    41 |

    {% trans 'Closed' %}

    42 |
    43 |
    44 | {% for engagement in closed_engagements %} 45 | {% include "boh/snippets/application/_engagement.html" with engagement=engagement %} 46 | {% empty %} 47 |
  • {% trans 'There are no closed engagements.' %}
  • 48 | {% endfor %} 49 |
    50 |
    51 |
    52 |
    53 | 58 |
    59 |
    60 | {% endblock application_content %} 61 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/people.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/base_applications.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ application.name }} | {% trans 'People' %}{% endblock %} 6 | 7 | {% block application_content %} 8 |
    9 |
    10 | 11 | 12 |
    13 | 14 | {% regroup application.relation_set.all|dictsort:"person.get_role_display" by person.get_role_display as relation_list_by_role %} 15 | {% for relations in relation_list_by_role %} 16 |
    17 |
    18 |

    {{ relations.grouper }}

    19 |
    20 |
    21 | {% for relation in relations.list %} 22 |
  • 23 |
    24 |
    25 |

    {{ relation.person.first_name }} {{ relation.person.last_name }}

    26 |
    27 |
    28 | 29 |
    30 |
    31 | {% if relation.owner %}{% endif %} 32 | {% if relation.emergency %}{% endif %} 33 | {% if relation.notes %}{% if relation.owner or relation.emergency %}
    {% endif %}{{ relation.notes }}{% endif %} 34 |
  • 35 | {% endfor %} 36 |
    37 |
    38 | {% endfor %} 39 |
    40 |
    41 | 44 |
    45 |
    46 | {% endblock application_content %} 47 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/settings/base_settings.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/base_applications.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block application_content %} 6 |
    7 | 28 |
    29 | {% block settings_content %} 30 | {% endblock settings_content %} 31 |
    32 |
    33 | {% endblock application_content %} 34 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/settings/custom_fields.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/settings/base_settings.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ application.name }} | {% trans 'Settings' %} | {% trans 'Custom Fields' %}{% endblock %} 6 | 7 | {% block settings_content %} 8 |
    9 |
    10 |
    11 | {% csrf_token %} 12 | {{ formset.management_form }} 13 |
    14 |
    15 | {% for form in formset.forms %} 16 |
    17 |
    18 | {% if not forloop.last and formset.can_delete %} 19 |
    20 | 23 |
    24 | {% endif %} 25 |

    {% if forloop.last %}{% trans 'Add' %}{% else %}{% trans 'Edit' %}{% endif %} {% trans 'Custom Field' %}

    26 |
    27 |
    28 | {{ form.id }} 29 | {% include "boh/snippets/form/_general.html" with control=form.custom_field %} 30 | {% include "boh/snippets/form/_general.html" with control=form.value %} 31 |
    32 |
    33 | {% endfor %} 34 |
    35 | 38 |
    39 |
    40 |
    41 |
    42 |
    43 |
    44 |

    {% trans 'Available Custom Fields' %}

    45 |
    46 |
      47 | {% for custom_field in custom_fields %} 48 |
    • 49 |
      {{ custom_field.name }}
      50 |

      {{ custom_field.description }}

      51 |
    • 52 | {% empty %} 53 |
    • {% trans 'There are no custom fields.' %}
    • 54 | {% endfor %} 55 |
    56 |
    57 |
    58 |
    59 | {% endblock %} 60 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/settings/danger.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/settings/base_settings.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ application.name }} | {% trans 'Settings' %} | {% trans 'Danger Zone' %}{% endblock %} 6 | 7 | {% block settings_content %} 8 |
    9 |
    10 |

    {% trans 'Delete Application' %}

    11 |
    12 |
    13 |
    14 | {% csrf_token %} 15 |

    {% trans 'Once you delete an application, there is no going back. Please be certain.' %}

    16 | 17 |
    18 |
    19 |
    20 | {% endblock settings_content %} 21 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/settings/data_elements.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/settings/base_settings.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ application.name }} | {% trans 'Settings' %} | {% trans 'Data Elements' %}{% endblock %} 6 | 7 | {% block settings_content %} 8 |
    9 |
    10 |
    11 | {% csrf_token %} 12 |
    13 |
    14 |

    {% trans 'Data Elements' %}

    15 |
    16 |
    17 | {% include "boh/snippets/form/_general.html" with control=data_elements_form.data_elements %} 18 |
    19 | 22 |
    23 |
    24 | 25 | 26 |
    27 | {% csrf_token %} 28 |
    29 |
    30 |

    {% trans 'Override' %}

    31 |
    32 |
    33 | {% include "boh/snippets/form/_general.html" with control=dcl_override_form.override_dcl %} 34 | {% include "boh/snippets/form/_general.html" with control=dcl_override_form.override_reason %} 35 |
    36 | 39 |
    40 |
    41 | 42 |
    43 |
    44 | {% if application.override_dcl %} 45 | {% include "boh/snippets/application/_dcl.html" with dcl=application.override_dcl footer='Override' only %} 46 | {% endif %} 47 | {% include "boh/snippets/application/_dcl.html" with dcl=dcl footer=dsv %} 48 |
    49 |
    50 | 51 | {% endblock settings_content %} 52 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/settings/general.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/settings/base_settings.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ application.name }} | {% trans 'Settings' %} | {% trans 'General' %}{% endblock %} 6 | 7 | {% block settings_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'General Information' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=general_form.name %} 16 | {% include "boh/snippets/form/_markdown.html" with control=general_form.description %} 17 |
    18 | 21 |
    22 |
    23 | 24 |
    25 | {% csrf_token %} 26 |
    27 |
    28 |

    {% trans 'Change Organization' %}

    29 |
    30 |
    31 | {% include "boh/snippets/form/_general.html" with control=organization_form.organization %} 32 |
    33 | 36 |
    37 |
    38 | 39 |
    40 |
    41 |

    {% trans 'Features' %}

    42 |
    43 |
    44 | {% trans 'Nothing here yet.' %} 45 |
    46 |
    47 | {% endblock settings_content %} 48 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/settings/metadata.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/settings/base_settings.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ application.name }} | {% trans 'Settings' %} | {% trans 'Metadata' %}{% endblock %} 6 | 7 | {% block settings_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Metadata' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=metadata_form.business_criticality %} 16 | {% include "boh/snippets/form/_general.html" with control=metadata_form.platform %} 17 | {% include "boh/snippets/form/_general.html" with control=metadata_form.lifecycle %} 18 | {% include "boh/snippets/form/_general.html" with control=metadata_form.origin %} 19 | {% include "boh/snippets/form/_general.html" with control=metadata_form.user_records %} 20 | {% include "boh/snippets/form/_general.html" with control=metadata_form.revenue %} 21 | {% include "boh/snippets/form/_checkbox.html" with control=metadata_form.external_audience %} 22 | {% include "boh/snippets/form/_checkbox.html" with control=metadata_form.internet_accessible %} 23 |
    24 | 27 |
    28 |
    29 | 30 |
    31 | {% csrf_token %} 32 |
    33 |
    34 |

    {% trans 'Technologies' %}

    35 |
    36 |
    37 | {% include "boh/snippets/form/_general.html" with control=technologies_form.technologies %} 38 |
    39 | 42 |
    43 |
    44 | 45 |
    46 | {% csrf_token %} 47 |
    48 |
    49 |

    {% trans 'Regulations' %}

    50 |
    51 |
    52 | {% include "boh/snippets/form/_general.html" with control=regulations_form.regulations %} 53 |
    54 | 57 |
    58 |
    59 | 60 |
    61 | {% csrf_token %} 62 |
    63 |
    64 |

    {% trans 'Tags' %}

    65 |
    66 |
    67 | {% include "boh/snippets/form/_general.html" with control=tags_form.tags %} 68 |
    69 | 72 |
    73 |
    74 | {% endblock settings_content %} 75 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/settings/owasp_asvs.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/settings/base_settings.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ application.name }} | {% trans 'Settings' %} | {% trans 'OWASP ASVS Level' %}{% endblock %} 6 | 7 | {% block settings_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'OWASP ASVS' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=asvs_form.asvs_level %} 16 | {% include "boh/snippets/form/_general.html" with control=asvs_form.asvs_level_percent_achieved %} 17 | {% include "boh/snippets/form/_general.html" with control=asvs_form.asvs_doc_url %} 18 | {% include "boh/snippets/form/_general.html" with control=asvs_form.asvs_level_target %} 19 |
    20 | 23 |
    24 |
    25 | {% endblock settings_content %} 26 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/settings/service_level_agreements.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/settings/base_settings.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ application.name }} | {% trans 'Settings' %} | {% trans 'Service Level Agreements' %}{% endblock %} 6 | 7 | {% block settings_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Service Level Agreements' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=sla_form.service_level_agreements %} 16 |
    17 | 20 |
    21 |
    22 | {% endblock settings_content %} 23 | -------------------------------------------------------------------------------- /project/boh/templates/boh/application/settings/services.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/settings/base_settings.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ application.name }} | {% trans 'Settings' %} | {% trans 'Services' %}{% endblock %} 6 | 7 | {% block settings_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'ThreadFix' %}

    13 |
    14 |
    15 |

    {% trans 'ThreadFix is a software vulnerability aggregation and management system that helps organizations aggregate vulnerability data, generate virtual patches, and interact with software defect tracking systems.' %}

    16 | {% include "boh/snippets/form/_general.html" with control=threadfix_form.threadfix %} 17 | {% include "boh/snippets/form/_general.html" with control=threadfix_form.threadfix_team_id %} 18 | {% include "boh/snippets/form/_general.html" with control=threadfix_form.threadfix_application_id %} 19 |
    20 | 23 |
    24 |
    25 | {% endblock settings_content %} 26 | -------------------------------------------------------------------------------- /project/boh/templates/boh/dashboard/base_dashboard.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block content %} 6 | 17 | 18 | {% block dashboard_content %} 19 | {% endblock dashboard_content %} 20 | {% endblock content %} 21 | -------------------------------------------------------------------------------- /project/boh/templates/boh/dashboard/metrics.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/dashboard/base_dashboard.html" %} 2 | 3 | {% load i18n %} 4 | {% load widget_tweaks %} 5 | 6 | {% block title %}{% trans 'Metrics' %}{% endblock %} 7 | 8 | {% block dashboard_content %} 9 |
    10 |
    11 |
    12 |
    13 |
    14 | 15 |
    16 | {{ year_form.year|add_class:"form-control"|attr:"placeholder:Name" }} 17 |
    18 | 19 |
    20 |
    21 |
    22 |
    23 | 24 |
    25 |
    26 |
    27 |

    {% trans 'Engagements' %}

    28 |
    29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 |
    {% trans 'Pending' %}{{ engagement_stats.pending_count }}
    {% trans 'Open' %}{{ engagement_stats.open_count }}
    {% trans 'Closed' %}{{ engagement_stats.closed_count }}
    {% trans 'Total' %}{{ engagement_stats.total_count }}
    {% trans 'Average Length' %}{{ engagement_stats.average_duration }}
    53 |
    54 | 55 |
    56 |
    57 |

    {% trans 'Activities' %}

    58 |
    59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | {% for activity in activity_stats %} 72 | 73 | 74 | {{ activity.pending_count }} 75 | {{ activity.open_count }} 76 | {{ activity.closed_count }} 77 | {{ activity.total_count }} 78 | 79 | 80 | {% endfor %} 81 | 82 |
    {% trans 'Activity' %}{% trans 'Pending' %}{% trans 'Open' %}{% trans 'Closed' %}{% trans 'Total' %}{% trans 'Average Duration' %}
    {{ activity.name }}{% if activity.average_duration %}{{ activity.average_duration }}{% endif %}
    83 |
    84 |
    85 | 86 |
    87 | {% endblock dashboard_content %} 88 | -------------------------------------------------------------------------------- /project/boh/templates/boh/dashboard/my_dashboard.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/dashboard/base_dashboard.html" %} 2 | 3 | {% load i18n %} 4 | {% load humanize %} 5 | 6 | {% block title %}{% trans 'My Dashboard' %}{% endblock %} 7 | 8 | {% block dashboard_content %} 9 |
    10 |
    11 |
    12 |
    13 |

    {% trans 'My Open Activities' %}

    14 |
    15 |
    16 | {% for activity in open_activities %} 17 | {% include "boh/snippets/dashboard/_activity.html" with activity=activity %} 18 | {% empty %} 19 |
  • {% trans 'You have no open activities.' %}
  • 20 | {% endfor %} 21 |
    22 |
    23 |
    24 | 25 |
    26 |
    27 |
    28 |

    {% trans 'My Pending Activities' %}

    29 |
    30 |
    31 | {% for activity in pending_activities %} 32 | {% include "boh/snippets/dashboard/_activity.html" with activity=activity %} 33 | {% empty %} 34 |
  • {% trans 'You have no pending activities.' %}
  • 35 | {% endfor %} 36 |
    37 |
    38 |
    39 |
    40 | {% endblock dashboard_content %} 41 | -------------------------------------------------------------------------------- /project/boh/templates/boh/dashboard/reports.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/dashboard/base_dashboard.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Reports' %}{% endblock %} 6 | 7 | {% block dashboard_content %} 8 |
    9 |
    10 |
    11 | {% csrf_token %} 12 |
    13 |
    14 |

    {% trans 'Engagement Coverage Report' %}

    15 |
    16 |
    17 |

    {% trans "This report details the activities performed for each application's last engagement." %}

    18 |
    19 |
    20 | {% include "boh/snippets/form/_general.html" with control=ec_report_form.organizations %} 21 |
    22 |
    23 | {% include "boh/snippets/form/_general.html" with control=ec_report_form.format %} 24 |
    25 |
    26 |
    27 | 30 |
    31 |
    32 |
    33 |
    34 |
    35 | {% csrf_token %} 36 |
    37 |
    38 |

    {% trans 'ThreadFix Summary Report' %}

    39 |
    40 |
    41 |

    {% trans 'This report shows the ThreadFix vulnerability counts for each application.' %}

    42 |
    43 |
    44 | {% include "boh/snippets/form/_general.html" with control=tf_report_form.organizations %} 45 |
    46 |
    47 | {% include "boh/snippets/form/_general.html" with control=tf_report_form.format %} 48 |
    49 |
    50 |
    51 | 54 |
    55 |
    56 |
    57 |
    58 |
    59 |
    60 |
    61 | {% csrf_token %} 62 |
    63 |
    64 |

    {% trans 'Application Summary Report' %}

    65 |
    66 |
    67 |

    {% trans 'This report details all vulnerability and application meta data.' %}

    68 |
    69 |
    70 | {% include "boh/snippets/form/_general.html" with control=as_report_form.applications %} 71 |
    72 |
    73 | {% include "boh/snippets/form/_general.html" with control=as_report_form.format %} 74 |
    75 |
    76 |
    77 | 80 |
    81 |
    82 |
    83 | 84 | {% endblock dashboard_content %} 85 | -------------------------------------------------------------------------------- /project/boh/templates/boh/engagement/add.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/engagement/base_engagements.html" %} 2 | 3 | {% load i18n %} 4 | {% load staticfiles %} 5 | 6 | {% block title %}{{ application.name }} | {% trans 'New Engagement' %}{% endblock %} 7 | 8 | {% block css %} 9 | 10 | {% endblock css %} 11 | 12 | {% block engagement_breadcrumb %} 13 |
  • {% trans 'Engagements' %}
  • 14 |
  • {% trans 'New Engagement' %}
  • 15 | {% endblock engagement_breadcrumb %} 16 | 17 | {% block engagement_content %} 18 |
    19 |
    20 |
    21 | {% csrf_token %} 22 |
    23 |
    24 |

    {% trans 'New Engagement' %}

    25 |
    26 |
    27 |
    28 |
    29 |
    30 | {% include "boh/snippets/form/_general.html" with control=form.start_date %} 31 |
    32 |
    33 | {% include "boh/snippets/form/_general.html" with control=form.end_date %} 34 |
    35 |
    36 |
    37 | {% include "boh/snippets/form/_markdown.html" with control=form.description %} 38 | {% include "boh/snippets/form/_general.html" with control=form.requestor %} 39 |
    40 | 44 |
    45 |
    46 |
    47 |
    48 | 51 |
    52 |
    53 | {% endblock engagement_content %} 54 | 55 | {% block js %} 56 | 57 | 64 | {% endblock js %} 65 | -------------------------------------------------------------------------------- /project/boh/templates/boh/engagement/base_engagements.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/base_applications.html" %} 2 | 3 | {% block application_content %} 4 |
    5 |
    6 | 10 |
    11 |
    12 |
    13 | 14 | {% block engagement_content %} 15 | {% endblock engagement_content %} 16 | {% endblock application_content %} 17 | -------------------------------------------------------------------------------- /project/boh/templates/boh/engagement/edit.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/engagement/base_engagements.html" %} 2 | 3 | {% load i18n %} 4 | {% load staticfiles %} 5 | 6 | {% block title %}{{ application.name }} | {{ engagement.start_date }} - {{ engagement.end_date }} | {% trans 'Edit Engagement' %}{% endblock %} 7 | 8 | {% block css %} 9 | 10 | {% endblock css %} 11 | 12 | {% block engagement_breadcrumb %} 13 |
  • {% trans 'Engagements' %}
  • 14 |
  • {{ engagement.start_date }} - {{ engagement.end_date }}
  • 15 |
  • {% trans 'Edit Engagement' %}
  • 16 | {% endblock engagement_breadcrumb %} 17 | 18 | {% block engagement_content %} 19 |
    20 |
    21 |
    22 | {% csrf_token %} 23 |
    24 |
    25 |

    {% trans 'Edit Engagement' %}

    26 |
    27 |
    28 | {% include "boh/snippets/form/_general.html" with control=form.status %} 29 |
    30 |
    31 |
    32 | {% include "boh/snippets/form/_general.html" with control=form.start_date %} 33 |
    34 |
    35 | {% include "boh/snippets/form/_general.html" with control=form.end_date %} 36 |
    37 |
    38 |
    39 | {% include "boh/snippets/form/_markdown.html" with control=form.description %} 40 | {% include "boh/snippets/form/_general.html" with control=form.requestor %} 41 |
    42 | 46 |
    47 |
    48 |
    49 |
    50 | 53 |
    54 | {% csrf_token %} 55 | 56 |
    57 |
    58 |
    59 | {% endblock engagement_content %} 60 | 61 | {% block js %} 62 | 63 | 70 | {% endblock js %} 71 | -------------------------------------------------------------------------------- /project/boh/templates/boh/environment/add.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/environment/base_environments.html" %} 2 | 3 | {% load i18n %} 4 | {% block title %}{{ application.name }} | {% trans 'New Environment' %}{% endblock %} 5 | 6 | {% block environment_content %} 7 |
    8 |
    9 |
    10 | {% csrf_token %} 11 |
    12 |
    13 |

    {% trans 'New Environment' %}

    14 |
    15 |
    16 | {% include "boh/snippets/form/_general.html" with control=form.environment_type %} 17 | {% include "boh/snippets/form/_general.html" with control=form.description %} 18 | {% include "boh/snippets/form/_checkbox.html" with control=form.testing_approved %} 19 |
    20 | 24 |
    25 |
    26 |
    27 |
    28 | 31 |
    32 |
    33 | {% endblock environment_content %} 34 | -------------------------------------------------------------------------------- /project/boh/templates/boh/environment/base_environments.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/application/base_applications.html" %} 2 | 3 | {% block application_content %} 4 | {% block environment_content %} 5 | {% endblock environment_content %} 6 | {% endblock application_content %} 7 | -------------------------------------------------------------------------------- /project/boh/templates/boh/environment/edit/base_edit.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/environment/base_environments.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ application.name }} | {{ environment.get_environment_type_display }} {% trans 'Environment' %} | {% trans 'Edit Environment' %}{% endblock %} 6 | 7 | {% block environment_content %} 8 |
    9 |
    10 | 14 |
    15 |
    16 |
    17 | 18 |
    19 | 36 |
    37 | {% block edit_content %} 38 | {% endblock edit_content %} 39 |
    40 |
    41 | {% endblock environment_content %} 42 | -------------------------------------------------------------------------------- /project/boh/templates/boh/environment/edit/credentials.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/environment/edit/base_edit.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block edit_content %} 6 |
    7 | {% csrf_token %} 8 | {{ formset.management_form }} 9 |
    10 |
    11 | {% for form in formset.forms %} 12 |
    13 |
    14 | {% if not forloop.last and formset.can_delete %} 15 |
    16 | 19 |
    20 | {% endif %} 21 |

    {% if forloop.last %}{% trans 'Add' %}{% else %}{% trans 'Edit' %}{% endif %} {% trans 'Credentials' %}

    22 |
    23 |
    24 | {{ form.id }} 25 | {% include "boh/snippets/form/_general.html" with control=form.username %} 26 | {% include "boh/snippets/form/_general.html" with control=form.password %} 27 | {% include "boh/snippets/form/_general.html" with control=form.role_description %} 28 | {% include "boh/snippets/form/_general.html" with control=form.notes %} 29 |
    30 |
    31 | {% endfor %} 32 |
    33 | 36 |
    37 |
    38 | {% endblock edit_content %} 39 | -------------------------------------------------------------------------------- /project/boh/templates/boh/environment/edit/danger.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/environment/edit/base_edit.html" %} 2 | 3 | {% block edit_content %} 4 |
    5 |
    6 |

    Delete Environment

    7 |
    8 |
    9 |
    10 | {% csrf_token %} 11 |

    Once you delete this environment, there is no going back. Please be certain.

    12 | 13 |
    14 |
    15 |
    16 | {% endblock edit_content %} 17 | -------------------------------------------------------------------------------- /project/boh/templates/boh/environment/edit/general.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/environment/edit/base_edit.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block edit_content %} 6 |
    7 | {% csrf_token %} 8 |
    9 |
    10 |

    {% trans 'General Information' %}

    11 |
    12 |
    13 | {% include "boh/snippets/form/_general.html" with control=form.environment_type %} 14 | {% include "boh/snippets/form/_general.html" with control=form.description %} 15 | {% include "boh/snippets/form/_checkbox.html" with control=form.testing_approved %} 16 |
    17 | 20 |
    21 |
    22 | {% endblock edit_content %} 23 | -------------------------------------------------------------------------------- /project/boh/templates/boh/environment/edit/locations.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/environment/edit/base_edit.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block edit_content %} 6 |
    7 | {% csrf_token %} 8 | {{ formset.management_form }} 9 |
    10 |
    11 | {% for form in formset.forms %} 12 |
    13 |
    14 | {% if not forloop.last and formset.can_delete %} 15 |
    16 | 19 |
    20 | {% endif %} 21 |

    {% if forloop.last %}{% trans 'Add' %}{% else %}{% trans 'Edit' %}{% endif %} {% trans 'Location' %}

    22 |
    23 |
    24 | {{ form.id }} 25 | {% include "boh/snippets/form/_general.html" with control=form.location %} 26 | {% include "boh/snippets/form/_general.html" with control=form.notes %} 27 |
    28 |
    29 | {% endfor %} 30 |
    31 | 34 |
    35 |
    36 | {% endblock edit_content %} 37 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/activity_types/activity_types.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Activity Types' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 |
    10 |

    {% trans 'Activity Types' %}

    11 |
    12 |
      13 |
    • {% trans 'Activity types define what activities are and can contain documention for how that activity should be performed. The documentation will be visible on each activity of that type, making it a great place to include standard operating procedures, links, or anything else common amongst activities.' %}
    • 14 | {% if not activity_types %} 15 |
    • {% trans 'There are no activity types.' %}
    • 16 | {% endif %} 17 |
    18 | {% if activity_types %} 19 |
    20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | {% for activity_type in activity_types %} 31 | 32 | 33 | 34 | 35 | 36 | 37 | {% endfor %} 38 | 39 |
    {% trans 'Name' %}{% trans 'Documentation' %}{% trans 'Activities' %}{% trans 'Actions' %}
    {{ activity_type.name }}{% if activity_type.documentation %}{% trans 'View' %}{% endif %}{{ activity_type.activity_set.count }}{% trans 'Edit' %}
    40 |
    41 | {% endif %} 42 | 45 |
    46 | {% endblock manage_content %} 47 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/activity_types/add.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Activity Types' %} | {% trans 'Add' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Add Activity Type' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=activity_type_form.name %} 16 | {% include "boh/snippets/form/_markdown.html" with control=activity_type_form.documentation %} 17 |
    18 | 22 |
    23 |
    24 | {% endblock manage_content %} 25 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/activity_types/documentation.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | {% load markdown_render %} 5 | 6 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Activity Types' %} | {{ activity_type.name }} | {% trans 'Documentation' %}{% endblock %} 7 | 8 | {% block manage_content %} 9 |

    {{ activity_type.name }} {% trans 'Documentation' %}

    10 |
    11 | {{ activity_type.documentation|markdown_render }} 12 | {% endblock manage_content %} 13 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/activity_types/edit.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Activity Types' %} | {{ activity_type.name }} | {% trans 'Edit' %} {% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Edit Activity Type' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=activity_type_form.name %} 16 | {% include "boh/snippets/form/_markdown.html" with control=activity_type_form.documentation %} 17 |
    18 | 22 |
    23 |
    24 | 25 |
    26 | {% csrf_token %} 27 | 28 |
    29 | {% endblock manage_content %} 30 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/application_tags/add.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Application Tags' %} | {% trans 'Add' %} {% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Add Application Tag' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=add_form.name %} 16 | {% include "boh/snippets/form/_general.html" with control=add_form.description %} 17 |
    18 |
    19 | {% include "boh/snippets/form/_general.html" with control=add_form.color %} 20 |
    21 |
    22 | {% include "boh/snippets/management/tags/selectable_colors.html" %} 23 |
    24 |
    25 |
    26 | 30 |
    31 |
    32 | {% endblock manage_content %} 33 | 34 | {% block js %} 35 | 38 | {% endblock js %} 39 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/application_tags/application_tags.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Application Tags' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 |
    10 |

    {% trans 'Application Tags' %}

    11 |
    12 |
      13 |
    • {% trans 'Application tags allow for the abstract categorization and grouping of applications. Create tags to fit your goals, priorities, or anything else.' %}
    • 14 | {% if not tags %} 15 |
    • {% trans 'There are no application tags.' %}
    • 16 | {% endif %} 17 |
    18 | {% if tags %} 19 |
    20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | {% for tag in tags %} 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | {% endfor %} 40 | 41 |
    {% trans 'Name' %}{% trans 'Description' %}{% trans 'Color' %}{% trans 'Tagged' %}{% trans 'Actions' %}
    {{ tag.name }}{{ tag.description }}#{{ tag.color }}{{ tag.application_set.count }}{% trans 'Edit' %}
    42 |
    43 | {% endif %} 44 | 47 |
    48 | {% endblock manage_content %} 49 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/application_tags/edit.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Application Tags' %} | {{ tag.name }} | {% trans 'Edit' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Edit Application Tag' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=edit_form.name %} 16 | {% include "boh/snippets/form/_general.html" with control=edit_form.description %} 17 |
    18 |
    19 | {% include "boh/snippets/form/_general.html" with control=edit_form.color %} 20 |
    21 |
    22 | {% include "boh/snippets/management/tags/selectable_colors.html" %} 23 |
    24 |
    25 |
    26 | 30 |
    31 |
    32 | 33 |
    34 | {% csrf_token %} 35 | 36 |
    37 | 38 | {% endblock manage_content %} 39 | 40 | {% block js %} 41 | 44 | {% endblock js %} 45 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/base_management.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Management Settings' %}{% endblock %} 6 | 7 | {% block content %} 8 |
    9 | 31 |
    32 | {% block manage_content %} 33 | {% endblock manage_content %} 34 |
    35 |
    36 | {% endblock content %} 37 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/data_elements/add.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Data Elements' %} | {% trans 'Add' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Add Data Element' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=data_element_form.name %} 16 | {% include "boh/snippets/form/_general.html" with control=data_element_form.category %} 17 | {% include "boh/snippets/form/_general.html" with control=data_element_form.description %} 18 | {% include "boh/snippets/form/_general.html" with control=data_element_form.weight %} 19 |
    20 | 24 |
    25 |
    26 | {% endblock manage_content %} 27 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/data_elements/data_elements.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Data Elements' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 |
    10 |

    {% trans 'Data Elements' %}

    11 |
    12 |
      13 |
    • {% trans 'Data elements are a taxonomy of data assets that are processed by an application, the weights are used to calculate a risk score. Create additional types to match your business processing needs.' %}
    • 14 | {% if not data_elements %} 15 |
    • {% trans 'There are no data elements.' %}
    • 16 | {% endif %} 17 |
    18 | {% if data_elements %} 19 |
    20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | {% for data_element in data_elements %} 31 | 32 | 33 | 34 | 35 | 36 | 37 | {% endfor %} 38 | 39 |
    {% trans 'Name' %}{% trans 'Weight' %}{% trans 'Category' %}{% trans 'Actions' %}
    {{ data_element.name }}{{ data_element.weight }}{{ data_element.category }}{% trans 'Edit' %}
    40 |
    41 | {% endif %} 42 | 45 |
    46 | {% endblock manage_content %} 47 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/data_elements/edit.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Data Elements' %} | {{ data_element.name }} | {% trans 'Edit' %} {% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Edit Data Element' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=data_element_form.name %} 16 | {% include "boh/snippets/form/_general.html" with control=data_element_form.category %} 17 | {% include "boh/snippets/form/_general.html" with control=data_element_form.description %} 18 | {% include "boh/snippets/form/_general.html" with control=data_element_form.weight %} 19 |
    20 | 24 |
    25 |
    26 | 27 |
    28 | {% csrf_token %} 29 | 30 |
    31 | {% endblock manage_content %} 32 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/overview.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Overview' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |

    {% trans 'Manage Settings Overview' %}

    9 |

    {% trans 'Here you will find all the options for configuring and customizing Bag of Holding.' %}

    10 | 11 |
    12 | 13 |
    14 | 22 |
    23 |

    {% trans 'Application Tags' %}

    24 | {% trans 'Application tags allow for the abstract categorization and grouping of applications. Create tags to fit your goals, priorities, or anything else.' %} 25 |
    26 |
    27 | 28 | 29 |
    30 | 38 |
    39 |

    {% trans 'Activity Types' %}

    40 | {% trans 'Activity types define what activities are and can contain documention for how that activity should be performed. The documentation will be visible on each activity of that type, making it a great place to include standard operating procedures, links, or anything else common amongst activities.' %} 41 |
    42 |
    43 | 44 | 45 |
    46 | 54 |
    55 |

    {% trans 'Third Party Services' %}

    56 | {% trans 'Bag of Holding is able to connect to outside services to push or pull information. You can configure these services here.' %}
    57 |
    58 |
    59 | 60 | 61 |
    62 | 70 |
    71 |

    {% trans 'Django Admin' %}

    72 | {% trans 'This is a web-based interface, limited to trusted site administrators, that enables the adding, editing and deletion of site content.' %} 73 |
    74 |
    75 | {% endblock manage_content %} 76 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/service_level_agreements/add.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Service Level Agreements' %} | {% trans 'Add' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Add Service Level Agreement' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=service_level_agreement_form.name %} 16 | {% include "boh/snippets/form/_general.html" with control=service_level_agreement_form.description %} 17 |
    18 | 22 |
    23 |
    24 | {% endblock manage_content %} 25 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/service_level_agreements/edit.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Data Elements' %} | {{ service_level_agreement.name }} | {% trans 'Edit' %} {% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Edit Data Element' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=service_level_agreement_form.name %} 16 | {% include "boh/snippets/form/_general.html" with control=service_level_agreement_form.category %} 17 | {% include "boh/snippets/form/_general.html" with control=service_level_agreement_form.description %} 18 | {% include "boh/snippets/form/_general.html" with control=service_level_agreement_form.weight %} 19 |
    20 | 24 |
    25 |
    26 | 27 |
    28 | {% csrf_token %} 29 | 30 |
    31 | {% endblock manage_content %} 32 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/service_level_agreements/service_level_agreements.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Service Level Agreements' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 |
    10 |

    {% trans 'Service Level Agreements' %}

    11 |
    12 |
      13 |
    • {% trans 'Service level agreements are either internal or external commitments regarding the service.' %}
    • 14 | {% if not service_level_agreements %} 15 |
    • {% trans 'There are no service level agreements.' %}
    • 16 | {% endif %} 17 |
    18 | {% if service_level_agreements %} 19 |
    20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | {% for service_level_agreement in service_level_agreements %} 30 | 31 | 32 | 33 | 34 | 35 | {% endfor %} 36 | 37 |
    {% trans 'Name' %}{% trans 'Description' %}{% trans 'Actions' %}
    {{ service_level_agreement.name }}{{ service_level_agreement.description }}{% trans 'Edit' %}
    38 |
    39 | {% endif %} 40 | 43 |
    44 | {% endblock manage_content %} 45 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/services.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %}| {% trans 'Services' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 |
    10 |

    {% trans 'ThreadFix Services' %}

    11 |
    12 |
      13 |
    • {% trans 'ThreadFix is a software vulnerability aggregation and management system that helps organizations aggregate vulnerability data, generate virtual patches, and interact with software defect tracking systems.' %}
    • 14 | {% if not threadfix_services %} 15 |
    • {% trans 'There are no ThreadFix services.' %}
    • 16 | {% endif %} 17 |
    18 | {% if threadfix_services %} 19 |
    20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | {% for threadfix in threadfix_services %} 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | {% endfor %} 40 | 41 |
    {% trans 'Name' %}{% trans 'Host' %}{% trans 'Verify SSL' %}{% trans 'Actions' %}
    {{ threadfix.name }}{{ threadfix.host }} {% if threadfix.verify_ssl %}{% else %}{% endif %} {% trans 'Edit' %} {% trans 'Test' %} {% trans 'Import' %}
    42 |
    43 | {% endif %} 44 | 45 |
    46 | {% endblock manage_content %} 47 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/threadfix/add.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Services' %} | {% trans 'Add ThreadFix Service' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Add ThreadFix Service' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=threadfix_form.name %} 16 | {% include "boh/snippets/form/_general.html" with control=threadfix_form.host %} 17 | {% include "boh/snippets/form/_general.html" with control=threadfix_form.api_key %} 18 | {% include "boh/snippets/form/_checkbox.html" with control=threadfix_form.verify_ssl %} 19 |
    20 | 24 |
    25 |
    26 | {% endblock manage_content %} 27 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/threadfix/edit.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Services' %} | {% trans 'Edit' %} {{ threadfix.name }}{% endblock %} 5 | 6 | {% block manage_content %} 7 |
    8 | {% csrf_token %} 9 |
    10 |
    11 |

    {% trans 'Edit ThreadFix Service' %}

    12 |
    13 |
    14 | {% include "boh/snippets/form/_general.html" with control=threadfix_form.name %} 15 | {% include "boh/snippets/form/_general.html" with control=threadfix_form.host %} 16 | {% include "boh/snippets/form/_general.html" with control=threadfix_form.api_key %} 17 | {% include "boh/snippets/form/_checkbox.html" with control=threadfix_form.verify_ssl %} 18 |
    19 | 23 |
    24 |
    25 |
    26 | {% csrf_token %} 27 | 28 |
    29 | {% endblock manage_content %} 30 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/threadfix/import.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | {% load widget_tweaks %} 5 | 6 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Services' %} | {% trans 'Import' %} {{ threadfix.name }}{% endblock %} 7 | 8 | {% block manage_content %} 9 |
    10 | {% csrf_token %} 11 | {{ import_formset.management_form }} 12 |
    13 |
    14 |

    {% trans 'Import from' %} {{ threadfix.name }}

    15 |
    16 |
    17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | {% for form in import_formset.forms %} 27 | {{ form.id }} 28 | {{ form.team_id }} 29 | {{ form.application_id }} 30 | {{ form.team_name }} 31 | 32 | 33 | 34 | 35 | 36 | {% endfor %} 37 | 38 |
    {% trans 'Team' %}{% trans 'Application Name' %}{% trans 'Target Organization' %}

    {{ form.team_name.value }}

    {{ form.application_name | add_class:"form-control" }}{{ form.organization | add_class:"form-control" }}
    39 |
    40 | 41 |
    42 |
    43 | {% endblock manage_content %} 44 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/threadfix/import_done.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Services' %} | {% trans 'Import' %} {{ threadfix.name }}{% endblock %} 6 | 7 | {% block manage_content %} 8 | {% if imported_applications %} 9 |
    10 |
    11 |

    {% trans 'Successfully Imported Applications' %}

    12 |
    13 | 18 |
    19 | {% endif %} 20 | {% if failed_applications %} 21 |
    22 |
    23 |

    {% trans 'Application Import Failures' %}

    24 |
    25 |
    26 | {% trans 'The following application imports failed. Check to make sure the names are not already taken.' %} 27 |
    28 |
      29 | {% for application in failed_applications %} 30 |
    • {{ application.name }}
    • 31 | {% endfor %} 32 |
    33 |
    34 | {% endif %} 35 | {% endblock manage_content %} 36 | -------------------------------------------------------------------------------- /project/boh/templates/boh/management/users.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/management/base_management.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Manage Settings' %} | {% trans 'Users' %}{% endblock %} 6 | 7 | {% block manage_content %} 8 |
    9 |
    10 |

    {% trans 'Users' %}

    11 |
    12 |
    13 | {% trans 'Nothing here yet' %}... 14 |
    15 |
    16 | {% endblock manage_content %} 17 | -------------------------------------------------------------------------------- /project/boh/templates/boh/organization/add.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Add Organization' %}{% endblock %} 6 | 7 | {% block content %} 8 |
    9 |
    10 |
    11 | {% csrf_token %} 12 |
    13 |
    14 |

    {% trans 'Add Organization' %}

    15 |
    16 |
    17 | {% include "boh/snippets/form/_general.html" with control=form.name %} 18 | {% include "boh/snippets/form/_markdown.html" with control=form.description %} 19 |
    20 | 24 |
    25 |
    26 |
    27 |
    28 | {% endblock %} 29 | -------------------------------------------------------------------------------- /project/boh/templates/boh/organization/applications.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/organization/base_organizations.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ organization.name }} | {% trans 'Applications' %}{% endblock %} 6 | 7 | {% block organization_content %} 8 | 34 | {% endblock organization_content %} 35 | -------------------------------------------------------------------------------- /project/boh/templates/boh/organization/base_organizations.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block content %} 6 | 17 | 18 | {% block organization_content %} 19 | {% endblock organization_content %} 20 | {% endblock content %} 21 | -------------------------------------------------------------------------------- /project/boh/templates/boh/organization/overview.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/organization/base_organizations.html" %} 2 | 3 | {% load i18n %} 4 | {% load markdown_render %} 5 | 6 | {% block title %}{{ organization.name }}{% endblock %} 7 | 8 | {% block organization_content %} 9 |
    10 |
    11 | {% if organization.description %}{{ organization.description|markdown_render }}{% else %}{% trans 'There is no description for this organization.' %}{% endif %} 12 |
    13 |
    14 | 15 | {% endblock organization_content %} 16 | -------------------------------------------------------------------------------- /project/boh/templates/boh/organization/people.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/organization/base_organizations.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ organization.name }} | {% trans 'People' %}{% endblock %} 6 | 7 | {% block organization_content %} 8 |
    9 |
    10 |

    {% trans 'Select a role to view associated people' %}:

    11 | {% regroup organization.people.all|dictsort:"get_role_display" by get_role_display as person_list_by_role %} 12 | 13 |
    14 | {% for person_list in person_list_by_role %} 15 |
    16 | 21 |
    22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | {% for person in person_list.list %} 32 | 33 | 34 | 35 | 36 | 37 | {% endfor %} 38 | 39 |
    {% trans 'Name' %}{% trans 'Title' %}{% trans 'Email' %}
    {{ person.first_name }} {{ person.last_name }}{{ person.job_title }}{{ person.email }}
    40 |
    41 |
    42 | {% endfor %} 43 |
    44 | 45 |
    46 |
    47 | 50 |
    51 |
    52 | {% endblock organization_content %} 53 | -------------------------------------------------------------------------------- /project/boh/templates/boh/organization/settings/base_settings.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/organization/base_organizations.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block organization_content %} 6 |
    7 |
    8 |
    9 |
    10 |

    {% trans 'Organization Settings' %}

    11 |
    12 | 16 |
    17 |
    18 | 21 |
    22 |
    23 |
    24 | {% block settings_content %} 25 | {% endblock settings_content %} 26 |
    27 |
    28 | {% endblock organization_content %} 29 | -------------------------------------------------------------------------------- /project/boh/templates/boh/organization/settings/danger.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/organization/settings/base_settings.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ organization.name }} | {% trans 'Settings' %} | {% trans 'Danger Zone' %}{% endblock %} 6 | 7 | {% block settings_content %} 8 |
    9 |
    10 |

    {% trans 'Delete Organization' %}

    11 |
    12 |
    13 |
    14 | {% csrf_token %} 15 |

    {% trans 'Once you delete an organization, there is no going back. Please be certain.' %}

    16 | 17 |
    18 |
    19 |
    20 | {% endblock settings_content %} 21 | -------------------------------------------------------------------------------- /project/boh/templates/boh/organization/settings/general.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/organization/settings/base_settings.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ organization.name }} | {% trans 'Settings' %} | {% trans 'General' %}{% endblock %} 6 | 7 | {% block settings_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'General Information' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=form.name %} 16 | {% include "boh/snippets/form/_markdown.html" with control=form.description %} 17 |
    18 | 21 |
    22 |
    23 | {% endblock settings_content %} 24 | -------------------------------------------------------------------------------- /project/boh/templates/boh/organization/settings/people.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/organization/settings/base_settings.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ organization.name }} | {% trans 'Settings' %} | {% trans 'People' %}{% endblock %} 6 | 7 | {% block settings_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Related People' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=people_form.people %} 16 |
    17 | 20 |
    21 |
    22 | {% endblock settings_content %} 23 | -------------------------------------------------------------------------------- /project/boh/templates/boh/person/add.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Add Person' %}{% endblock %} 6 | 7 | {% block content %} 8 |
    9 |
    10 |
    11 | {% csrf_token %} 12 |
    13 |
    14 |

    {% trans 'Add Person' %}

    15 |
    16 |
    17 | {% include "boh/snippets/form/_general.html" with control=form.first_name %} 18 | {% include "boh/snippets/form/_general.html" with control=form.last_name %} 19 | {% include "boh/snippets/form/_general.html" with control=form.email %} 20 | {% include "boh/snippets/form/_general.html" with control=form.phone_work %} 21 | {% include "boh/snippets/form/_general.html" with control=form.phone_mobile %} 22 | {% include "boh/snippets/form/_general.html" with control=form.job_title %} 23 | {% include "boh/snippets/form/_general.html" with control=form.role %} 24 |
    25 | 29 |
    30 |
    31 |
    32 |
    33 | {% endblock content %} 34 | -------------------------------------------------------------------------------- /project/boh/templates/boh/person/base_person.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | 4 | {% block content %} 5 |
    6 |
    7 |

    {{ person.first_name }} {{ person.last_name }}{% if person.job_title %}{% endif %}

    8 |
    9 |
    10 |
    11 | {% block person_content %} 12 | {% endblock person_content %} 13 | {% endblock content %} 14 | -------------------------------------------------------------------------------- /project/boh/templates/boh/person/edit.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/person/base_person.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{{ person.first_name }} {{ person.last_name }} | {% trans 'Edit' %}{% endblock %} 6 | 7 | {% block person_content %} 8 |
    9 |
    10 |
    11 | {% csrf_token %} 12 |
    13 |
    14 |

    {% trans 'Edit' %} {{ person.first_name }} {{ person.last_name }}

    15 |
    16 |
    17 | {% include "boh/snippets/form/_general.html" with control=form.first_name %} 18 | {% include "boh/snippets/form/_general.html" with control=form.last_name %} 19 | {% include "boh/snippets/form/_general.html" with control=form.email %} 20 | {% include "boh/snippets/form/_general.html" with control=form.phone_work %} 21 | {% include "boh/snippets/form/_general.html" with control=form.phone_mobile %} 22 | {% include "boh/snippets/form/_general.html" with control=form.job_title %} 23 | {% include "boh/snippets/form/_general.html" with control=form.role %} 24 |
    25 | 29 |
    30 |
    31 |
    32 |
    33 |
    34 | {% csrf_token %} 35 | 36 |
    37 |
    38 |
    39 | {% endblock person_content %} 40 | -------------------------------------------------------------------------------- /project/boh/templates/boh/person/list.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'People' %}{% endblock %} 6 | 7 | {% block content %} 8 |
    9 |
    10 |
    11 | 18 |
    19 | {% trans 'Add Person' %} 20 |
    21 |
    22 | 23 |
    24 | 25 |
    26 |
    27 |
    28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | {% for person in people %} 39 | 40 | 41 | 42 | 43 | 44 | 45 | {% endfor %} 46 | 47 |
    {% trans 'Name' %}{% trans 'Title' %}{% trans 'Email' %}{% trans 'Role' %}
    {{ person.last_name }}, {{ person.first_name }} {{ person.job_title }}{{ person.email }}{{ person.get_role_display }}
    48 |
    49 |
    50 |
    51 | 52 | {% endblock %} 53 | -------------------------------------------------------------------------------- /project/boh/templates/boh/reports/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {% block title %}Report{% endblock %} 9 | 10 | 14 | 15 | 16 |
    17 | {% block content %}{% endblock %} 18 |
    19 | 20 | 21 | -------------------------------------------------------------------------------- /project/boh/templates/boh/reports/engagement_coverage.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/reports/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Engagement Coverage Report' %} | {{ current_datetime|date:"SHORT_DATE_FORMAT" }}{% endblock %} 6 | 7 | {% block content %} 8 | 11 |

    {% trans 'Created' %} {{ current_datetime|date:"l, F d, Y" }} {% trans 'by' %} {{ requester.get_full_name }} <{{ requester.email }}>

    12 | {% for organization in organizations %} 13 |

    {{ organization.name }}

    14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | {% for application in organization.application_set.all %} 26 | {% with engagement=application.engagement_set.latest %} 27 | 28 | 29 | 30 | 31 | 32 | 35 | 36 | {% endwith %} 37 | {% endfor %} 38 | 39 |
    {% trans 'Application Name' %}{% trans 'Criticality' %}{% trans 'Last Engagement' %}{% trans 'Elapsed' %}{% trans 'Activities' %}
    {{ application.name }}{{ application.get_business_criticality_display }}{{ engagement.end_date }}{{ engagement.end_date|timesince }} 33 | {% for activity in engagement.activity_set.all %}{% if not forloop.first %}, {% endif %}{{ activity.activity_type }}{% endfor %} 34 |
    40 | {% endfor %} 41 | {% endblock %} 42 | -------------------------------------------------------------------------------- /project/boh/templates/boh/reports/threadfix_summary.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/reports/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'ThreadFix Summary Report' %} | {{ current_datetime|date:"SHORT_DATE_FORMAT" }}{% endblock %} 6 | 7 | {% block content %} 8 | 11 |

    {% trans 'Created' %} {{ current_datetime|date:"l, F d, Y" }} {% trans 'by' %} {{ requester.get_full_name }} <{{ requester.email }}>

    12 | {% for organization in organizations %} 13 |

    {{ organization.name }}

    14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | {% for application in organization.application_set.all %} 29 | {% with metrics=application.threadfixmetrics_set.latest %} 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | {% endwith %} 41 | {% endfor %} 42 | 43 |
    {% trans 'Application Name' %}{% trans 'Critical' %}{% trans 'High' %}{% trans 'Medium' %}{% trans 'Low' %}{% trans 'Info' %}{% trans 'Total' %}{% trans 'Updated' %}
    {{ application.name }}{{ metrics.critical_count }}{{ metrics.high_count }}{{ metrics.medium_count }}{{ metrics.low_count }}{{ metrics.informational_count }}{{ metrics.total }}{{ metrics.created_date|date:"SHORT_DATE_FORMAT" }}
    44 | {% endfor %} 45 | {% endblock %} 46 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/application/_dcl.html: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/application/_engagement.html: -------------------------------------------------------------------------------- 1 | {% load boh_humanize %} 2 | {% load i18n %} 3 | 4 | {% if engagement.comment_count %} 5 | {{ engagement.comment_count }} 6 | {% endif %} 7 |

    8 | {% if engagement.start_date == engagement.end_date %} 9 | {{ engagement.start_date|date:"M. j, Y" }} 10 | {% else %} 11 | {{ engagement.start_date|date:"M. j, Y" }} - {{ engagement.end_date|date:"M. j, Y" }} ({{ engagement.start_date|timesince:engagement.end_date }}) 12 | {% endif %} 13 |

    14 | 15 |

    16 | {% if engagement.activity_set.all %} 17 | {% for activity in engagement.activity_set.all %} 18 | {% include "boh/snippets/common/_activity_label.html" with activity=activity %} 19 | {% endfor %} 20 | {% else %} 21 | {% trans 'No activities for this engagement' %} 22 | {% endif %} 23 |

    24 |
    25 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/common/_activity_label.html: -------------------------------------------------------------------------------- 1 | {% with user_count=activity.user_count %} 2 | 3 | {% endwith %} 4 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/common/tag_label.html: -------------------------------------------------------------------------------- 1 | {{ tag.name }} 2 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/dashboard/_activity.html: -------------------------------------------------------------------------------- 1 | {% load boh_humanize %} 2 | 3 | 4 | {% if activity.comment_count %} 5 | 6 | {% endif %} 7 | 8 |

    {{ activity.activity_type.name }}

    9 |

    10 | {% if activity.engagement.start_date == activity.engagement.end_date %} 11 | {{ activity.engagement.start_date|date:"M. j" }} 12 | {% else %} 13 | {{ activity.engagement.start_date|date:"M. j" }} - {{ activity.engagement.end_date|date:"M. j" }} 14 | {% endif %} 15 |

    16 |
    17 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/dashboard/_engagement.html: -------------------------------------------------------------------------------- 1 | {% load boh_humanize %} 2 | {% load i18n %} 3 | 4 | 5 | {% if engagement.comment_count %} 6 | 7 | {% endif %} 8 | 9 |

    10 | {% if engagement.start_date == engagement.end_date %} 11 | {{ engagement.start_date|date:"M. j" }} 12 | {% else %} 13 | {{ engagement.start_date|date:"M. j" }} - {{ engagement.end_date|date:"M. j" }} ({{ engagement.start_date|timesince:engagement.end_date }}) 14 | {% endif %} 15 | 16 |

    17 |

    18 | {% for activity in engagement.activity_set.all %} 19 | {% include "boh/snippets/common/_activity_label.html" with activity=activity %} 20 | {% empty %} 21 | {% trans 'No activities for this engagement' %} 22 | {% endfor %} 23 |

    24 |
    25 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/engagement/_activity.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 | {% with comment_count=activity.activitycomment_set.count %} 4 | {% if comment_count %} 5 | {{ comment_count }} 6 | {% endif %} 7 | {% endwith %} 8 |

    {{ activity.activity_type.name }}

    9 |

    10 | {% for user in activity.users.all %} 11 | {% if user.first_name and user.last_name %}{{ user.first_name }} {{ user.last_name }}{% else %}{{ user }}{% endif %} 12 | {% empty %} 13 | {% trans 'No users have been assigned to this activity' %} 14 | {% endfor %} 15 |

    16 |
    17 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/form/_checkbox.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% if control.errors %}
    {% endif %} 3 |
    4 |
    5 | 9 |
    10 | {% if control.help_text %}

    {{ control.help_text }}

    {% endif %} 11 |
    12 | {% if control.errors %}
    {% endif %} 13 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/form/_general.html: -------------------------------------------------------------------------------- 1 | {% load widget_tweaks %} 2 |
    3 | 4 | {{ control | add_class:"form-control" }} 5 | {% if control.errors %} 6 | {% for error in control.errors %} 7 |

    {{ error }}

    8 | {% endfor %} 9 | {% endif %} 10 | {% if control.help_text %}

    {{ control.help_text }}

    {% endif %} 11 |
    12 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/form/_markdown.html: -------------------------------------------------------------------------------- 1 | {% load widget_tweaks %} 2 |
    3 | 4 | {{ control | add_class:"form-control" | add_class:"markdown" }} 5 | {% if control.errors %} 6 | {% for error in control.errors %} 7 |

    {{ error }}

    8 | {% endfor %} 9 | {% endif %} 10 | {% if control.help_text %}

    {{ control.help_text }}

    {% endif %} 11 |
    12 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/management/tags/selectable_colors.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% trans 'Click to apply presets' %}:
    3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /project/boh/templates/boh/snippets/management/tags/selectable_colors.js: -------------------------------------------------------------------------------- 1 | var hexDigits = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"); 2 | 3 | //Function to convert hex format to a rgb color 4 | function rgb2hex(rgb) { 5 | rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); 6 | return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); 7 | } 8 | 9 | function hex(x) { 10 | return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16]; 11 | } 12 | 13 | $(function () { 14 | $('.selectable-color').on('click', function() { 15 | $('#id_color').val(rgb2hex($(this).css('color'))); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /project/boh/templates/boh/user/base_user.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block content %} 6 |
    7 |
    8 |
    9 |
    10 |

    {% trans 'Account Settings' %}

    11 |
    12 | 16 |
    17 |
    18 |
    19 | {% block user_content %} 20 | {% endblock user_content %} 21 |
    22 |
    23 | {% endblock content %} 24 | -------------------------------------------------------------------------------- /project/boh/templates/boh/user/change_password.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/user/base_user.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Change Password' %}{% endblock %} 6 | 7 | {% block user_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'Change Password' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=password_form.old_password %} 16 | {% include "boh/snippets/form/_general.html" with control=password_form.new_password1 %} 17 | {% include "boh/snippets/form/_general.html" with control=password_form.new_password2 %} 18 |
    19 | 23 |
    24 |
    25 | {% endblock user_content %} 26 | -------------------------------------------------------------------------------- /project/boh/templates/boh/user/profile.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/user/base_user.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'User Profile' %}{% endblock %} 6 | 7 | {% block user_content %} 8 |
    9 | {% csrf_token %} 10 |
    11 |
    12 |

    {% trans 'My Profile' %}

    13 |
    14 |
    15 | {% include "boh/snippets/form/_general.html" with control=profile_form.username %} 16 |
    17 | {% include "boh/snippets/form/_general.html" with control=profile_form.first_name %} 18 | {% include "boh/snippets/form/_general.html" with control=profile_form.last_name %} 19 | {% include "boh/snippets/form/_general.html" with control=profile_form.email %} 20 |
    21 | 25 |
    26 |
    27 | 28 | {{ user_form }} 29 | {% endblock user_content %} 30 | -------------------------------------------------------------------------------- /project/boh/templates/registration/logged_out.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Logout' %}{% endblock %} 6 | 7 | {% block content %} 8 |
    9 |
    10 | 13 |
    14 |
    15 | 16 |
    17 |
    18 |

    {% trans 'You have successfully logged out.' %}

    19 |
    20 | 23 |
    24 | {% endblock %} 25 | -------------------------------------------------------------------------------- /project/boh/templates/registration/login.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | {% load i18n %} 4 | {% load staticfiles %} 5 | {% load widget_tweaks %} 6 | 7 | {% block title %}Login{% endblock %} 8 | 9 | {% block content %} 10 |
    11 |
    12 | 15 |
    16 |
    17 | 18 |
    19 |
    20 | 23 |
    24 |
    25 | {% if form.errors %}{% endif %} 26 |
    27 |
    28 |
    29 | {% csrf_token %} 30 | 31 |
    32 | 33 |
    34 |
    35 | {{ form.username | add_class:"form-control" | add_class:"input-lg" | attr:"placeholder:Username" | attr:"autofocus" }} 36 |
    37 |
    38 |
    39 | 40 |
    41 |
    42 | {{ form.password | add_class:"form-control" | add_class:"input-lg" | attr:"placeholder:Password" }} 43 |
    44 |
    45 | 46 |
    47 |
    48 |
    49 |
    50 |
    51 | {% endblock %} 52 | 53 | {% block js %} 54 | 71 | {% endblock js %} 72 | -------------------------------------------------------------------------------- /project/boh/templates/registration/password_change_done.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Change Password' %}{% endblock %} 6 | 7 | {% block content %} 8 |
    9 |
    10 |
    11 |
    {% trans 'Well done!' %}
    12 |
    13 | {% trans 'You have successfully changed your password.' %} 14 |
    15 |
    16 |
    17 |
    18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /project/boh/templates/registration/password_change_form.html: -------------------------------------------------------------------------------- 1 | {% extends "boh/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block title %}{% trans 'Change Password' %}{% endblock %} 6 | 7 | {% block content %} 8 |
    9 |
    10 |
    11 | {% csrf_token %} 12 |
    13 |
    14 |

    {% trans 'Change Password' %}

    15 |
    16 |
    17 | {% include "boh/snippets/form/_general.html" with control=form.old_password %} 18 | {% include "boh/snippets/form/_general.html" with control=form.new_password1 %} 19 | {% include "boh/snippets/form/_general.html" with control=form.new_password2 %} 20 |
    21 | 25 |
    26 |
    27 |
    28 |
    29 | {% endblock %} 30 | -------------------------------------------------------------------------------- /project/boh/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh/templatetags/__init__.py -------------------------------------------------------------------------------- /project/boh/templatetags/boh_humanize.py: -------------------------------------------------------------------------------- 1 | from datetime import date 2 | 3 | from django import template 4 | from django.utils.timesince import timesince, timeuntil 5 | 6 | register = template.Library() 7 | 8 | 9 | @register.filter(name='humanize_date') 10 | def humanize_date(value): 11 | today = date.today() 12 | try: 13 | if value > today: 14 | return 'In ' + timeuntil(value) 15 | elif value < today: 16 | return timesince(value) + ' ago' 17 | else: 18 | return 'Today' 19 | except (ValueError, TypeError): 20 | return '' 21 | -------------------------------------------------------------------------------- /project/boh/templatetags/boh_tags.py: -------------------------------------------------------------------------------- 1 | import phonenumbers 2 | 3 | from django import template 4 | 5 | register = template.Library() 6 | 7 | 8 | @register.filter(name='format_phone') 9 | def format_phone(value): 10 | if value: 11 | number = phonenumbers.parse(value, 'US') 12 | return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.INTERNATIONAL) 13 | else: 14 | return '' 15 | -------------------------------------------------------------------------------- /project/boh/templatetags/icon_filters.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.utils.safestring import mark_safe 3 | 4 | from ..models import Application 5 | 6 | 7 | register = template.Library() 8 | 9 | 10 | def icon(name, tooltip): 11 | return '' 12 | 13 | 14 | def not_specified_icon(tooltip): 15 | return '' 16 | 17 | 18 | def stars(filled, total, tooltip): 19 | code = '' 20 | for i in range(0, total): 21 | if i < filled: 22 | code += '' 23 | else: 24 | code += '' 25 | code += '' 26 | return code 27 | 28 | @register.filter 29 | def business_criticality_icon(value): 30 | if value == Application.VERY_HIGH_CRITICALITY: 31 | return mark_safe(stars(5, 5, 'Very High')) 32 | if value == Application.HIGH_CRITICALITY: 33 | return mark_safe(stars(4, 5, 'High')) 34 | if value == Application.MEDIUM_CRITICALITY: 35 | return mark_safe(stars(3, 5, 'Medium')) 36 | if value == Application.LOW_CRITICALITY: 37 | return mark_safe(stars(2, 5, 'Low')) 38 | if value == Application.VERY_LOW_CRITICALITY: 39 | return mark_safe(stars(1, 5, 'Very Low')) 40 | if value == Application.NONE_CRITICALITY: 41 | return mark_safe(stars(0, 5, 'None')) 42 | else: 43 | return mark_safe(not_specified_icon('Business Criticality Not Specified')) 44 | 45 | 46 | @register.filter 47 | def platform_icon(value): 48 | if value == Application.WEB_PLATFORM: 49 | return mark_safe(icon('list-alt', 'Web')) 50 | elif value == Application.DESKTOP_PLATFORM: 51 | return mark_safe(icon('desktop', 'Desktop')) 52 | elif value == Application.MOBILE_PLATFORM: 53 | return mark_safe(icon('mobile', 'Mobile')) 54 | elif value == Application.WEB_SERVICE_PLATFORM: 55 | return mark_safe(icon('plug', 'Web Service')) 56 | else: 57 | return mark_safe(not_specified_icon('Platform Not Specified')) 58 | 59 | 60 | @register.filter 61 | def lifecycle_icon(value): 62 | if value == Application.IDEA_LIFECYCLE: 63 | return mark_safe(icon('lightbulb-o', 'Idea')) 64 | if value == Application.EXPLORE_LIFECYCLE: 65 | return mark_safe(icon('compass', 'Explore')) 66 | if value == Application.VALIDATE_LIFECYCLE: 67 | return mark_safe(icon('search', 'Validate')) 68 | if value == Application.GROW_LIFECYCLE: 69 | return mark_safe(icon('leaf', 'Grow')) 70 | if value == Application.SUSTAIN_LIFECYCLE: 71 | return mark_safe(icon('ship', 'Sustain')) 72 | if value == Application.RETIRE_LIFECYCLE: 73 | return mark_safe(icon('moon-o', 'Retire')) 74 | else: 75 | return mark_safe(not_specified_icon('Lifecycle Not Specified')) 76 | 77 | 78 | @register.filter 79 | def origin_icon(value): 80 | if value == Application.THIRD_PARTY_LIBRARY_ORIGIN: 81 | return mark_safe(icon('book', 'Third-Party Library')) 82 | if value == Application.PURCHASED_ORIGIN: 83 | return mark_safe(icon('money', 'Purchased')) 84 | if value == Application.CONTRACTOR_ORIGIN: 85 | return mark_safe(icon('suitcase', 'Contractor Developed')) 86 | if value == Application.INTERNALLY_DEVELOPED_ORIGIN: 87 | return mark_safe(icon('home', 'Internally Developed')) 88 | if value == Application.OPEN_SOURCE_ORIGIN: 89 | return mark_safe(icon('code', 'Open Source')) 90 | if value == Application.OUTSOURCED_ORIGIN: 91 | return mark_safe(icon('globe', 'Outsourced')) 92 | else: 93 | return mark_safe(not_specified_icon('Origin Not Specified')) 94 | 95 | 96 | @register.filter 97 | def external_audience_icon(value): 98 | if value: 99 | return mark_safe(icon('users', 'External Audience')) 100 | else: 101 | return '' 102 | 103 | 104 | @register.filter 105 | def internet_accessible_icon(value): 106 | if value: 107 | return mark_safe(icon('cloud', 'Internet Accessible')) 108 | else: 109 | return '' -------------------------------------------------------------------------------- /project/boh/templatetags/markdown_render.py: -------------------------------------------------------------------------------- 1 | import markdown 2 | 3 | from markdown.extensions import Extension 4 | 5 | from django import template 6 | from django.utils.safestring import mark_safe 7 | 8 | 9 | register = template.Library() 10 | 11 | 12 | # http://pythonhosted.org//Markdown/release-2.6.html#safe_mode-deprecated 13 | class EscapeHtml(Extension): 14 | def extendMarkdown(self, md, md_globals): 15 | del md.preprocessors['html_block'] 16 | del md.inlinePatterns['html'] 17 | 18 | 19 | @register.filter 20 | def markdown_render(value): 21 | return mark_safe(markdown.markdown(value, extensions=[EscapeHtml(), 'markdown.extensions.codehilite', 'markdown.extensions.toc'])) 22 | -------------------------------------------------------------------------------- /project/boh_api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh_api/__init__.py -------------------------------------------------------------------------------- /project/boh_api/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /project/boh_api/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/boh_api/migrations/__init__.py -------------------------------------------------------------------------------- /project/boh_api/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /project/boh_api/serializers.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import get_user_model 2 | from django.core.exceptions import ObjectDoesNotExist 3 | 4 | from rest_framework import serializers 5 | 6 | from boh import models 7 | 8 | 9 | class UserSerializer(serializers.ModelSerializer): 10 | class Meta: 11 | model = get_user_model() 12 | fields = ['id', 'username', 'first_name', 'last_name', 'email', 'is_active', 'last_login'] 13 | read_only_fields = fields 14 | 15 | 16 | class TagSerializer(serializers.ModelSerializer): 17 | class Meta: 18 | model = models.Tag 19 | fields = ['id', 'name', 'color', 'description'] 20 | 21 | 22 | class PersonSerializer(serializers.ModelSerializer): 23 | class Meta: 24 | model = models.Person 25 | fields = ['id', 'first_name', 'last_name', 'email', 'role', 'phone_work', 'phone_mobile', 'job_title'] 26 | 27 | 28 | class OrganizationSerializer(serializers.ModelSerializer): 29 | people = PersonSerializer(many = True, read_only = True) 30 | 31 | class Meta: 32 | model = models.Organization 33 | fields = ['id', 'name', 'description', 'people'] 34 | 35 | 36 | class ActivityTypeSerializer(serializers.ModelSerializer): 37 | class Meta: 38 | model = models.ActivityType 39 | fields = ['id', 'name', 'documentation'] 40 | 41 | 42 | class ActivitySerializer(serializers.ModelSerializer): 43 | activity_type = ActivityTypeSerializer(read_only = True) 44 | users = UserSerializer(many = True, read_only = True) 45 | 46 | class Meta: 47 | model = models.Activity 48 | fields = ['id', 'status', 'description', 'open_date', 'close_date', 'duration', 'activity_type', 'engagement', 'users'] 49 | 50 | 51 | class DataElementSerializer(serializers.ModelSerializer): 52 | class Meta: 53 | model = models.DataElement 54 | fields = ['id', 'name', 'description'] 55 | 56 | 57 | class ApplicationSerializer(serializers.ModelSerializer): 58 | class ApplicationCustomFieldValueSerializer(serializers.ModelSerializer): 59 | key = serializers.SerializerMethodField() 60 | 61 | class Meta: 62 | fields = ['id', 'key', 'value'] 63 | model = models.ApplicationCustomFieldValue 64 | 65 | def get_key(self, custom_field_value): 66 | return custom_field_value.custom_field.key 67 | 68 | threadfix_metrics = serializers.SerializerMethodField() 69 | organization = OrganizationSerializer(read_only = True) 70 | tags = TagSerializer(many = True, read_only = True) 71 | data_elements = DataElementSerializer(many = True, read_only = True) 72 | custom_fields = ApplicationCustomFieldValueSerializer(source='applicationcustomfieldvalue_set', many = True, read_only = True) 73 | people = PersonSerializer(many = True, read_only = True) 74 | 75 | class Meta: 76 | model = models.Application 77 | fields = ['id', 'organization', 'name', 'description', 'business_criticality', 'platform', 'lifecycle', 'origin', 'user_records', 'revenue', 'external_audience', 'internet_accessible', 'threadfix_metrics', 'tags', 'data_elements', 'custom_fields', 'people'] 78 | 79 | def get_threadfix_metrics(self, application): 80 | try: 81 | metrics = models.ThreadFixMetrics.objects.filter(application=application).latest() 82 | result = { 83 | 'critical_count': metrics.critical_count, 84 | 'high_count': metrics.high_count, 85 | 'medium_count': metrics.medium_count, 86 | 'low_count:': metrics.low_count, 87 | 'informational_count': metrics.informational_count, 88 | 'created_date': metrics.created_date 89 | } 90 | return result 91 | except ObjectDoesNotExist: 92 | return None 93 | 94 | 95 | class EngagementSerializer(serializers.ModelSerializer): 96 | requestor = PersonSerializer(read_only = True) 97 | 98 | class Meta: 99 | model = models.Engagement 100 | fields = ['id', 'status', 'start_date', 'end_date', 'description', 'open_date', 'close_date', 'duration', 'requestor', 'application'] 101 | 102 | 103 | -------------------------------------------------------------------------------- /project/boh_api/templates/rest_framework/api.html: -------------------------------------------------------------------------------- 1 | {% extends "rest_framework/base.html" %} 2 | 3 | {% block title %}Bag of Holding | API{% endblock %} 4 | 5 | {% block branding %} 6 | Bag of Holding API 7 | {% endblock %} 8 | 9 | {% block description %} 10 | 11 | {{ description }} 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /project/boh_api/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /project/boh_api/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import include, url 2 | 3 | from rest_framework import routers 4 | 5 | from . import viewsets 6 | 7 | 8 | router = routers.DefaultRouter() 9 | router.register(r'organizations', viewsets.OrganizationViewSet) 10 | router.register(r'applications', viewsets.ApplicationViewSet) 11 | router.register(r'tags', viewsets.TagViewSet) 12 | router.register(r'people', viewsets.PersonViewSet) 13 | router.register(r'engagements', viewsets.EngagementViewSet) 14 | router.register(r'activities', viewsets.ActivityViewSet) 15 | router.register(r'activities_types', viewsets.ActivityTypeViewSet) 16 | router.register(r'users', viewsets.UserViewSet) 17 | 18 | urlpatterns = [ 19 | url(r'^v0/', include(router.urls), name='v0'), 20 | #url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 21 | ] 22 | -------------------------------------------------------------------------------- /project/boh_api/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import generics, renderers 2 | from rest_framework.response import Response 3 | 4 | 5 | -------------------------------------------------------------------------------- /project/boh_api/viewsets.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import get_user_model 2 | 3 | from rest_framework import viewsets 4 | 5 | from boh import models 6 | 7 | from . import serializers 8 | 9 | 10 | class OrganizationViewSet(viewsets.ModelViewSet): 11 | queryset = models.Organization.objects.all() 12 | serializer_class = serializers.OrganizationSerializer 13 | 14 | 15 | class ApplicationViewSet(viewsets.ModelViewSet): 16 | queryset = models.Application.objects.all() 17 | serializer_class = serializers.ApplicationSerializer 18 | 19 | 20 | class TagViewSet(viewsets.ModelViewSet): 21 | queryset = models.Tag.objects.all() 22 | serializer_class = serializers.TagSerializer 23 | 24 | 25 | class PersonViewSet(viewsets.ModelViewSet): 26 | queryset = models.Person.objects.all() 27 | serializer_class = serializers.PersonSerializer 28 | 29 | 30 | class EngagementViewSet(viewsets.ModelViewSet): 31 | queryset = models.Engagement.objects.all() 32 | serializer_class = serializers.EngagementSerializer 33 | 34 | 35 | class ActivityViewSet(viewsets.ModelViewSet): 36 | queryset = models.Activity.objects.all() 37 | serializer_class = serializers.ActivitySerializer 38 | 39 | 40 | class ActivityTypeViewSet(viewsets.ModelViewSet): 41 | queryset = models.ActivityType.objects.all() 42 | serializer_class = serializers.ActivityTypeSerializer 43 | 44 | 45 | class UserViewSet(viewsets.ReadOnlyModelViewSet): 46 | queryset = get_user_model().objects.all() 47 | serializer_class = serializers.UserSerializer 48 | -------------------------------------------------------------------------------- /project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | if os.environ.get("DJANGO_SETTINGS_MODULE") is None: 7 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.local") 8 | 9 | from django.core.management import execute_from_command_line 10 | 11 | execute_from_command_line(sys.argv) 12 | -------------------------------------------------------------------------------- /project/project/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/project/__init__.py -------------------------------------------------------------------------------- /project/project/settings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aparsons/bag-of-holding/786265f58474ab66bf138bda195882550462d8cc/project/project/settings/__init__.py -------------------------------------------------------------------------------- /project/project/settings/base.py: -------------------------------------------------------------------------------- 1 | """ 2 | Settings common to all instances of the project. 3 | """ 4 | 5 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 6 | import os 7 | 8 | from django.contrib import messages 9 | 10 | 11 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 12 | 13 | # Quick-start development settings - unsuitable for production 14 | # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ 15 | 16 | ALLOWED_HOSTS = [] 17 | 18 | # Application definition 19 | INSTALLED_APPS = ( 20 | 'boh', 21 | 'boh_api', 22 | 23 | 'django.contrib.admin', 24 | 'django.contrib.auth', 25 | 'django.contrib.contenttypes', 26 | 'django.contrib.sessions', 27 | 'django.contrib.messages', 28 | 'django.contrib.staticfiles', 29 | 'django.contrib.humanize', 30 | 31 | 'rest_framework', 32 | 'rest_framework.authtoken', 33 | 'django_filters', 34 | 'widget_tweaks', 35 | ) 36 | 37 | MIDDLEWARE_CLASSES = ( 38 | 'django.contrib.sessions.middleware.SessionMiddleware', 39 | 'django.middleware.locale.LocaleMiddleware', 40 | 'django.middleware.common.CommonMiddleware', 41 | 'django.middleware.csrf.CsrfViewMiddleware', 42 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 43 | 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 44 | 'django.contrib.messages.middleware.MessageMiddleware', 45 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 46 | 'django.middleware.security.SecurityMiddleware', 47 | ) 48 | 49 | ROOT_URLCONF = 'project.urls' 50 | 51 | TEMPLATES = [ 52 | { 53 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 54 | 'DIRS': ['boh_api/templates'], 55 | 'APP_DIRS': True, 56 | 'OPTIONS': { 57 | 'context_processors': [ 58 | 'django.template.context_processors.i18n', 59 | 'django.template.context_processors.debug', 60 | 'django.template.context_processors.request', 61 | 'django.contrib.auth.context_processors.auth', 62 | 'django.contrib.messages.context_processors.messages', 63 | ], 64 | }, 65 | }, 66 | ] 67 | 68 | WSGI_APPLICATION = 'project.wsgi.application' 69 | 70 | # Internationalization 71 | # https://docs.djangoproject.com/en/1.8/topics/i18n/ 72 | 73 | LANGUAGE_CODE = 'en-us' 74 | 75 | TIME_ZONE = 'UTC' 76 | 77 | USE_I18N = True 78 | 79 | USE_L10N = True 80 | 81 | USE_TZ = True 82 | 83 | LANGUAGES = ( 84 | ('en', 'English'), 85 | ('pt-br', 'Portuguese'), 86 | ) 87 | 88 | # Locale files 89 | LOCALE_PATHS = ( 90 | os.path.join(os.path.dirname(BASE_DIR), 'locale/'), 91 | ) 92 | 93 | # Used for appending a site-wide prefix to all URLs. Example: 'boh/' 94 | URL_PREFIX = '' 95 | 96 | LOGIN_URL = os.path.join('/', URL_PREFIX, 'accounts/login/') 97 | LOGIN_REDIRECT_URL = os.path.join('/', URL_PREFIX) 98 | 99 | # Changing error to danger for bootstrap compatibility 100 | MESSAGE_TAGS = { 101 | messages.ERROR: 'danger' 102 | } 103 | 104 | # Static files (CSS, JavaScript, Images) 105 | # https://docs.djangoproject.com/en/1.8/howto/static-files/ 106 | STATIC_URL = os.path.join('/', URL_PREFIX, 'static/') 107 | MEDIA_URL = os.path.join('/', URL_PREFIX, 'media/') 108 | 109 | # Django Rest Framework 110 | # http://www.django-rest-framework.org/api-guide/settings/ 111 | REST_FRAMEWORK = { 112 | 'DEFAULT_AUTHENTICATION_CLASSES': ( 113 | 'rest_framework.authentication.SessionAuthentication', 114 | 'rest_framework.authentication.TokenAuthentication', 115 | ), 116 | 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'], 117 | 'DEFAULT_PERMISSION_CLASSES': ( 118 | 'rest_framework.permissions.IsAuthenticated', 119 | ), 120 | 'DEFAULT_RENDERER_CLASSES': ( 121 | 'rest_framework.renderers.JSONRenderer', 122 | 'rest_framework.renderers.BrowsableAPIRenderer', 123 | ), 124 | 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 125 | 'PAGE_SIZE': 25, 126 | } 127 | -------------------------------------------------------------------------------- /project/project/settings/dev_aparsons.py: -------------------------------------------------------------------------------- 1 | from .local import * 2 | 3 | INSTALLED_APPS = ( 4 | 'boh', 5 | 'boh_api', 6 | 7 | 'django.contrib.admin', 8 | 'django.contrib.auth', 9 | 'django.contrib.contenttypes', 10 | 'django.contrib.sessions', 11 | 'django.contrib.messages', 12 | 'django.contrib.staticfiles', 13 | 'django.contrib.humanize', 14 | 15 | 'rest_framework', 16 | 'rest_framework.authtoken', 17 | 'django_filters', 18 | 'widget_tweaks', 19 | 20 | #'debug_toolbar', 21 | ) 22 | -------------------------------------------------------------------------------- /project/project/settings/local.py: -------------------------------------------------------------------------------- 1 | """ 2 | This is the settings file that you use when you're working on the project locally. Local development-specific settings 3 | include DEBUG mode, log level, and activation of developer tools like django-debug-toolbar. 4 | """ 5 | 6 | from .base import * 7 | 8 | 9 | # SECURITY WARNING: keep the secret key used in production secret! 10 | SECRET_KEY = '5g3bqc$yp(+$obzr^z2=49grt%_ke5xp6i#5f$v17v7aldr!nr' 11 | 12 | # SECURITY WARNING: don't run with debug turned on in production! 13 | DEBUG = True 14 | 15 | # Database 16 | # https://docs.djangoproject.com/en/1.8/ref/settings/#databases 17 | DATABASES = { 18 | 'default': { 19 | 'ENGINE': 'django.db.backends.sqlite3', 20 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 21 | } 22 | } 23 | 24 | # Email 25 | # https://docs.djangoproject.com/en/1.8/topics/email/#smtp-backend 26 | EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 27 | 28 | # Static files (CSS, JavaScript, Images) 29 | # https://docs.djangoproject.com/en/1.8/howto/static-files/ 30 | STATIC_ROOT = os.path.join(BASE_DIR, os.pardir, os.pardir, 'static') 31 | MEDIA_ROOT = os.path.join(BASE_DIR, os.pardir, os.pardir, 'media') 32 | -------------------------------------------------------------------------------- /project/project/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.conf.urls import include, url 3 | from django.conf.urls.static import static 4 | from django.contrib import admin 5 | from django.contrib.auth.views import login, logout 6 | 7 | 8 | base_urlpatterns = [ 9 | url(r'^', include('boh.urls', namespace='boh')), 10 | url(r'^api/', include('boh_api.urls', namespace='boh_api')), 11 | 12 | url(r'^accounts/login/$', login, name='login'), 13 | url(r'^accounts/logout/$', logout, name='logout'), 14 | 15 | url(r'^admin/', include(admin.site.urls)), 16 | ] 17 | 18 | # Apply URL_PREFIX setting to all urls 19 | if settings.URL_PREFIX: 20 | urlpatterns = [ 21 | url(r'^' + settings.URL_PREFIX, include(base_urlpatterns)), 22 | ] 23 | else: 24 | urlpatterns = base_urlpatterns 25 | 26 | if settings.DEBUG: 27 | urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 28 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 29 | -------------------------------------------------------------------------------- /project/project/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for project project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | 15 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.local") 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /project/sample_data.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "model": "auth.user", 4 | "pk": 1, 5 | "fields": { 6 | "username": "dev", 7 | "password": "pbkdf2_sha256$15000$raL6ERHt4kw1$2dRy6YVAWTgJwUq+QQviA73eavlLcDjbX6h1bO2Fc8A=", 8 | "first_name": "dev", 9 | "last_name": "dev", 10 | "email": "dev@dev.dev", 11 | "is_staff": 1, 12 | "is_active": 1, 13 | "is_superuser": 1 14 | } 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | -r requirements/local.txt 2 | -r requirements/test.txt 3 | -r requirements/prod.txt 4 | -------------------------------------------------------------------------------- /requirements/base.txt: -------------------------------------------------------------------------------- 1 | Django==1.11.22 2 | django-formtools==1.0 3 | djangorestframework==3.10.1 4 | django-filter==2.2.0 5 | django-widget-tweaks==1.4.1 6 | Markdown==3.1.1 7 | phonenumbers==8.9.10 8 | Pygments==2.2.0 9 | pytz==2018.5 10 | requests==2.20.0 11 | threadfix-api==1.1.1 12 | -------------------------------------------------------------------------------- /requirements/dev.txt: -------------------------------------------------------------------------------- 1 | -r local.txt -------------------------------------------------------------------------------- /requirements/local.txt: -------------------------------------------------------------------------------- 1 | -r base.txt 2 | 3 | django-debug-toolbar==1.4 4 | -------------------------------------------------------------------------------- /requirements/prod.txt: -------------------------------------------------------------------------------- 1 | -r base.txt 2 | 3 | mysqlclient==1.4.2.post1 4 | -------------------------------------------------------------------------------- /requirements/test.txt: -------------------------------------------------------------------------------- 1 | -r base.txt 2 | 3 | coverage==4.1b3 4 | --------------------------------------------------------------------------------