First commit.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,24 @@
+# use glob syntax.
+syntax: glob
+
+*.pyc
+*.zip
+*~
+.project
+.pydevproject
+app.yaml
+build
+tests/coverageResults
+*,cover
+tests/.coverage
+*.git
+*.egg-info
+eggs
+parts
+.installed.cfg
+bin
+develop-eggs
+.gitignore
+.DS_Store
+index.yaml
+.settings
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/manage.py Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,12 @@
+#!/usr/bin/env python
+import os
+from django.core.management import execute_manager
+try:
+ import settings # Assumed to be in the same directory.
+except ImportError:
+ import sys
+ sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
+ sys.exit(1)
+
+if __name__ == "__main__":
+ execute_manager(settings)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/projrev/models.py Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,215 @@
+"""This module contains the data model for the project funded by NME
+through ICT.
+"""
+
+
+__authors__ = [
+ '"Madhusudan.C.S" <madhusudancs@gmail.com>',
+]
+
+
+from django.db import models
+from django.contrib.auth.models import User
+
+
+class Project(models.Model):
+ """Model class for NME funded projects.
+ """
+
+ LINE_ITEM_CHOICES = [('ME', 'Mechanical'),
+ ('CE', 'Chemical'),
+ ('EE', 'Electrical'),
+ ('AE', 'Aero Space'),
+ ('CS', 'Computer Science'),
+ ('IT', 'Information Technology'),
+ ]
+
+ STATE_CHOICES = [('MH', 'Maharashtra'),
+ ('KA', 'Karnataka'),
+ ('KL', 'Kerala'),
+ ('TN', 'Tamil Nadu'),
+ ('AP', 'Andra Pradesh'),
+ ]
+
+ DISTRICT_CHOICES = [('AD', 'Adilabad'),
+ ('RT', 'Ratnagiri'),
+ ('MU', 'Mumbai suburban'),
+ ('PU', 'Pune'),
+ ('PL', 'Palakkad'),
+ ('BN', 'Bangalore Urban district'),
+ ('CK', 'Chikmagalur District'),
+ ]
+
+ # Field containing the Line Item to which the project belongs to.
+ line_item = models.CharField(max_length=256,
+ choices=LINE_ITEM_CHOICES)
+
+ # Field containing the name of the institution working on the
+ # project.
+ institution = models.CharField(max_length=256)
+
+ # Field containing the state to which the institution belongs to.
+ state = models.CharField(max_length=256,
+ choices=STATE_CHOICES)
+
+ # Field containing the district to which the institution belongs
+ # to in the state of India.
+ district = models.CharField(max_length=256,
+ choices=DISTRICT_CHOICES)
+
+ # Field containing the autogenerated MICR code for the project.
+ micr_code = models.CharField(max_length=15, unique=True)
+
+ # Field containing the status of the project.
+ # status of the project can be one among the following
+ # New, Revised, Funded, Pilot, DPE
+ status = models.CharField(max_length=256,
+ choices=[('new', 'New'), ('pilot', 'Pilot')])
+
+ @classmethod
+ def getLineItem(cls, code):
+ """Get the State name from its code.
+ """
+
+ line_item_dict = dict(cls.LINE_ITEM_CHOICES)
+ return line_item_dict[code]
+
+ @classmethod
+ def getLineItem(cls, code):
+ """Get the State name from its code.
+ """
+
+ line_item_dict = dict(cls.LINE_ITEM_CHOICES)
+ return line_item_dict[code]
+
+ @classmethod
+ def getState(cls, code):
+ """Get the State name from its code.
+ """
+
+ state_dict = dict(cls.STATE_CHOICES)
+ return state_dict[code]
+
+ @classmethod
+ def getState(cls, code):
+ """Get the State name from its code.
+ """
+
+ state_dict = dict(cls.STATE_CHOICES)
+ return state_dict[code]
+
+ @classmethod
+ def getDistrict(cls, code):
+ """Get the State name from its code.
+ """
+
+ district_dict = dict(cls.DISTRICT_CHOICES)
+ return district_dict[code]
+
+class Proposal(models.Model):
+ """Model class for the project's proposal.
+ """
+
+ #: Field representing the relation to the corresponding project.
+ project = models.ForeignKey(Project)
+
+ #: Field containing the Line Item to which the project belongs to.
+ document = models.FileField(upload_to='proposals/%Y/%m/%d')
+
+ #: Field containing the date on which the document was submitted
+ submitted_on = models.DateTimeField(auto_now_add=True)
+
+ #: Field containing the reference to the user who submitted the proposal.
+ submitted_by = models.ForeignKey(User, null=True)
+
+ #: Field containing the revision number of the proposal belonging to
+ #: the Project.
+ rev_num = models.PositiveIntegerField()
+
+
+class Timeline(models.Model):
+ """Model class for the project's timeline.
+ """
+
+ #: Field representing the relation to the corresponding project.
+ project = models.ForeignKey(Project)
+
+ #: Field containing the date and time of submission of proposal.
+ submitted = models.DateTimeField()
+
+ #: Field containing the last date and time of review of proposal.
+ reviewed = models.DateTimeField()
+
+ #: Field containing the date and time of amount paid for the project.
+ amount_paid = models.DateTimeField()
+
+ #: Field containing the date and time of presentation of the project.
+ presentation = models.DateTimeField()
+
+ #: Field containing the date and time of monitoring of the project.
+ monitoring = models.DateTimeField()
+
+
+class Fund(models.Model):
+ """Model class for the project's funds.
+ """
+
+ #: Field representing the relation to the corresponding project.
+ project = models.ForeignKey(Project)
+
+ #: Field containing the amount sanctioned as funds for the project.
+ sanctioned = models.FloatField()
+
+ #: Field containing the expenses for the sanctioned fund for
+ #: the project.
+ expenses = models.FloatField()
+
+ #: Field containing the date and time on which the funds were
+ #: sanctioned for the project.
+ sanctioned_on = models.DateTimeField(auto_now_add=True)
+
+
+class Review(models.Model):
+ """Model class for the project's proposal's review.
+ """
+
+ #: Field representing the relation to the corresponding project.
+ project = models.ForeignKey(Project)
+
+ #: Field containing the comment entered along with the review.
+ comment = models.TextField()
+
+ #: Field representing the reference to the person who
+ #: did the review.
+ reviewer = models.ForeignKey(User, null=True)
+
+ #: Field containing the date and time of review of the proposal.
+ reviewed_on = models.DateTimeField(auto_now_add=True)
+
+ #: Field containing the review value for this attribute.
+ attribute1 = models.PositiveSmallIntegerField(
+ choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
+
+ attribute2 = models.PositiveSmallIntegerField(
+ choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
+
+ attribute3 = models.PositiveSmallIntegerField(
+ choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
+
+ attribute4 = models.PositiveSmallIntegerField(
+ choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
+
+ attribute5 = models.PositiveSmallIntegerField(
+ choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
+
+ attribute6 = models.PositiveSmallIntegerField(
+ choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
+
+ attribute7 = models.PositiveSmallIntegerField(
+ choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
+
+ attribute8 = models.PositiveSmallIntegerField(
+ choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
+
+ attribute9 = models.PositiveSmallIntegerField(
+ choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/projrev/views/helpers/forms.py Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,43 @@
+"""This module contains the form helpers
+"""
+
+
+__authors__ = [
+ '"Madhusudan.C.S" <madhusudancs@gmail.com>',
+]
+
+from django import forms
+
+from projrev.models import Project
+from projrev.models import Review
+
+class ProposalForm(forms.ModelForm):
+ """Creates a form for the project.
+ """
+
+ document = forms.FileField()
+ micr_code = forms.CharField(max_length=15, required=False)
+
+ class Meta:
+ # We store most of the data in Project model. So even though the
+ # name and the purpose of the form is for Proposal acceptance, we
+ # use Project model here.
+ model = Project
+
+ # fields in the Project that must not appear in the form, but have
+ # be automatically generated.
+ fields = ('micr_code', 'line_item', 'institution', 'state', 'district')
+
+class ReviewForm(forms.ModelForm):
+ """Creates a form for review of proposal.
+ """
+
+ project = forms.ModelChoiceField(queryset=Project.objects.all(),
+ widget=forms.HiddenInput(),
+ required=False)
+
+ class Meta:
+ # Create a form from Review data model.
+ model = Review
+
+ exclude = ('reviewer')
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/projrev/views/login.py Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,35 @@
+"""This module contains the views for the login for the portal.
+"""
+
+
+__authors__ = [
+ '"Madhusudan.C.S" <madhusudancs@gmail.com>',
+]
+
+
+from django.contrib.auth import authenticate, login
+from django.shortcuts import render_to_response, get_object_or_404
+
+
+def login_validate(request):
+ """Validate the user and log him in.
+ """
+
+ username = request.POST['username']
+ password = request.POST['password']
+ user = authenticate(username=username, password=password)
+ if user is not None:
+ if user.is_active:
+ login(request, user)
+ # Redirect to a success page.
+ else:
+ pass
+ # Return a 'disabled account' error message
+ else:
+ # Return an 'invalid login' error message.
+ pass
+
+def logout_view(request):
+ """Logout the user
+ """
+
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/projrev/views/proposal.py Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,205 @@
+"""This module contains the views for the project's proposal
+funded by NME through ICT.
+"""
+
+
+__authors__ = [
+ '"Madhusudan.C.S" <madhusudancs@gmail.com>',
+]
+
+
+import time
+
+from django.shortcuts import render_to_response, get_object_or_404
+
+from projrev.models import Project
+from projrev.models import Proposal
+from projrev.views.helpers import forms as projrev_forms
+
+
+def submit(request):
+ """View for proposal submission.
+ """
+
+ if request.method == 'POST':
+ return submitPost(request)
+ else:
+ return submitGet(request)
+
+def submitPost(request):
+ """Handles POST request for the submitted proposal form.
+ """
+
+ prop_form = projrev_forms.ProposalForm(request.POST, request.FILES)
+
+ project = None
+ proposal = None
+
+ if prop_form.is_valid():
+ cleaned_data = prop_form.cleaned_data
+
+ # Generate MICR code
+ cleaned_data['micr_code'] = '%s%s%s%d' % (
+ cleaned_data['state'], cleaned_data['district'],
+ cleaned_data['line_item'],
+ int(time.time() * 1000) % 1000000000)
+
+ cleaned_data['line_item'] = Project.getLineItem(cleaned_data['line_item'])
+ cleaned_data['state'] = Project.getState(cleaned_data['state'])
+ cleaned_data['district'] = Project.getDistrict(cleaned_data['district'])
+
+ # If the form is valid create a new project or update the project
+ # if it already exists from the form.
+ project = prop_form.save()
+
+ project.status = 'new'
+
+ project.save()
+
+ # Create a proposal for the project.
+ proposal = project.proposal_set.create(
+ document=prop_form.cleaned_data['document'], rev_num = 0)
+
+ proposal.save()
+
+ return submitGet(request, project, proposal)
+
+def submitGet(request, project=None, proposal=None):
+ """Handles GET request for the submission of proposal form.
+ """
+
+ context = {}
+
+ if proposal:
+ context['document'] = proposal.document
+
+ if not project:
+ prop_form = projrev_forms.ProposalForm()
+ else:
+ prop_form = projrev_forms.ProposalForm(instance=project)
+
+ context['form'] = prop_form
+
+ template = 'projrev/proposal/submit.html'
+
+ return render_to_response(template, context)
+
+def review(request, micr_code=None):
+ """
+ """
+
+ if request.method == 'POST':
+ return reviewPost(request, micr_code)
+ else:
+ return reviewGet(request, micr_code)
+
+def reviewPost(request, micr_code=None):
+ """
+ """
+
+ rev_form = projrev_forms.ReviewForm(request.POST)
+
+ if rev_form.is_valid():
+ cleaned_data = rev_form.cleaned_data
+
+ cleaned_data['project'] = Project.objects.get(micr_code=micr_code)
+
+ # If the form is valid create a new project or update the project
+ # if it already exists from the form.
+ review = rev_form.save()
+
+ return reviewGet(request, micr_code, rev_form)
+
+def reviewGet(request, micr_code=None, rev_form=None):
+ """
+ """
+
+ if not micr_code:
+ template = 'projrev/proposal/list.html'
+ context = {
+ 'projects': Project.objects.all(),
+ 'row_url': '/proposal/review/',
+ }
+
+ return render_to_response(template, context)
+
+ if not rev_form:
+ rev_form = projrev_forms.ReviewForm()
+
+ proposal_path = str(Project.objects.get(
+ micr_code=micr_code).proposal_set.all()[0].document)
+
+ proposal_name = proposal_path.split('/')[-1]
+
+ context = {
+ 'form': rev_form,
+ 'project': Project.objects.get(micr_code=micr_code),
+ 'proposal_path': proposal_path,
+ 'proposal_name': proposal_name,
+ }
+
+ template = 'projrev/proposal/review.html'
+
+ return render_to_response(template, context)
+
+def rank(request, micr_code=None):
+ """
+ """
+
+ if request.method == 'POST':
+ return rankPost(request, micr_code)
+ else:
+ return rankGet(request, micr_code)
+
+def rankPost(request, micr_code=None):
+ """
+ """
+
+ return rankGet(request, micr_code)
+
+def rankGet(request, micr_code=None):
+ """
+ """
+
+ if not micr_code:
+ template = 'projrev/proposal/list.html'
+ context = {
+ 'projects': Project.objects.all(),
+ 'row_url': '/proposal/rank/',
+ }
+
+ return render_to_response(template, context)
+
+ projects = Project.objects.get(micr_code=micr_code)
+
+ proposal_path = str(projects.proposal_set.all()[0].document)
+
+ proposal_name = proposal_path.split('/')[-1]
+
+ reviews = projects.review_set.all()
+
+ review_score = [0] * 9
+ for review in reviews:
+ review_score[0] += review.attribute1
+ review_score[1] += review.attribute2
+ review_score[2] += review.attribute3
+ review_score[3] += review.attribute4
+ review_score[4] += review.attribute5
+ review_score[5] += review.attribute6
+ review_score[6] += review.attribute7
+ review_score[7] += review.attribute8
+ review_score[8] += review.attribute9
+
+ total_score = sum(review_score)
+
+ context = {
+ 'project': projects,
+ 'proposal_path': proposal_path,
+ 'proposal_name': proposal_name,
+ 'review_score': review_score,
+ 'total_score': total_score,
+ }
+
+ template = 'projrev/proposal/rank.html'
+
+ return render_to_response(template, context)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/settings.py Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,86 @@
+# Django settings for app project.
+
+import os
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+ ('Madhusudan.C.S', 'madhusudancs@gmail.com'),
+)
+
+MANAGERS = ADMINS
+
+DATABASE_ENGINE = 'mysql' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+DATABASE_NAME = 'nme_ict' # Or path to database file if using sqlite3.
+DATABASE_USER = 'madhu' # Not used with sqlite3.
+DATABASE_PASSWORD = '' # Not used with sqlite3.
+DATABASE_HOST = 'localhost' # Set to empty string for localhost. Not used with sqlite3.
+DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3.
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'Asia/Kolkata'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+ROOT_PATH = os.path.dirname(__file__)
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = os.path.join(ROOT_PATH, 'site-content')
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = '/site-content/'
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/media/'
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = '4akwt2sqybl#+rr^l3hk(c#3dj^$+=3l$88-j-l%uy%)*%l8_m'
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+ 'django.template.loaders.filesystem.load_template_source',
+ 'django.template.loaders.app_directories.load_template_source',
+# 'django.template.loaders.eggs.load_template_source',
+)
+
+MIDDLEWARE_CLASSES = (
+ 'django.middleware.common.CommonMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+)
+
+ROOT_URLCONF = 'app.urls'
+
+TEMPLATE_DIRS = (
+ # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
+ # Always use forward slashes, even on Windows.
+ # Don't forget to use absolute paths, not relative paths.
+ os.path.join(ROOT_PATH, 'templates'),
+)
+
+INSTALLED_APPS = (
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.sites',
+ 'django.contrib.admin',
+ 'app.projrev',
+)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/site-content/css/projrev.css Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,444 @@
+/********************************************
+ AUTHOR: Erwin Aligam
+ WEBSITE: http://www.styleshout.com/
+ TEMPLATE NAME: PixelGreen
+ TEMPLATE CODE: S-0010
+ VERSION: 1.2
+ LAST MODIFIED: June-05-2007
+ *******************************************/
+
+/********************************************
+ HTML ELEMENTS
+********************************************/
+
+/* top elements */
+* { padding: 0; margin: 0; }
+
+body {
+ margin: 0; padding: 0;
+ font: normal 73%/1.5em 'Trebuchet MS', Tahoma, sans-serif;
+ color: #555;
+ background: #FFF url(/site-content/images/bg.jpg) repeat-x;
+ text-align: center;
+}
+
+/* links */
+a { background: inherit; color: #72A545; text-decoration: none; }
+a:hover { background: inherit; color: #006699; text-decoration: underline; }
+
+/* headers */
+h1, h2, h3 { font: bold 1em 'Trebuchet MS', Tahoma, Sans-serif; }
+h1 { font-size: 1.4em; color: #65944A; }
+h2 { font-size: 1.2em; text-transform: uppercase; }
+h3 { font-size: 1.2em; }
+
+p, h1, h2, h3 {
+ margin: 10px 15px;
+}
+.list{
+
+}
+ul, ol {
+ margin: 10px 30px;
+ padding: 0 15px;
+}
+
+/* images */
+img {
+ border: 1px solid #DADADA;
+ padding: 5px;
+ background: #FAFAFA;
+}
+img.float-right {
+ margin: 5px 0px 5px 15px;
+}
+img.float-left {
+ margin: 5px 15px 5px 0px;
+}
+
+code {
+ margin: 5px 0;
+ padding: 10px;
+ text-align: left;
+ display: block;
+ overflow: auto;
+ font: 500 1em/1.5em 'Lucida Console', 'courier new', monospace;
+ /* white-space: pre; */
+ background: #FAFAFA;
+ border: 1px solid #f2f2f2;
+ border-left: 3px solid #72A545;
+}
+acronym {
+ cursor: help;
+ border-bottom: 1px solid #777;
+}
+blockquote {
+ margin: 15px; padding: 0 0 0 20px;
+ background-color: #FAFAFA;
+ background-position: 8px 10px;
+ border: 1px solid #f2f2f2;
+ border-left: 3px solid #72A545;
+ font: bold 1.2em/1.5em "Trebuchet MS", Tahoma, sans-serif;
+ color: #666666;
+}
+
+/* start - table */
+table {
+ border-collapse: collapse;
+ margin: 10px 15px;
+}
+th strong {
+ color: #fff;
+}
+th {
+ background: #74A846;
+ height: 29px;
+ padding-left: 11px;
+ padding-right: 11px;
+ color: #fff;
+ text-align: left;
+ border-left: 1px solid #B6D59A;
+ border-bottom: solid 2px #FFF;
+}
+tr {
+ height: 30px;
+}
+td {
+ padding-left: 11px;
+ padding-right: 11px;
+ /* border-left: 1px solid #FFE1C3; */
+ border-left: 1px solid #FFF;
+ border-bottom: solid 1px #ffffff;
+}
+td.first,th.first {
+ border-left: 0px;
+}
+tr.row-a {
+ background: #F8F8F8;
+}
+tr.row-b {
+ background: #EFEFEF;
+}
+/* end - table */
+
+/* form elements */
+form {
+ margin:10px 15px; padding: 0;
+ border: 1px solid #f2f2f2;
+ background-color: #FAFAFA;
+}
+label {
+ float: left;
+ width: 40%;
+ font-weight:bold;
+ margin:5px 0;
+ margin-right: 1em;
+ text-align: right;
+}
+input {
+ padding: 3px;
+ margin-left: 3%;
+ width: 40%;
+ border:1px solid #eee;
+ font: normal 1em "Trebuchet MS", Tahoma, sans-serif;
+ color:#777;
+}
+select {
+ margin-left: 3%;
+ width: auto;
+}
+textarea {
+ width:40%;
+ margin-left: 3%;
+ padding:3px;
+ font: normal 1em "Trebuchet MS", Tahoma, sans-serif;
+ border:1px solid #eee;
+ height:100px;
+ display:inline;
+ color:#777;
+}
+input.button {
+ width: auto;
+ float: none;
+ font: bold 1em Arial, Sans-serif;
+ background: #FFF url(/site-content/images/gradientbg.jpg) repeat-x;
+ padding: 2px 3px;
+ margin-left: 35%;
+ color: #333;
+ border: 1px solid #DADADA;
+}
+ul.errorlist {
+ width: 60%;
+ color: #ff0000;
+ margin:5px 0;
+ margin-right: 1em;
+ text-align: right;
+}
+
+/* search form */
+.searchform {
+ background-color: transparent;
+ border: none; margin: 0; padding: 0;
+}
+.searchform p { margin: 10px; padding: 0; }
+.searchform input.textbox {
+ width: 130px;
+ color: #333;
+ height: 20px;
+ padding: 2px;
+ vertical-align: top;
+}
+.searchform input.button {
+ font: bold 12px Arial, Sans-serif;
+ color: #333;
+ width: 60px;
+ height: 26px;
+ border: 1px solid #DADADA;
+ padding: 3px 5px;
+ vertical-align: top;
+}
+
+/***********************
+ LAYOUT
+************************/
+
+#header-content, #content, #footer-content {
+ width: 90%;
+}
+
+/* header */
+#header {
+ height: 100px;
+ text-align: center;
+}
+#header-content {
+ margin: 0 auto; padding: 0;
+ position: relative;
+}
+#header-content h1#logo {
+ position: absolute;
+ font: bold 45px 'Trebuchet MS', Sans-serif;
+ letter-spacing: -2px;
+ color: #FFF;
+ margin: 0; padding: 0;
+
+ /* change the values of left and top to adjust the position of the logo */
+ top: 0; left: 0px;
+}
+#header-content h1#logo a {
+ text-decoration: none;
+ color: #FFF;
+}
+#header-content #slogan {
+ position: absolute;
+ font: bold 12px 'Trebuchet Ms', Sans-serif;
+ text-transform: none;
+ color: #FFF;
+ margin: 0; padding: 0;
+
+ /* change the values of left and top to adjust the position of the slogan */
+ top: 55px; left: 40px;
+}
+
+/* header menu */
+#header-content ul {
+ position: absolute;
+ right: -5px; top: 15px;
+ font: bolder 1.3em 'Trebuchet MS', sans-serif;
+ color: #FFF;
+ list-style: none;
+ margin: 0; padding: 0;
+}
+#header-content li {
+ display: inline;
+}
+#header-content li a {
+ float: left;
+ display: block;
+ padding: 3px 12px;
+ color: #FFF;
+ background-color: #333;
+ text-decoration: none;
+ border-right: 1px solid #272727;
+}
+#header-content li a:hover {
+ background: #65944A;
+ color: #FFF;
+}
+#header-content li a#current {
+ background: #65944A;
+ color: #FFF;
+}
+
+/* header photo */
+.headerphoto {
+ margin: 0 auto;
+ width: 90%;
+ height: 200px;
+ padding: 15px 10px 10px 10px;
+ background: #FFF url(/site-content/images/headerphoto.jpg) no-repeat center;
+}
+
+/* content */
+#content-wrap {
+ clear: both;
+ float: left;
+ width: 100%;
+}
+#content {
+ text-align: left;
+ padding: 0;
+ margin: 0 auto;
+}
+
+/* sidebar */
+#sidebar {
+ float: right;
+ width: 30%;
+ margin: 0 0 10px 0; padding: 0;
+}
+#sidebar h1 {
+ padding: 10px 0px 5px 10px;
+ margin: 0;
+ font: bold 1.3em 'Trebuchet MS', Tahoma, Sans-serif;
+}
+.sidebox {
+ background: #F5F5F5;
+ border: 1px solid #EFEDED;
+ margin-bottom: 10px;
+}
+
+/* sidebar menu */
+#sidebar ul.sidemenu {
+ list-style:none;
+ margin: 10px 0 15px 0;
+ padding: 0;
+ background: #F2F2F2;
+}
+#sidebar ul.sidemenu li {
+ padding: 0px 10px;
+}
+#sidebar ul.sidemenu a {
+ display:block;
+ font-weight:normal;
+ color: #333;
+ height: 1.5em;
+ padding:.3em 0 .3em 15px;
+ line-height: 1.5em;
+ border-bottom: 1px dashed #D4D4D4;
+ text-decoration:none;
+}
+#sidebar ul.sidemenu a.top{
+ border-top: 1px dashed #D4D4D4;
+}
+#sidebar ul.sidemenu a:hover {
+ padding: .3em 0 .3em 10px;
+ border-left: 5px solid #65944A;
+ color: #65944A;
+}
+
+/* main */
+#main {
+ float: left;
+ width: 68%;
+ margin: 0 0 10px 0; padding: 0;
+}
+#main h1 {
+ padding: 10px 0px 0px 5px;
+ margin: 0 0 0 10px;
+ border-bottom: 1px solid #f2f2f2;
+ font: normal 1.5em 'Trebuchet MS', Tahoma, Sans-serif;
+}
+
+.post {
+ margin: 0; padding: 0;
+ background: #FFF url(/site-content/images/gradientbg.jpg) repeat-x;
+ border: 1px solid #EFEDED;
+}
+.post .post-footer {
+ background-color: #FAFAFA;
+ border: 1px solid #f2f2f2;
+ padding: 5px; margin-top: 20px;
+ font-size: 95%;
+}
+.post .post-footer .date {
+ background: url(/site-content/images/'clock.gif') no-repeat 0 center;
+ padding-left: 20px; margin: 0 10px 0 5px;
+}
+.post .post-footer .comments {
+ background: url(/site-content/images/'comment.gif') no-repeat 0 center;
+ padding-left: 20px; margin: 0 10px 0 5px;
+}
+.post .post-footer .readmore {
+ background: url(/site-content/images/'page.gif') no-repeat 0 center;
+ padding-left: 20px; margin: 0 10px 0 5px;
+}
+
+/* footer */
+#footer {
+ clear: both;
+ margin: 0; padding: 0;
+ font: normal .95em/1.6em 'Trebuchet MS', Tahoma, Arial, sans-serif;
+ text-align: left;
+}
+
+#footer h1, #footer p { margin-left: 0; }
+
+#footer-content {
+ border-top: 1px solid #EAEAEA;
+ margin: 0 auto;
+ padding-left: 15px;
+}
+#footer-content a {
+ text-decoration: none;
+ color: #777;
+}
+#footer-content a:hover {
+ text-decoration: underline;
+ color: #333;
+}
+#footer-content ul {
+ list-style: none;
+ margin: 0; padding: 0;
+}
+#footer-content .col {
+ width: 32%;
+ padding: 0 5px 30px 0;
+}
+#footer-content .col2 {
+ width: 33%;
+ padding: 0 0 30px 0;
+}
+
+/* alignment classes */
+.float-left { float: left; }
+.float-right { float: right; }
+.align-left { text-align: left; }
+.align-right { text-align: right; }
+
+/* additional classes */
+.clear { clear: both; }
+.gray { color: #BFBFBF; }
+
+
+/* My Form Elements */
+div.review-center-box {
+ margin:10px 15px;
+ padding: 10px;
+ height: auto;
+ border: 1px solid #f2f2f2;
+ background-color: #FAFAFA;
+}
+div.review-left {
+ float: left;
+ width: 20%;
+ font-weight:bold;
+ margin: 0 5% 1em 20%;
+ text-align: right;
+}
+div.review-right {
+ width: 80%;
+ margin: 1px 0 0 10%;
+ font: normal 1em "Trebuchet MS", Tahoma, sans-serif;
+ color:#777;
+}
\ No newline at end of file
Binary file app/site-content/images/bg.jpg has changed
Binary file app/site-content/images/bullet.gif has changed
Binary file app/site-content/images/clock.gif has changed
Binary file app/site-content/images/comment.gif has changed
Binary file app/site-content/images/firefox-gray.jpg has changed
Binary file app/site-content/images/gradientbg.jpg has changed
Binary file app/site-content/images/headerphoto.jpg has changed
Binary file app/site-content/images/page.gif has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/site-content/proposals/2009/07/28/arm.py Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,6 @@
+for i in range(100, 1000):
+ a = i % 10
+ b = (i / 10) % 10
+ c = (i / 100) % 10
+ if i == a ** 3 + b ** 3 + c ** 3:
+ print "Armstrong Number: ", i
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/site-content/proposals/2009/07/28/arm_.py Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,6 @@
+for i in range(100, 1000):
+ a = i % 10
+ b = (i / 10) % 10
+ c = (i / 100) % 10
+ if i == a ** 3 + b ** 3 + c ** 3:
+ print "Armstrong Number: ", i
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/site-content/proposals/2009/07/29/c.c Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,27 @@
+#include <stdio.h>
+
+main()
+{
+
+ int n, count = 1;
+ float x, sum = 0,average;
+ do {
+ printf("how many numbers? ");
+ scanf("%d", &n);
+ sum = 0;
+ count = 1;
+ while (count <= n) {
+ printf("x = ");
+ printf("\n(to end program, enter 0 for x): ");
+ scanf("%f", &x);
+ if (x == 0)
+ break;
+ sum += x;
+ ++count;
+ }
+ average = sum/n;
+ printf("\nthe average is %f\n", average);
+ } while (x != 0);
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/templates/projrev/base.html Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+
+<meta name="Keywords" content="sakshath, National Mission on Education, NME, ICT" />
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<meta name="Author" content="Madhusudan.C.S - madhusudancs@gmail.com" />
+<meta name="Robots" content="index,follow" />
+
+{% block scripts %}
+<link rel="stylesheet" href="/site-content/css/projrev.css" type="text/css"/>
+{% endblock scripts %}
+
+<title>National Mission on Education through ICT</title>
+
+</head>
+
+<body>
+{% block body %}
+<!-- wrap starts here -->
+<div id="wrap">
+
+ {% block header %}
+ <div id="header"><div id="header-content">
+
+ <h1 id="logo"><a href="index.html" title="">National Mission on Education <span class="gray">through ICT</span></a></h1>
+ </div></div>
+
+ <div class="headerphoto"></div>
+ {% endblock header %}
+
+ <!-- content-wrap starts here -->
+ <div id="content-wrap"><div id="content">
+
+ {% block sidebar %}
+ <div id="sidebar" >
+
+ <div class="sidebox">
+
+ <h1>Short About</h1>
+
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec libero. Suspendisse bibendum.
+ Cras id urna. Morbi tincidunt, orci ac convallis aliquam, lectus turpis varius lorem, eu
+ posuere nunc justo tempus leo.</p>
+
+ </div>
+
+ <div class="sidebox">
+
+ <h1>Sponsors</h1>
+ <ul class="sidemenu">
+ <li><a href="http://www.dreamhost.com/r.cgi?287326" class="top">Dreamhost</a></li>
+ <li><a href="http://www.4templates.com/?aff=ealigam">4templates</a></li>
+ <li><a href="http://store.templatemonster.com/?aff=ealigam">TemplateMonster</a></li>
+ <li><a href="http://www.fotolia.com/partner/114283">Fotolia.com</a></li>
+ <li><a href="http://www.text-link-ads.com/?ref=40025">Text Link Ads</a></li>
+ </ul>
+
+ </div>
+
+ <div class="sidebox">
+
+ <h1>Search Box</h1>
+ <form action="#" class="searchform">
+ <p>
+ <input name="search_query" class="textbox" type="text" />
+ <input name="search" class="button" value="Search" type="submit" />
+ </p>
+ </form>
+
+ </div>
+
+ </div>
+ {% endblock sidebar %}
+
+ <div id="main">
+ {% block content %}
+ {% comment %} To be filled in inherited templates {% endcomment %}
+ {% endblock content %}
+ </div>
+
+ </div></div>
+
+{% block footer %}
+<div id="footer"><div id="footer-content">
+
+ <div class="col float-left">
+ <h1>Site Partners</h1>
+ <ul>
+ <li><a href="http://www.dreamhost.com/r.cgi?287326"><strong>Dreamhost</strong> - Affordable & Reliable Webhosting</a></li>
+ <li><a href="http://www.4templates.com/?aff=ealigam"><strong>4templates</strong> - Low Cost Hi-Quality Templates</a></li>
+ <li><a href="http://store.templatemonster.com/?aff=ealigam"><strong>TemplateMonster</strong> - Best templates on the net!</a></li>
+ <li><a href="http://www.fotolia.com/partner/114283"><strong>Fotolia</strong> - Free stock images or from $1</a></li>
+ <li><a href="http://www.text-link-ads.com/?ref=40025"><strong>Text Link Ads</strong> - Easiest. Money. Ever.</a></li>
+ </ul>
+ </div>
+
+ <div class="col float-left">
+ <h1>Links</h1>
+ <ul>
+ <li><a href="http://www.openwebdesign.org/">openwebdesign.org</a></li>
+ <li><a href="http://www.opendesigns.org/">Opendesigns.org</a></li>
+ <li><a href="http://www.pdphoto.org/">PDPhoto.org</a></li>
+ <li><a href="http://www.alistapart.com">Alistapart</a></li>
+ <li><a href="http://www.cssremix.com">CSS Remix</a></li>
+ </ul>
+ </div>
+
+ <div class="col2 float-right">
+ <p>
+ © copyright 2006 <strong>Your Company Name</strong><br />
+ Design by: <a href="index.html"><strong>styleshout</strong></a>
+ Valid <a href="http://jigsaw.w3.org/css-validator/check/referer"><strong>CSS</strong></a> |
+ <a href="http://validator.w3.org/check/referer"><strong>XHTML</strong></a>
+ </p>
+
+ <ul>
+ <li><a href="index.html"><strong>Home</strong></a></li>
+ <li><a href="index.html"><strong>Sitemap</strong></a></li>
+ <li><a href="index.html"><strong>RSS Feed</strong></a></li>
+ </ul>
+ </div>
+
+</div></div>
+{% endblock footer %}
+
+<!-- wrap ends here -->
+</div>
+{% endblock body %}
+</body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/templates/projrev/proposal/list.html Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,25 @@
+{% extends "projrev/base.html" %}
+{% block content %}
+<div class="post">
+ <div class="list">
+ <table>
+ <tr>
+ <th class="first">MICR Code</th>
+ <th>Line Item</th>
+ <th>Institution</th>
+ <th>State</th>
+ <th>District</th>
+ </tr>
+ {% for project in projects %}
+ <tr class="row-a"><td><a href='{{ row_url }}{{ project.micr_code }}'>
+ {{ project.micr_code }}</td>
+ <td>{{ project.line_item }}</td>
+ <td>{{ project.institution }}</td>
+ <td>{{ project.state }}</td>
+ <td>{{ project.district }}</td>
+ </a></tr>
+ {% endfor %}
+ </table>
+ </div>
+</div>
+{% endblock content %}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/templates/projrev/proposal/rank.html Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,132 @@
+{% extends "projrev/base.html" %}
+{% block content %}
+<div class="post">
+
+ <a name="TemplateInfo"></a>
+ <h1>Review the proposal</h1>
+
+ <p>The proposal details are given below followed by a Review form.</p>
+
+ <div class='review-center-box'>
+ <div class='review-left'>
+ Project MICR Code:
+ </div>
+ <div class='review-right'>
+ {{ project.micr_code }}
+ </div>
+ <br/>
+ <div class='review-left'>
+ Institution:
+ </div>
+ <div class='review-right'>
+ {{ project.institution }}
+ </div>
+ <br/>
+ <div class='review-left'>
+ Project Line Item:
+ </div>
+ <div class='review-right'>
+ {{ project.line_item }}
+ </div>
+ <br/>
+ <div class='review-left'>
+ State:
+ </div>
+ <div class='review-right'>
+ {{ project.state }}
+ </div>
+ <br/>
+ <div class='review-left'>
+ District:
+ </div>
+ <div class='review-right'>
+ {{ project.district }}
+ </div>
+ <br/>
+ <div class='review-left'>
+ Proposal Document:
+ </div>
+ <div class='review-right'>
+ <a href="/site-content/{{ proposal_path }}">{{ proposal_name }}</a>
+ </div>
+ </div>
+
+ <p class="post-footer align-right">
+ <div class='review-left'>
+ Attribute Name
+ </div>
+ <div class='review-right'>
+ <b>Score</b>
+ </div>
+ <br />
+ <div class='review-left'>
+ Attribute 1:
+ </div>
+ <div class='review-right'>
+ {{ review_score.0 }}
+ </div>
+ <br />
+ <div class='review-left'>
+ Attribute 2:
+ </div>
+ <div class='review-right'>
+ {{ review_score.1 }}
+ </div>
+ <br />
+ <div class='review-left'>
+ Attribute 3:
+ </div>
+ <div class='review-right'>
+ {{ review_score.2 }}
+ </div><br />
+ <div class='review-left'>
+ Attribute 4:
+ </div>
+ <div class='review-right'>
+ {{ review_score.3 }}
+ </div><br />
+ <div class='review-left'>
+ Attribute 5:
+ </div>
+ <div class='review-right'>
+ {{ review_score.4 }}
+ </div><br />
+ <div class='review-left'>
+ Attribute 6:
+ </div>
+ <div class='review-right'>
+ {{ review_score.5 }}
+ </div><br />
+ <div class='review-left'>
+ Attribute 7:
+ </div>
+ <div class='review-right'>
+ {{ review_score.6 }}
+ </div><br />
+ <div class='review-left'>
+ Attribute 8:
+ </div>
+ <div class='review-right'>
+ {{ review_score.7 }}
+ </div><br />
+ <div class='review-left'>
+ Attribute 9:
+ </div>
+ <div class='review-right'>
+ {{ review_score.8 }}
+ </div><br />
+ <div class='review-left'>
+ Overall Score:
+ </div>
+ <div class='review-right'>
+ {{ total_score }}
+ </div>
+ </p>
+ <p class="post-footer align-right">
+ <span class="comments">Reviews (5)</span>
+ <span class="date">Last reviewed: Nov 11, 2006</span>
+ <span class="date">Last submitted: Nov 11, 2006</span>
+ </p>
+
+</div>
+{% endblock content %}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/templates/projrev/proposal/review.html Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,68 @@
+{% extends "projrev/base.html" %}
+{% block content %}
+<div class="post">
+
+ <a name="TemplateInfo"></a>
+ <h1>Review the proposal</h1>
+
+ <p>The proposal details are given below followed by a Review form.</p>
+
+ <div class='review-center-box'>
+ <div class='review-left'>
+ Project MICR Code:
+ </div>
+ <div class='review-right'>
+ {{ project.micr_code }}
+ </div>
+ <br/>
+ <div class='review-left'>
+ Institution:
+ </div>
+ <div class='review-right'>
+ {{ project.institution }}
+ </div>
+ <br/>
+ <div class='review-left'>
+ Project Line Item:
+ </div>
+ <div class='review-right'>
+ {{ project.line_item }}
+ </div>
+ <br/>
+ <div class='review-left'>
+ State:
+ </div>
+ <div class='review-right'>
+ {{ project.state }}
+ </div>
+ <br/>
+ <div class='review-left'>
+ District:
+ </div>
+ <div class='review-right'>
+ {{ project.district }}
+ </div>
+ <br/>
+ <div class='review-left'>
+ Proposal Document:
+ </div>
+ <div class='review-right'>
+ <a href="/site-content/{{ proposal_path }}">{{ proposal_name }}</a>
+ </div>
+ </div>
+ <form enctype="multipart/form-data" method="post" action="">
+ <p>
+ {{ form.as_p }}
+ <br />
+ <input class="button" type="submit" value="Submit Review" />
+ </p>
+ </form>
+
+ <p class="post-footer align-right">
+ <span class="comments">Reviews (5)</span>
+ <span class="date">Last reviewed: Nov 11, 2006</span>
+ <span class="date">Last submitted: Nov 11, 2006</span>
+ </p>
+
+</div>
+{% endblock content %}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/templates/projrev/proposal/submit.html Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,25 @@
+{% extends "projrev/base.html" %}
+{% block content %}
+<div class="post">
+
+ <a name="TemplateInfo"></a>
+ <h1>Submit your proposal</h1>
+
+ <p>Fill up the form below, and upload your proposal file by clicking on Browse.</p>
+
+ <form enctype="multipart/form-data" method="post" action="">
+ <p>
+ {{ form.as_p }}
+ <br />
+ <input class="button" type="submit" value="Submit Proposal" />
+ </p>
+ </form>
+
+ <p class="post-footer align-right">
+ <span class="comments">Reviews (5)</span>
+ <span class="date">Last reviewed: Nov 11, 2006</span>
+ <span class="date">Last submitted: Nov 11, 2006</span>
+ </p>
+
+</div>
+{% endblock content %}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/urls.py Tue Aug 04 02:21:15 2009 -0400
@@ -0,0 +1,31 @@
+from django.conf.urls.defaults import *
+from django.conf import settings
+
+
+# Uncomment the next two lines to enable the admin:
+from django.contrib import admin
+admin.autodiscover()
+
+urlpatterns = patterns('',
+ # Example:
+ # (r'^app/', include('app.foo.urls')),
+
+ # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
+ # to INSTALLED_APPS to enable admin documentation:
+ (r'^admin/doc/', include('django.contrib.admindocs.urls')),
+
+ # Uncomment the next line to enable the admin:
+ (r'^admin/', include(admin.site.urls)),
+ (r'^login/$', 'app.projrev.views.login.login_validate'),
+ (r'^logout/$', 'app.projrev.views.login.logout_view'),
+ (r'^proposal/submit/$', 'app.projrev.views.proposal.submit'),
+ (r'^proposal/review/$', 'app.projrev.views.proposal.review'),
+ (r'^proposal/review/(?P<micr_code>[A-Z]{6}\d{9})/$',
+ 'app.projrev.views.proposal.review'),
+ (r'^proposal/rank/$', 'app.projrev.views.proposal.rank'),
+ (r'^proposal/rank/(?P<micr_code>[A-Z]{6}\d{9})$',
+ 'app.projrev.views.proposal.rank'),
+ (r'^site-content/(?P<path>.*)', 'django.views.static.serve',
+ {'document_root': settings.MEDIA_ROOT}),
+
+)