CALC (formerly known as "Hourglass"), which stands for Contracts Awarded Labor Category, is a tool to help contracting personnel estimate their per-hour labor costs for a contract, based on historical pricing information. The tool is live at https://calc.gsa.gov. You can track our progress on our trello board or file an issue on this repo.
To install the requirements, use:
pip install -r requirements.txtCurrently, CALC is a basic Django project. You can get started by creating
a local_settings.py file (based off of local_settings.example.py) with your
local database configuration, and running:
./manage.py syncdbto set up the database. After that, you can load all of the data by running:
./manage.py load_dataFrom there, you're just a hop, skip and a jump away from your own dev server:
./manage.py runserverIf you are managing https://calc.gsa.gov or any other cloud.gov-based
deployment, see deploy.md.
To run all tests:
make testTo run only unit tests:
make test-backendTo run only Selenium tests:
make test-frontendWe use SASS for our CSS needs.
To build SASS:
cd hourglass_site/static/hourglass_site
makeTo continuously watch SASS for changes and rebuild:
cd hourglass_site/static/hourglass_site
make watch-styleNote that if you're using Docker for development, SASS will automatically be rebuilt for you.
A Docker setup potentially makes development and deployment easier.
To use it, install Docker and Docker Compose. (If you're on OS X or Windows, you'll also have to explicitly start the Docker Quickstart Terminal, at least until Docker goes native.)
Then run:
docker-compose build
docker-compose run app python manage.py syncdb
docker-compose run app python manage.py load_dataOnce the above commands are successful, run:
docker-compose upThis will start up all required servers in containers and output their
log information to stdout. If you're on Linux, you should be able
to visit http://localhost:8000/ directly to access the site. If you're on
OS X or Windows, you'll likely have to visit port 8000 on the IP
address given to you by docker-machine ip default. (Note that this
hassle will go away once Docker goes native for OS X/Windows.)
You'll likely want to run manage.py or make to do other things at
some point. To do this, it's probably easiest to run:
docker-compose run app bashThis will run an interactive bash session inside the main app container.
In this container, the /calc directory is mapped to the root of
the repository on your host; you can run manage.py or make from there.
Note that if you don't have Django installed on your host system, you
can just run python manage.py directly from outside the container--the
manage.py script has been modified to run itself in a Docker container
if it detects that Django isn't installed.
SECRET_KEYis a large random value corresponding to Django'sSECRET_KEYsetting. It is automatically set to a known, insecure value whenDEBUGis true.
If you're interested in the underlying data, please see https://github.com/18F/calc/blob/master/updating_data.md
You can access rate information at http://localhost:8000/api/rates/.
You can search for prices of specific labor categories by using the q
parameter. For example:
http://localhost:8000/api/rates/?q=accountant
You can change the way that labor categories are searched by using the
query_type parameter, which can be either:
match_words(the default), which matches all words in the query;match_phrase, which matches the query as a phrase; ormatch_exact, which matches labor categories exactly
You can search for multiple labor categories separated by a comma.
http://localhost:8000/api/rates/?q=trainer,instructor
All of the query types are case-insenstive.
You can also filter by the minimum years of experience and maximum years of experience. For example:
http://localhost:8000/api/rates/?&min_experience=5&max_experience=10&q=technical
Or, you can filter with a single, comma-separated range. For example, if you wanted results with more than five years and less than ten years of experience:
http://localhost:8000/api/rates/?experience_range=5,10
The valid values for the education endpoints are HS (high school), AA (associates),
BA (bachelors), MA (masters), and PHD (Ph.D).
There are two ways to filter based on education, min_education and education.
To filter by specific education levels, use education. It accepts one or more
education values as defined above:
http://localhost:8000/api/rates/?education=AA,BA
You can also get all results that match and exceed the selected education level
by using min_education. The following example will return results that have
an education level of MA or PHD:
http://localhost:8000/api/rates/?min_education=MA
The default pagination is set to 200. You can paginate using the page
parameter:
http://localhost:8000/api/rates/?q=translator&page=2
You can filter by price with any of the price (exact match), price__lte
(price is less than or equal to) or price__gte (price is greater than or
equal to) parameters:
http://localhost:8000/api/rates/?price=95
http://localhost:8000/api/rates/?price__lte=95
http://localhost:8000/api/rates/?price__gte=95
The price__lte and price__gte parameters may be used together to search for
a price range:
http://localhost:8000/api/rates/?price__gte=95&price__lte=105
You can also exclude specific records from the results by passing in an exclude parameter and a comma separated list of ids:
http://localhost:8000/api/rates/?q=environmental+technician&exclude=875173,875749
The id attribute is available in api response.
Other params allow you to filter by the contract schedule of the transaction,
whether or not the vendor is a small business (valid values: s [small] and
o [other]), and whether or not the vendor works on the contractor or customer
site.
Here is an example with all three parameters (schedule, site, and
business_size) included:
http://localhost:8000/api/rates/?schedule=mobis&site=customer&business_size=s
For schedules, there are 8 different values that will return results (case insensitive):
- Environmental
- AIMS
- Logistics
- Language Services
- PES
- MOBIS
- Consolidated
- IT Schedule 70
For site, there are only 3 values (also case insensitive):
- Customer
- Contractor
- both
And the small_business parameter can be either s for small business, or o
for other than small business.