app/projrev/models.py
author Madhusudan.C.S <madhusudancs@gmail.com>
Fri, 14 Aug 2009 11:07:24 +0530
changeset 49 33c54f815fd5
parent 47 09c3b7aaa535
permissions -rw-r--r--
Changed rank list.html to be consistent with review list.

"""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


def dict_tuple(d):
  """Function to return a tuple from dictionary
  """

  return  [(v, k) for k, v in d.items()]
  

def sort_dict(d):
  """Function to sort dictionary elements.
  """

  items =  [(v, k) for k, v in d.items()]
  items.sort()
  return [(k, v) for v, k in items]


class Project(models.Model):
  """Model class for NME funded projects.
  """

  LINE_ITEM_CHOICES = [
      ("NP", "NPTEL  phase II / III"),
      ("PG", "PG Classes"),
      ("UG", "UG Classes"),
      ("VC", "Video content digitization, conversion,  chunking and dubbing CEC / IGNOU / NCERT / SIET / OTHERS"),
      ("PE", "Provision of e-books and e-journals free to the learners"),
      ("SQ", "Standardisation of quality assurance of contents & certification / automation of certification"),
      ("DS", "Developing suitable pedagogical methods for various classes, intellectual calibers and research in e-learning"),
      ("DL", "Development of language converter and translation tool kit"),
      ("DR", "Development and realization of Virtual Reality Laboratories and supporting facilities for e-learning"),
      ("DC", "Development of Certification & Testing Modules for Virtual Technological Universities & creation of VTU, multi media research and international programmes"),
      ("ED", "Experimentation and Development of ultra low cost access devices for wider coverage of learners & their field trials"),
      ("TT", "Talk to a teacher to provide a substitute for coaching for the economically poor students"),
      ("DH", "Development of software controlled hardware programming for robotics other crucial areas"),
      ("AD", "Adaptation & deployment of open source simulation packages equivalent to MATLAB, ORCAD etc."),
      ("DU", "Development of unified ERP system for Educational Institutions"),
      ("PT", "Publicity & training of motivators & trainers to ensure full utilization of the systems by institutions & students. Teacher Empowerment 'B'"),
      ("CC", "Conversion of available content in various regional languages"),
      ("DV", "Development of Vocational Educational modules and use of haptic devices for education & training"),
      ]

  STATE_CHOICES = {
      "AN": "Andaman & Nicobar", 
      "DN": "Dadra and Nagar Haveli", 
      "DL": "Delhi", 
      "WB": "West Bengal", 
      "HR": "Haryana", 
      "HP": "Himachal Pradesh", 
      "UP": "Uttar Pradesh", 
      "JH": "Jharkhand", 
      "BR": "Bihar", 
      "JK": "Jammu & Kashmir", 
      "TN": "Tamil Nadu", 
      "LD": "Lakshadweep", 
      "NL": "Nagaland", 
      "PY": "Pondicherry", 
      "TR": "Tripura", 
      "PB": "Punjab", 
      "DD": "Daman & Diu", 
      "RJ": "Rajasthan", 
      "CH": "Chandigarh", 
      "CG": "Chattisgarh", 
      "AP": "Andhra Pradesh", 
      "AS": "Assam", 
      "AR": "Arunachal Pradesh", 
      "GA": "Goa", 
      "GJ": "Gujarat", 
      "KA": "Karnataka", 
      "UA": "Uttarakhand", 
      "ML": "Meghalaya", 
      "MN": "Manipur", 
      "MH": "Maharashtra", 
      "KL": "Kerala", 
      "SK": "Sikkim", 
      "MP": "Madhya Pradesh", 
      "OR": "Orissa", 
      "MZ": "Mizoram"
      }

  DISTRICT_CHOICES = {
      "JHES": "Purba Singhbhum", 
      "TNRA": "Ramanathapuram", 
      "PBAM": "Amritsar", 
      "ORMY": "Mayurbhanj", 
      "UPMG": "Maharajganj", 
      "ORML": "Malkangiri", 
      "MZAI": "Aizawl", 
      "NLKO": "Kohima", 
      "PBFR": "Faridkot", 
      "ARPA": "Papum Pare", 
      "SKES": "East Sikkim", 
      "UAPI": "Pithoragharh", 
      "MHNS": "Nashik", 
      "PBFI": "Firozpur", 
      "KAKD": "Kodagu", 
      "APRA": "Rangareddi", 
      "BRSO": "Sheohar", 
      "UPSV": "Shravasti", 
      "KAKL": "Kolar District", 
      "PYPO": "Puducherry", 
      "UPSU": "Sultanpur", 
      "UPSR": "Sant Ravidas Nagar", 
      "MHRT": "Ratnagiri", 
      "UPSN": "Siddharthnagar", 
      "PBHO": "Hoshiarpur", 
      "UPSJ": "Shahjahanpur", 
      "KAKP": "Koppal District", 
      "UPSI": "Sitapur", 
      "BRSP": "Sheikhpura", 
      "BRSR": "Saran", 
      "BRSU": "Supaul", 
      "BRST": "Sitamarhi", 
      "BRSW": "Siwan", 
      "UPSA": "Saharanpur", 
      "KADH": "Dharwad District", 
      "JHLO": "Lohardaga", 
      "ASSO": "Sonitpur", 
      "KADK": "Dakshina Kannada", 
      "ASSI": "Sibsagar", 
      "KADA": "Davanagere District", 
      "ORJP": "Jajapur (Jajpur)", 
      "ORJS": "Jagatsinghpur", 
      "UPMP": "Mainpuri", 
      "MHBU": "Buldhana", 
      "TNKR": "Karur", 
      "WBME": "Midnapore", 
      "UPUN": "Unnao", 
      "TNKC": "Kanchipuram", 
      "SKSS": "South Sikkim", 
      "MPUM": "Umaria", 
      "JKJA": "Jammu", 
      "MPUJ": "Ujjain", 
      "CGMA": "Mahasamund", 
      "GJPA": "Patan", 
      "UACL": "Chamoli", 
      "PYMA": "Mahe", 
      "GJPO": "Porbandar", 
      "GJPM": "Panchmahal", 
      "RJHA": "Hanumangarh", 
      "WBDD": "Dakshin Dinajpur", 
      "WBDA": "Darjeeling", 
      "HPUN": "Una", 
      "PBFT": "Fatehgarh Sahib", 
      "MHLA": "Latur", 
      "GJVD": "Vadodara", 
      "UPLK": "Lakhimpur Kheri", 
      "JHBO": "Bokaro", 
      "HRHI": "Hissar", 
      "WBJA": "Jalpaiguri", 
      "UPDE": "Deoria", 
      "MPRE": "Rewa", 
      "MPRG": "Rajgarh", 
      "MPRL": "Ratlam", 
      "ASLA": "Lakhimpur", 
      "MPRS": "Raisen", 
      "HPMA": "Mandi", 
      "PBMU": "Mukatsar", 
      "BRPA": "Patna", 
      "BRRO": "Rohtas", 
      "PBMA": "Mansa", 
      "BRPU": "Purnia", 
      "PBMO": "Moga", 
      "RJSR": "Sirohi", 
      "MHAH": "Ahmednagar", 
      "MHAK": "Akola", 
      "MHAM": "Amrawati", 
      "HRSN": "Sonepat", 
      "MHAU": "Aurangabad", 
      "ARTI": "Tirap", 
      "PBBA": "Bathinda", 
      "RJSK": "Sikar", 
      "KAUD": "Udupi District", 
      "RJSM": "Sawai Madhopur", 
      "RJAJ": "Ajmer", 
      "APVZ": "Vizianagaram", 
      "RJAL": "Alwar", 
      "MHWR": "Wardha", 
      "MHWS": "Washim", 
      "APVS": "Vishakhapatnam", 
      "KAHV": "Haveri District", 
      "KAHS": "Hassan District", 
      "MPGW": "Gwalior", 
      "MPGU": "Guna", 
      "JHPK": "Pakur", 
      "JHPL": "Palamu", 
      "UPEW": "Etawah", 
      "UPKU": "Kushinagar", 
      "UPKS": "Kaushambi", 
      "BRSH": "Saharsa", 
      "UPKD": "Kanpur Dehat", 
      "PBPA": "Patiala", 
      "UPKN": "Kanpur Nagar", 
      "BRSM": "Samastipur", 
      "UPVA": "Varanasi", 
      "UPKJ": "Kannauj", 
      "APCH": "Chittoor", 
      "HRRE": "Rewari", 
      "NLZU": "Zunheboto", 
      "BRBU": "Buxar", 
      "HRRO": "Rohtak", 
      "TNCH": "Chennai", 
      "BRBJ": "Bhojpur", 
      "UATG": "Tehri Garhwal", 
      "BRBG": "Bhagalpur", 
      "BRBE": "Begusarai", 
      "BRBA": "Banka", 
      "MHHI": "Hingoli", 
      "UPJP": "Jyotiba Phule Nagar", 
      "GJBR": "Bharuch", 
      "GJBV": "Bhavnagar", 
      "GJBK": "Banaskantha", 
      "TRST": "South Tripura", 
      "GANG": "North Goa", 
      "ORPU": "Puri", 
      "KACK": "Chikballapur District", 
      "UPSO": "Sonbhadra", 
      "HRMW": "Mewat", 
      "RJTO": "Tonk", 
      "NLDI": "Dimapur", 
      "HRMA": "Mahendragarh", 
      "UPSK": "Sant Kabir Nagar", 
      "MZCH": "Champhai", 
      "BRLA": "Lakhisarai", 
      "UPJH": "Jhansi", 
      "ARAJ": "Anjaw", 
      "UAUS": "Udham Singh Nagar", 
      "UPRB": "Rae Bareli", 
      "UAUT": "Uttarkashi", 
      "ASTI": "Tinsukia", 
      "KLKL": "Kollam", 
      "KLKN": "Kannur", 
      "KLKS": "Kasaragod", 
      "KLKT": "Kottayam", 
      "KLKZ": "Kozhikode", 
      "MHBI": "Beed", 
      "MPHA": "Harda", 
      "MHBH": "Bhandara", 
      "MHST": "Satara", 
      "MPHO": "Hoshangabad", 
      "MHSN": "Sangli", 
      "MHSO": "Solapur", 
      "ASBA": "Barpeta", 
      "KASH": "Shimoga District", 
      "MHSI": "Sindhudurg", 
      "ASBO": "Bongaigaon", 
      "MZLU": "Lunglei", 
      "MPCT": "Chhatarpur", 
      "BRKI": "Kishanganj", 
      "BRKH": "Khagaria", 
      "HPSO": "Solan", 
      "KLTV": "Thiruvananthapuram", 
      "BRKM": "Kaimur", 
      "HPSH": "Shimla", 
      "KLTS": "Thrissur", 
      "MNCC": "Churachandpur", 
      "ORBH": "Bhadrak", 
      "MZLA": "Lawngtlai", 
      "BRKT": "Katihar", 
      "ORJH": "Jharsuguda", 
      "MPCN": "Chhindwara", 
      "APCU": "Kadapa", 
      "ORBD": "Boudh (Bauda)", 
      "PYKA": "Karaikal", 
      "UPGZ": "Ghaziabad", 
      "UPGR": "Gorkakhpur", 
      "UPGP": "Ghazipur", 
      "GASG": "South Goa", 
      "JHCH": "Chatra", 
      "MHOS": "Osmanabad", 
      "UPGN": "Gonda", 
      "GJAH": "Ahmedabad", 
      "WBNA": "Nadia", 
      "GJAM": "Amreli District", 
      "GJAN": "Anand", 
      "JKBR": "Baramula", 
      "APGU": "Guntur", 
      "ASMA": "Marigaon", 
      "JKBD": "Badgam", 
      "WBUD": "Uttar Dinajpur", 
      "TNSI": "Sivagangai", 
      "TNSA": "Salem", 
      "MHDH": "Dhule", 
      "PBNS": "Nawan Shehar", 
      "PBGU": "Gurdaspur", 
      "ARWK": "West Kameng", 
      "RJPA": "Pali", 
      "UPAG": "Agra", 
      "WBBI": "Birbhum", 
      "RJPG": "Pratapgarh", 
      "JKPO": "Poonch", 
      "KLPL": "Palakkad", 
      "APPR": "Prakasam", 
      "KLPT": "Pathanamthitta", 
      "TNAY": "Ariyalur", 
      "JKPU": "Pulwama", 
      "RJBW": "Bhilwara", 
      "RJBN": "Banswara", 
      "AREL": "Lohit", 
      "RJBM": "Barmer", 
      "AREK": "East Kameng", 
      "RJBI": "Bikaner", 
      "ORCU": "Cuttack", 
      "RJBU": "Bundi", 
      "RJBR": "Baran", 
      "KLWA": "Wayanad", 
      "RJBP": "Bharatpur", 
      "MHYA": "Yavatmal", 
      "ORAN": "Angul", 
      "UPAU": "Auraiya", 
      "WBMA": "Malda", 
      "MPTI": "Tikamgarh", 
      "GJSN": "Surendranagar", 
      "APNE": "Nellore", 
      "GJSK": "Sabarkantha", 
      "APNI": "Nizamabad", 
      "DLSW": "South West Delhi", 
      "BRGA": "Gaya", 
      "DLSD": "South Delhi", 
      "GJST": "Surat", 
      "UPBD": "Badaun", 
      "ORSO": "Subarnapur (Sonepur)", 
      "JHGI": "Giridih", 
      "JHGO": "Godda", 
      "WBHR": "Howrah", 
      "TNTJ": "Thanjavur", 
      "TNTK": "Thoothukudi", 
      "JHGA": "Garhwa", 
      "TNTI": "Tirunelveli", 
      "TNTL": "Thiruvallur", 
      "ORSA": "Sambalpur", 
      "KLER": "Ernakulam", 
      "TNKK": "Kanyakumari", 
      "TNTP": "Tiruppur", 
      "TNTV": "Tiruvannamalai", 
      "WBMU": "Murshidabad", 
      "MHKO": "Kolhapur", 
      "ORSU": "Sundargarh (Sundergarh)", 
      "UPBG": "Bagpat", 
      "JHGU": "Gumla", 
      "SKNS": "North Sikkim", 
      "RJUD": "Udaipur", 
      "TRDH": "Dhalai", 
      "MLEG": "East Garo Hills", 
      "UPCD": "Chandauli", 
      "HRJH": "Jhajjar", 
      "HRJI": "Jind", 
      "MLSG": "South Garo Hills", 
      "DLCD": "Central Delhi", 
      "UPCT": "Chitrakoot", 
      "MNUK": "Ukhrul", 
      "DLED": "East Delhi", 
      "PBJA": "Jalandhar", 
      "CGRN": "Rajnandgaon", 
      "PYYA": "Yanam", 
      "KABG": "Belgaum District", 
      "KABD": "Bidar District", 
      "KABJ": "Bijapur District", 
      "KABK": "Bagalkot District", 
      "CGRG": "Raigarh", 
      "KABN": "Bangalore Urban district", 
      "KABL": "Bellary District", 
      "KABR": "Bangalore Rural District", 
      "UPPR": "Pratapgarh", 
      "CGRP": "Raipur", 
      "TNTC": "Tiruchirappalli", 
      "UPME": "Meerut", 
      "MLEK": "East Khasi Hills", 
      "DLWD": "West Delhi", 
      "UPMB": "Mau", 
      "UPMO": "Moradabad", 
      "UPMH": "Mahoba", 
      "KATU": "Tumkur District", 
      "MPKA": "Katni", 
      "UPMT": "Mathura", 
      "UPMU": "Muzaffarnagar", 
      "TNMA": "Madurai", 
      "JKLE": "Leh", 
      "APMA": "Mahbubnagar", 
      "ASCA": "Cachar", 
      "APME": "Medak", 
      "MHRG": "Raigad", 
      "MPBP": "Bhopal", 
      "MPBR": "Barwani", 
      "MNBI": "Bishnupur", 
      "GJVL": "Valsad", 
      "NLPH": "Phek", 
      "RJNA": "Nagaur", 
      "BRDA": "Darbhanga", 
      "MPBE": "Betul", 
      "MPBD": "Bhind", 
      "PBLU": "Ludhiana", 
      "MPBL": "Balaghat", 
      "MZKO": "Kolasib", 
      "APNA": "Nalgonda", 
      "HPBI": "Bilaspur", 
      "UPJU": "Jaunpur District", 
      "GJDG": "The Dangs", 
      "GJDA": "Dahod", 
      "WBHG": "Hooghly", 
      "NLWO": "Wokha", 
      "MPPA": "Panna", 
      "UPJL": "Jalaun", 
      "ASJO": "Jorhat", 
      "WBKO": "Kolkata", 
      "HPKU": "Kulu", 
      "HRSI": "Sirsa", 
      "MLJH": "Jaintia Hills", 
      "HPKI": "Kinnaur", 
      "UADD": "Dehradun", 
      "UACP": "Champawat", 
      "HPKA": "Kangra", 
      "TNPU": "Pudukkottai", 
      "JHKO": "Koderma", 
      "UPRA": "Rampur", 
      "TNPE": "Perambalur", 
      "HRAM": "Ambala", 
      "MHGO": "Gondiya", 
      "KLAL": "Alappuzha", 
      "MHGA": "Gadchiroli", 
      "KAMA": "Mandya District", 
      "BRMP": "Madhepura", 
      "BRMZ": "Muzaffarpur", 
      "BRMG": "Munger", 
      "JKSR": "Samba", 
      "BRMB": "Madhubani", 
      "KAMY": "Mysore District", 
      "RJGA": "Ganganagar", 
      "BRGO": "Gopalganj", 
      "ORDH": "Dhenkanal", 
      "MPEN": "Khandwa (East Nimar)", 
      "JHRA": "Ranchi", 
      "JHRM": "Ramgarh District", 
      "BRVA": "Vaishali", 
      "HPLS": "Lahaul and Spiti", 
      "GJKA": "Kutch", 
      "UARP": "Rudraprayag", 
      "GJKH": "Kheda", 
      "MPSI": "Sidhi", 
      "MPWN": "Khargone (West Nimar)", 
      "PBRU": "Rupnagar", 
      "MNSE": "Senapati", 
      "APAN": "Anantapur", 
      "NLTU": "Tuensang", 
      "CGJA": "Jashpur", 
      "ASGG": "Golaghat", 
      "CGJC": "Janjgir-Champa", 
      "APAD": "Adilabad", 
      "RJJW": "Jhalawar", 
      "UPMI": "Mirzapur", 
      "RJJS": "Jaisalmer", 
      "RJJP": "Jaipur", 
      "ASGP": "Goalpara", 
      "RJJL": "Jalore", 
      "RJJJ": "Juhnjhunun", 
      "HPHA": "Hamirpur", 
      "MPSR": "Sehore", 
      "TNTH": "Theni", 
      "MLWG": "West Garo Hills", 
      "CGDH": "Dhamtari", 
      "MHND": "Nanded", 
      "MHNG": "Nagpur", 
      "MLWK": "West Khasi Hills", 
      "CGDA": "Dantewada", 
      "HRFT": "Fatehabad", 
      "CGDU": "Durg", 
      "HRFR": "Faridabad", 
      "TNTR": "Thiruvarur", 
      "UPFI": "Firozabad", 
      "JKAN": "Anantnag", 
      "UPFT": "Fatehpur", 
      "ASNL": "Nalbari", 
      "APKA": "Karimnagar", 
      "HRPP": "Panipat", 
      "UPFR": "Farrukhabad", 
      "ASNG": "Nagaon", 
      "ASNC": "North Cachar Hills", 
      "UPFZ": "Faizabad", 
      "MNTH": "Thoubal", 
      "WBPN": "North 24 Parganas", 
      "TRWT": "West Tripura", 
      "MNTA": "Tamenglong", 
      "PBKA": "Kapurthala", 
      "RJDA": "Dausa", 
      "WBPS": "South 24 Parganas", 
      "UPPI": "Pilibhit", 
      "KLMA": "Malappuram", 
      "ARCH": "Changlang", 
      "WBPU": "Purulia", 
      "MHCH": "Chandrapur", 
      "KACJ": "Chamarajnagar District", 
      "ORKN": "Kandhamal", 
      "ORKO": "Koraput", 
      "ORKL": "Kalahandi", 
      "ORKJ": "Kendujhar (Keonjhar)", 
      "ORKH": "Khordha", 
      "NLMK": "Mokokchung", 
      "ORKP": "Kendrapara", 
      "NLMN": "Mon", 
      "KACT": "Chitradurga District", 
      "CGSU": "Surguja", 
      "MPNE": "Neemuch", 
      "TNNM": "Namakkal", 
      "MPNA": "Narsinghpur", 
      "TNNI": "The Nilgiris", 
      "TNNG": "Nagapattinam", 
      "APHY": "Hyderabad", 
      "UANA": "Nainital", 
      "APSR": "Srikakulam", 
      "RJCR": "Churu", 
      "RJCT": "Chittorgarh", 
      "MZMA": "Mamit", 
      "MHMC": "Mumbai City", 
      "UPET": "Etah", 
      "GJGA": "Gandhinagar", 
      "MHMU": "Mumbai suburban", 
      "WBKB": "Cooch Behar", 
      "HPCH": "Chamba", 
      "MPSG": "Sagar", 
      "HRPK": "Panchkula", 
      "ASKR": "Karimganj", 
      "MPSO": "Seoni", 
      "GJNV": "Navsari", 
      "MPSJ": "Shajapur", 
      "MPSH": "Shahdol", 
      "GJNR": "Narmada", 
      "MPSV": "Shivpuri", 
      "MPST": "Satna", 
      "ASKA": "Karbi Anglong", 
      "MPSP": "Sheopur", 
      "APEG": "East Godavari", 
      "HRPW": "Palwal", 
      "JKDO": "Doda", 
      "ASKK": "Kokrajhar", 
      "JHDU": "Dumka", 
      "ORRA": "Rayagada", 
      "JHDE": "Deoghar", 
      "MHJG": "Jalgaon", 
      "HRBH": "Bhiwani", 
      "TNDH": "Dharmapuri", 
      "JHDH": "Dhanbad", 
      "MHJN": "Jalna", 
      "UPBI": "Bijnor", 
      "UPBH": "Bahraich", 
      "UPBL": "Ballia", 
      "UPBN": "Banda District", 
      "HRKR": "Karnal", 
      "UPBB": "Barabanki", 
      "MZSE": "Serchhip", 
      "HRKU": "Kurukshetra", 
      "HRKT": "Kaithal", 
      "MNCD": "Chandel", 
      "MZSA": "Saiha", 
      "UPBP": "Balrampur", 
      "UPBS": "Basti", 
      "UPBR": "Bareilly", 
      "UPBU": "Bulandshahr", 
      "MLRB": "Ri-Bhoi", 
      "JKRA": "Rajauri", 
      "ORBR": "Bargarh (Baragarh)", 
      "BRNW": "Nawada", 
      "MHTH": "Thane", 
      "HPSI": "Sirmaur", 
      "RJDU": "Dungapur", 
      "APWA": "Warangal", 
      "ORBW": "Baleswar (Balasore)", 
      "TNER": "Erode", 
      "BRNL": "Nalanda", 
      "MPDE": "Dewas", 
      "KAGU": "Gulbarga District", 
      "TRNT": "North Tripura", 
      "KLID": "Idukki", 
      "MPDI": "Dindori", 
      "MPDH": "Dhar", 
      "KAGA": "Gadag District", 
      "MPDT": "Datia", 
      "JHSA": "Sahibganj", 
      "ORGP": "Gajapati", 
      "UAPG": "Pauri Garhwal", 
      "ORBL": "Bolangir (Balangir)", 
      "MPJH": "Jhabua", 
      "UPLA": "Lalitpur", 
      "MPJA": "Jabalpur", 
      "JKKR": "Kargil", 
      "JKKT": "Kathua", 
      "JKKU": "Kupwara", 
      "WBBN": "Bankura", 
      "KAUK": "Uttara Kannada", 
      "ASDI": "Dibrugarh", 
      "UPLU": "Lucknow", 
      "WBBR": "Bardhaman", 
      "ASDM": "Dhemaji", 
      "ASDA": "Darrang", 
      "ASDB": "Dhubri", 
      "HRYN": "Yamuna Nagar", 
      "BREC": "Purba Champaran", 
      "UABA": "Bageshwar", 
      "TNCU": "Cuddalore", 
      "MPMS": "Mandsaur", 
      "MPML": "Mandla", 
      "GJRA": "Rajkot", 
      "MPMO": "Morena", 
      "TNCO": "Coimbatore", 
      "GJJU": "Junagadh", 
      "TNVE": "Vellore", 
      "TNVL": "Villupuram", 
      "UPHR": "Hardoi", 
      "ORDE": "Debagarh (Deogarh)", 
      "HRGU": "Gurgaon", 
      "RJJO": "Jodhpur", 
      "UPAH": "Allahabad", 
      "UPAL": "Aligarh", 
      "UPAN": "Ambedkar Nagar", 
      "CGBI": "Bilaspur", 
      "APWG": "West Godavari", 
      "UPAZ": "Azamgarh", 
      "CGBA": "Bastar", 
      "ORNY": "Nayagarh", 
      "BRWC": "Pashchim Champaran", 
      "ORNU": "Nuapada", 
      "MNWI": "Imphal West", 
      "UAAL": "Almora", 
      "JHHA": "Hazaribagh", 
      "ORNB": "Nabarangpur", 
      "ARUD": "Dibang Valley", 
      "ARUB": "Upper Subansiri", 
      "RJRA": "Rajsamand", 
      "APKR": "Krishna", 
      "MHPU": "Pune", 
      "APKU": "Kurnool", 
      "MPIN": "Indore", 
      "ASHA": "Hailakandi", 
      "UPGB": "Gautam Buddha Nagar", 
      "MHPA": "Parbhani", 
      "KARA": "Raichur District", 
      "SKWS": "West Sikkim", 
      "APKH": "Khammam", 
      "KARM": "Ramanagara District", 
      "DLNO": "North Delhi", 
      "BRJE": "Jehanabad", 
      "BRJA": "Jamui", 
      "JHWS": "Pashchim Singhbhum", 
      "DLND": "New Delhi", 
      "DLNE": "North East Delhi", 
      "DLNW": "North West Delhi", 
      "RJDH": "Dholpur", 
      "TNDI": "Dindigul", 
      "JKUD": "Udhampur", 
      "GJJA": "Jamnagar", 
      "UPHM": "Hamirpur", 
      "PBSA": "Sangrur", 
      "MPVI": "Vidisha", 
      "ORGN": "Ganjam", 
      "MHNB": "Nandurbar", 
      "UPHT": "Mahamaya Nagar", 
      "BRAR": "Araria", 
      "JKBP": "Bandipore", 
      "CGKB": "Korba", 
      "BRAU": "Aurangabad", 
      "CGKK": "Kanker", 
      "CGKJ": "Koriya", 
      "CGKW": "Kawardha", 
      "UAHA": "Haridwar", 
      "GJMA": "Mehsana", 
      "RJKO": "Kota", 
      "MNEI": "Imphal East", 
      "RJKA": "Karauli", 
      "ARLB": "Lower Subansiri", 
      "MPDM": "Damoh"
      }

  # Field containing the Line Item to which the project belongs to.
  line_item = models.CharField(max_length=256,
                               choices=LINE_ITEM_CHOICES)
  line_item.help_text = 'Select from one of the Line Items.'

  # Field containing the name of the institution working on the
  # project.
  institution = models.CharField(max_length=256)
  institution.help_text = 'Give the full name of your institution.'

  # Field containing the title of the proposal
  title = models.CharField(max_length=2000)
  title.help_text = 'Give the complete title of your proposal.'

  # Field containing the title of the proposal
  address = models.CharField(max_length=2000)
  address.help_text = 'Enter your complete address.'

  # Field containing the city
  city = models.CharField(max_length=1000)
  city.help_text = 'Enter the city name.'

  # Field containing the pin code
  pin_code = models.IntegerField()
  pin_code.help_text = "Enter your address's pin code without any spaces."

  # Field containing the state to which the institution belongs to.
  state = models.CharField(
      max_length=256,
      choices=sorted(STATE_CHOICES.items(), key=lambda (k,v): (v,k)))
  state.help_text = 'Select the state in which this project is taken up.'

  # Field containing the district to which the institution belongs
  # to in the state of India.
  district = models.CharField(max_length=256,
                              choices=sort_dict(DISTRICT_CHOICES),
                              null=True, blank=True)
  district.help_text = ('First select the state before selecting the district. '
      'Select the district of the state where this project is taken up.')

  phone_num = models.CharField(max_length=20)
  phone_num.verbose_name = 'Phone Number'
  phone_num.help_text = 'Enter your mobile number.'

  fax_num = models.CharField(max_length=20, null=True, blank=True)
  fax_num.help_text = 'Enter your fax number with the code.'

  # 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'),
                                     ('invalid', 'Invalid')])

  last_updated_on = models.DateTimeField(auto_now=True)

  @classmethod
  def getLineItem(cls, code):
    """Get the State name from its code.
    """

    for index, value in cls.LINE_ITEM_CHOICES:
      if index == code:
        return value

    return None

  @classmethod
  def getLineItemCode(cls, name):
    """Get the Line Item code from its name.
    """

    for ln_code, ln_name in cls.LINE_ITEM_CHOICES:
      if ln_name == name:
        return ln_code

    return None

  @classmethod
  def getState(cls, code):
    """Get the State code from its name.
    """

    return cls.STATE_CHOICES[code]

  @classmethod
  def getStateCode(cls, name):
    """Get the State code from its name.
    """

    for st_code in cls.STATE_CHOICES:
      if cls.STATE_CHOICES[st_code] == name:
        return st_code

    return None

  @classmethod
  def getDistrict(cls, code):
    """Get the District name from its code.
    """

    if code in cls.DISTRICT_CHOICES:
      return cls.DISTRICT_CHOICES[code]
    else:
      return None

  @classmethod
  def getDistrictCode(cls, name):
    """Get the District code from its name.
    """

    for dt_code in cls.DISTRICT_CHOICES:
      if cls.DISTRICT_CHOICES[dt_code] == name:
        return dt_code

    return None

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')
  document.help_text = 'Select the document path from your local file system.'

  #: 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 representing the relation to the corresponding proposal.
  proposal = models.ForeignKey(Proposal)

  #: Field containing the comment entered along with the review.
  comment = models.TextField()
  comment.verbose_name = 'Overall Comment'
  comment.help_text = "Enter your review comment about this proposal."

  #: 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=True)

  #: Field containing the review value for this attribute.
  attribute1 = models.PositiveSmallIntegerField(
      choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
  attribute1.verbose_name = ('Feasibility of the proposed activity and the '
      'appropriateness of the time frame.')

  comment_a1 = models.TextField(blank=True)
  comment_a1.verbose_name = 'Comment'
  comment_a1.help_text = "Comment for this attribute."

  attribute2 = models.PositiveSmallIntegerField(
      choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
  attribute2.verbose_name = ('Uniqueness/novelty/innovation of the said '
      'proposal.')

  comment_a2 = models.TextField(blank=True)
  comment_a2.verbose_name = 'Comment'
  comment_a2.help_text = "Comment for this attribute."

  attribute3 = models.PositiveSmallIntegerField(
      choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
  attribute3.verbose_name = ('Scope for inter-institutional collaboration and '
      'development.')

  comment_a3 = models.TextField(blank=True)
  comment_a3.verbose_name = 'Comment'
  comment_a3.help_text = "Comment for this attribute."

  attribute4 = models.PositiveSmallIntegerField(
      choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
  attribute4.verbose_name = ('The organisation of the programme to be carried '
      'out.')

  comment_a4 = models.TextField(blank=True)
  comment_a4.verbose_name = 'Comment'
  comment_a4.help_text = "Comment for this attribute."

  attribute5 = models.PositiveSmallIntegerField(
      choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
  attribute5.verbose_name = ('The details of the work as the outlined by the '
      'principal investigator(PI).')

  comment_a5 = models.TextField(blank=True)
  comment_a5.verbose_name = 'Comment'
  comment_a5.help_text = "Comment for this attribute."

  attribute6 = models.PositiveSmallIntegerField(
      choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
  attribute6.verbose_name = ('Sufficiency of funds as requested by the PI.')

  comment_a6 = models.TextField(blank=True)
  comment_a6.verbose_name = 'Comment'
  comment_a6.help_text = "Comment for this attribute."

  attribute7 = models.PositiveSmallIntegerField(
      choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
  attribute7.verbose_name = ('Social impact/reach/spread of the outcome of the '
      'proposal.')

  comment_a7 = models.TextField(blank=True)
  comment_a7.verbose_name = 'Comment'
  comment_a7.help_text = "Comment for this attribute."

  attribute8 = models.PositiveSmallIntegerField(
      choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
  attribute8.verbose_name = ('Contribution of the proposal to minimizing the '
      'digital divide in our country.')

  comment_a8 = models.TextField(blank=True)
  comment_a8.verbose_name = 'Comment'
  comment_a8.help_text = "Comment for this attribute."

  attribute9 = models.PositiveSmallIntegerField(
      choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
  attribute9.verbose_name = ('Any other matter which is likely to affect the '
      'execution of the project(max 600 characters).')

  comment_a9 = models.TextField(blank=True)
  comment_a9.verbose_name = 'Comment'
  comment_a9.help_text = "Comment for this attribute."