Package: django-rapid-prototyping
A reusable Django app that helps to create prototypes and cost estimations.InstallationTo get the latest stable release from PyPi:$ pip install django-rapid-prototypingTo get the latest commit from GitHub:$ pip install -e git+git://github.com/bitmazk/django-rapid-prototyping.git#egg=rapid_prototypingAdddjango_libsandrapid_prototypingto yourINSTALLED_APPS:INSTALLED_APPS = (
    ...,
    'django_libs'
    'rapid_prototyping',
)Add theRapidPrototypingViewfromdjango-libsand include theurls.pyof this app in your mainurls.py:from django_libs.views import RapidPrototypingView

urlpatterns = [
    url(r'^p/', include('rapid_prototyping.urls')),
    url(r'^p/(?P<template_path>.*)$',
        RapidPrototypingView.as_view(),
        name='prototype'),
]Add the mandatory settings to yoursettings.py. See headingSettingsbelow.SettingsRAPID_PROTOTYPING_SPRINTS_MODULEMandatory setting. Should be a fully qualified name to thesprintsarray in yoursprintsmodule somewhere in your project. This would usually
be something likemyproject.context.sprints.sprints.Of course you have to create that file and add thesprintsarray. See
headingSprintsbelow.RAPID_PROTOTYPING_HOURLY_RATEMandatory setting. Set this to an integer representing your hourly rate.UsageIn yourproto/p_base.htmladd the following block to the bottom of your site:{% block costs_footer_container %}
<div class="costsFooter">
    <div class="container">
        <div class="row">
            <div class="col-sm-12">
                {% block costs_footer %}{% endblock %}
            </div>
        </div>
    </div>
</div>
{% endblock %}

{% comment %}Include this sctipt after your jQuery include.{% endcomment %}
<script src="{% static "rapid_prototyping/js/calculate_total.js" %}"></script>Now create ap_index.htmllike so:{% extends "proto/p_base.html" %}
{% load libs_tags rapid_prototyping_tags %}

{% block main %}
<h1>Project Prototype</h1>
<ul>
    <li><a href="/p/home.html">Landing Page</a></li>
    {% comment %}Add links to all pages that are part of your prototype here{% endcomment %}
</ul>
{% endblock %}

{% block costs_footer %}
<table class="table table-bordered table-hover">
    {% include "rapid_prototyping/costs_table_head.html" %}
    <tbody>
        {% load_context "yourproject.context.home_costs" %}
        {% include "rapid_prototyping/costs_table_body.html" %}
        {% comment %}
            Load context and include table body for all pages that are part of your prototype here
            {% load_context "yourproject.context.search_results_costs" %}
            {% include "rapid_prototyping/costs_table_body.html" %}
        {% endcomment %}
        {% include "rapid_prototyping/costs_total.html" %}
    </tbody>
</table>
{% endblock %}For each page that you create, you need to create a context file which defines
the estimated costs for all subtasks that need to be done in order to get that
page up and running. Such a file could look like this:# in yourproject/context/home_costs.py
from rapid_prototyping.context.utils import append_overhead_costs, get_counter

MAIN_ID = 100
counter = [-1]
costs = [
    {
        'id': MAIN_ID + get_counter(counter)[0],
        'task': 'Create logo',
        'time': 240,
    },
    {
        'id': MAIN_ID + get_counter(counter)[0],
        'task': 'Create color scheme',
        'time': 120,
    },
    {
        'id': MAIN_ID + get_counter(counter)[0],
        'task': 'Create email form',
        'time': 30,
    }
]
costs = append_overhead_costs(costs, MAIN_ID + get_counter(counter)[0])When you have done all this you should be able to visit/p/proto/p_home.htmland see your template with a table of costs below. You
should also be able to see/p/p_index.htmlwith a list of all pages and a
table of total project costs.SprintsIf you have done all the above, you will have some prototype pages with tables
at the bottom that show planned tasks for each page. You will also have an
index page which shows all tasks for the whole project.Now you migiht want to group tasks into sprints and track the actual time that
has been taken to implement a certain task.First of all, create ayourproject/context/sprints.pylike so:sprints = [
    {
        'id': 1,
        'title': 'Week 32',
    },
    {
        'id': 2,
        'title': 'Week 33',
    },
]That’s all. It’s just an array of dicts, each dict describes a sprint. The
title can be useful when rendering the list of sprints, the important part
is theid.In order to assign tasks to a sprint, open the corresponding*_costs.pyfile and add some more information to the task’s dict:costs = [
    {
        'id': MAIN_ID + get_counter(counter)[0],
        'task': 'Create logo',
        'time': 240,
        'developer_time': 300,
        'actual_time': 450,
        'link': 'http://www.trello.com/',
        'sprint': 1,
    },
...The additional columns are the following:developer_time: Whiletimeis the time the project manager estimated
at the very beginning when communicating with the customer,developer_timeis the time that the person who actually implementes this estimates at the
beginning of a sprint. This can be different fromtimebecause as the
project progresses and patterns / frameworks emerge, some tasks can become
much easier or much more difficult than initally planned.actual_time: This is the time that the developer actually took in order
to complete the task.link: If you are using some other software, like www.trello.com to manage
your project, you can add a link to the corresponding ticket for this task
in your other software here.sprint: This must be one of the IDs that you have defined in yoursprints.py.If you have done all the above, you should be able to visit/p/sprints/.You will now see your sprints with their assigned tasks. Before you start a
sprint, you might want to note down the total edeveloper estimated time at
the beginning of the sprint. This is useful because if you can’t finish
some of the tasks and move them into the next sprint, the total will change
and you will not know, how much time you initially estimated.Add the total developer estimated time like so:sprints = [
    {
        'id': 1,
        'title': 'Week 32',
        'estimated_time': 1350,
    },
    {
        'id': 2,
        'title': 'Week 33',
    },
]After your sprint, you might want to note down which tasks could not be
completed and how much time had been estimated for these tasks:sprints = [
    {
        'id': 1,
        'title': 'Week 32',
        'estimated_time': 1350,
        'unfinished_tasks': [300, 403, 407, 502, 503, 510],
        'unfinished_time': 360,
    },
    {
        'id': 2,
        'title': 'Week 33',
    },
]At this point you must be careful to never add a new task in front of another
task because then all IDs would be incremented and the IDs you noted down here
would no longer be correct.ContributeIf you want to contribute to this project, please perform the following steps:# Fork this repository
# Clone your fork
$ mkvirtualenv -p python2.7 django-rapid-prototyping
$ python setup.py install
$ pip install -r dev_requirements.txt

$ git co -b feature_branch master
# Implement your feature and tests
$ git add . && git commit
$ git push -u origin feature_branch
# Send us a pull request for your feature branch