Withdraw of proposals.
authorMadhusudan.C.S <madhusudancs@gmail.com>
Thu, 06 Aug 2009 18:15:57 +0530
changeset 4 8d9da911ed7d
parent 3 252a2d9713a5
child 5 88ae12bc6280
Withdraw of proposals.
app/projrev/models.py
app/projrev/views/base.py
app/projrev/views/helpers/forms.py
app/projrev/views/proposal.py
app/settings.py
app/site-content/css/projrev.css
app/templates/projrev/proposal/submit.html
app/urls.py
--- a/app/projrev/models.py	Thu Aug 06 12:17:29 2009 +0530
+++ b/app/projrev/models.py	Thu Aug 06 18:15:57 2009 +0530
@@ -64,15 +64,8 @@
   # 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]
+                            choices=[('new', 'New'), ('pilot', 'Pilot'),
+                                     ('invalid', 'Invalid')])
 
   @classmethod
   def getLineItem(cls, code):
@@ -83,29 +76,54 @@
     return line_item_dict[code]
 
   @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 name from its code.
+    """Get the State code from its name.
     """
 
     state_dict = dict(cls.STATE_CHOICES)
     return state_dict[code]
 
   @classmethod
-  def getState(cls, code):
-    """Get the State name from its code.
+  def getStateCode(cls, name):
+    """Get the State code from its name.
     """
 
-    state_dict = dict(cls.STATE_CHOICES)
-    return state_dict[code]
+    for st_code, st_name in cls.STATE_CHOICES:
+      if st_name == name:
+        return st_code
+
+    return None
 
   @classmethod
   def getDistrict(cls, code):
-    """Get the State name from its code.
+    """Get the District name from its code.
     """
 
     district_dict = dict(cls.DISTRICT_CHOICES)
     return district_dict[code]
 
+  @classmethod
+  def getDistrictCode(cls, name):
+    """Get the District code from its name.
+    """
+
+    for dt_code, dt_name in cls.DISTRICT_CHOICES:
+      if dt_name == name:
+        return dt_code
+
+    return None
+
 class Proposal(models.Model):
   """Model class for the project's proposal.
   """
--- a/app/projrev/views/base.py	Thu Aug 06 12:17:29 2009 +0530
+++ b/app/projrev/views/base.py	Thu Aug 06 18:15:57 2009 +0530
@@ -18,8 +18,8 @@
 
   if request.user.is_authenticated():
     if request.user.is_staff:
-      HttpResponseRedirect(reverse('app.projrev.views.proposal.review'))
+      return HttpResponseRedirect(reverse('app.projrev.views.proposal.review'))
     else:
-      HttpResponseRedirect(reverse('app.projrev.views.proposal.submit'))
+      return HttpResponseRedirect(reverse('app.projrev.views.proposal.submit'))
   else:
-    HttpResponseRedirect(reverse('app.projrev.views.login.login_validate'))
+    return HttpResponseRedirect(reverse('app.projrev.views.login.login_validate'))
--- a/app/projrev/views/helpers/forms.py	Thu Aug 06 12:17:29 2009 +0530
+++ b/app/projrev/views/helpers/forms.py	Thu Aug 06 18:15:57 2009 +0530
@@ -16,7 +16,6 @@
   """
 
   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
@@ -26,7 +25,7 @@
 
     # fields in the Project that must not appear in the form, but have
     # be automatically generated.
-    fields = ('micr_code', 'line_item', 'institution', 'state', 'district')
+    fields = ('line_item', 'institution', 'state', 'district')
 
 class ReviewForm(forms.ModelForm):
   """Creates a form for review of proposal.
--- a/app/projrev/views/proposal.py	Thu Aug 06 12:17:29 2009 +0530
+++ b/app/projrev/views/proposal.py	Thu Aug 06 18:15:57 2009 +0530
@@ -8,8 +8,11 @@
 ]
 
 
+import os
 import time
 
+from django.core.urlresolvers import reverse
+from django.http import HttpResponseRedirect
 from django.shortcuts import render_to_response, get_object_or_404
 
 from projrev.models import Project
@@ -17,16 +20,54 @@
 from projrev.views.helpers import forms as projrev_forms
 
 
-def submit(request):
+def getMicr(request):
+  """View to get MICR Code from the user.
+  """
+
+  if request.method == 'POST':
+    post_params = request.POST
+    submit = post_params.get('submit')
+    if submit == 'New Proposal':
+      return HttpResponseRedirect(
+            reverse('app.projrev.views.proposal.submit'))
+    else:
+      micr_code = request.POST.get('micr_code')
+      if micr_code:
+        try:
+          Project.objects.get(micr_code=micr_code)
+        except Project.DoesNotExist:
+          if (submit == 'Edit Proposal for MICR Code' or 
+              submit == 'Withdraw Proposal for MICR Code'):
+            template = 'projrev/proposal/get_micr.html'
+            context = {
+                'error': True,
+                }
+            return render_to_response(template, context)
+        else:
+          if submit == 'Edit Proposal for MICR Code':
+            return HttpResponseRedirect(
+                reverse('app.projrev.views.proposal.submit', 
+                        args=(micr_code, )))
+          elif submit == 'Withdraw Proposal for MICR Code':
+            return HttpResponseRedirect(
+                reverse('app.projrev.views.proposal.withdraw', 
+                        args=(micr_code, )))
+  else:
+    template = 'projrev/proposal/get_micr.html'
+    context = {}
+
+    return render_to_response(template, context)
+
+def submit(request, micr_code=None):
   """View for proposal submission.
   """
 
   if request.method == 'POST':
-    return submitPost(request)
+    return submitPost(request, micr_code)
   else:
-    return submitGet(request)
+    return submitGet(request, micr_code)
 
-def submitPost(request):
+def submitPost(request, micr_code=None):
   """Handles POST request for the submitted proposal form. 
   """
 
@@ -48,11 +89,15 @@
     cleaned_data['state'] = Project.getState(cleaned_data['state'])
     cleaned_data['district'] = Project.getDistrict(cleaned_data['district'])
 
+    prop_form.cleaned_data = cleaned_data
+
     # 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.micr_code = cleaned_data['micr_code']
+    micr_code = cleaned_data['micr_code']
 
     project.save()
 
@@ -62,21 +107,50 @@
 
     proposal.save()
 
-  return submitGet(request, project, proposal)
+    return HttpResponseRedirect(
+        reverse('app.projrev.views.proposal.submit', args=(micr_code,)))
 
-def submitGet(request, project=None, proposal=None):
+  return HttpResponseRedirect('')
+
+def submitGet(request, micr_code=None):
   """Handles GET request for the submission of proposal form.
   """
 
   context = {}
+  project = None
 
-  if proposal:
-    context['document'] = proposal.document
+  if micr_code:
+    project = Project.objects.get(micr_code=micr_code)
+
+  if project:
+    initial_vals = {
+        'line_item': Project.getLineItemCode(project.line_item),
+        'state': Project.getStateCode(project.state),
+        'district': Project.getDistrictCode(project.district),
+        }
+    prop_form = projrev_forms.ProposalForm(
+        initial=initial_vals, instance=project)
+
+    proposal_path = str(project.proposal_set.all()[0].document)
 
-  if not project:
+    proposal_name = proposal_path.split('/')[-1]
+
+    context['proposal_path'] = proposal_path
+    context['proposal_name'] = proposal_name
+
+    if 'HTTP_REFERER' in request.META:
+      referer = request.META['HTTP_REFERER'].split('/')
+      if referer[-1]:
+        ref = referer[-1]
+      else:
+        ref = referer[-2]
+        
+      if ref == 'create':
+        context['created_now'] = True
+
+    context['micr_code'] = project.micr_code
+  else:
     prop_form = projrev_forms.ProposalForm()
-  else:
-    prop_form = projrev_forms.ProposalForm(instance=project)
 
   context['form'] = prop_form
 
@@ -84,8 +158,25 @@
 
   return render_to_response(template, context)
 
+def withdraw(request, micr_code=None):
+  """View Method for withdrawal of proposal.
+  """
+
+  if micr_code:
+    project = Project.objects.get(micr_code=micr_code)
+    if project:
+      project.status = 'invalid'
+      project.save()
+      context = {
+          'withdrawn': True,
+      }
+
+  template = 'projrev/proposal/withdraw.html'
+
+  return render_to_response(template, context)
+
 def review(request, micr_code=None):
-  """
+  """View for reviewing the proposal.
   """
 
   if request.method == 'POST':
--- a/app/settings.py	Thu Aug 06 12:17:29 2009 +0530
+++ b/app/settings.py	Thu Aug 06 18:15:57 2009 +0530
@@ -54,6 +54,15 @@
 # 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 context processors.
+TEMPLATE_CONTEXT_PROCESSORS = (
+    'django.core.context_processors.auth',
+    'django.core.context_processors.debug',
+    'django.core.context_processors.i18n',
+    'django.core.context_processors.media'
+)
+
+
 # List of callables that know how to import templates from various sources.
 TEMPLATE_LOADERS = (
     'django.template.loaders.filesystem.load_template_source',
--- a/app/site-content/css/projrev.css	Thu Aug 06 12:17:29 2009 +0530
+++ b/app/site-content/css/projrev.css	Thu Aug 06 18:15:57 2009 +0530
@@ -167,6 +167,39 @@
 	color: #333;	
 	border: 1px solid #DADADA;	
 }
+
+label.micr {
+  float: left;
+  font-weight:bold; 
+  text-align: left; 
+}
+
+input.micr {
+	width: 40%;
+	position: relative;
+	left: -150px;
+	top: 2px;
+}
+
+input.micr_button {
+	width: auto;
+  font: bold 1em Arial, Sans-serif; 
+  background: #FFF url(/site-content/images/gradientbg.jpg) repeat-x; 
+  color: #333;  
+  border: 1px solid #DADADA;  
+}
+
+a.document-right {
+	padding: 3px;
+  margin-left: 3%;
+  width: 40%;
+  position: relative;
+  top: 3px;
+  border:1px solid #eee;
+  font: normal 1em "Trebuchet MS", Tahoma, sans-serif;
+  color:#777;
+}
+
 ul.errorlist {
 	width: 60%;
 	color: #ff0000;
@@ -441,4 +474,13 @@
   margin: 1px 0 0 10%;
   font: normal 1em "Trebuchet MS", Tahoma, sans-serif;
   color:#777;
+}
+div.error {
+	padding: 3px;
+  margin-left: 3%;
+  width: 40%;
+  position: relative;
+  left: 22%;
+	font: normal 1em "Trebuchet MS", Tahoma, sans-serif;
+  color:#f00;
 }
\ No newline at end of file
--- a/app/templates/projrev/proposal/submit.html	Thu Aug 06 12:17:29 2009 +0530
+++ b/app/templates/projrev/proposal/submit.html	Thu Aug 06 18:15:57 2009 +0530
@@ -4,14 +4,32 @@
 			
 	<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>
+
+  {% if created_now %}
+    <p>An MICR Code has been assigned and e-mailed to you. Please remember it for future reference.</p>
+  {% else %}{% if micr_code %}
+    <p>Edit your details and upload new version of the proposal in the form below.</p>
+  {% else %}
+    <p>Fill up the form below, and upload your proposal file by clicking on Browse.</p>
+  {% endif %}{% endif %}
 
 	<form enctype="multipart/form-data" method="post" action="">			
 		<p>
-        {{ form.as_p }}
-		<br />	
-		<input class="button" type="submit" value="Submit Proposal" />		
+      {{ form.as_p }}
+      {% if proposal_path %}
+        <p>
+          <label for="id_proposal">Previous Proposal Document:</label>
+          <a class="document-right" href="/site-content/{{ proposal_path }}">{{ proposal_name }}</a>
+        </p>
+      {% endif %}
+      {% if micr_code %}
+        <p>
+          <label for="id_micr_code">MICR Code:</label>
+          <input id="id_micr_code" type="text" maxlength="15" value="{{ micr_code }}" name="institution" DISABLED />
+        </p>
+      {% endif %}
+		  <br />	
+		  <input class="button" type="submit" value="Submit Proposal" />		
 		</p>		
 	</form>
 				
--- a/app/urls.py	Thu Aug 06 12:17:29 2009 +0530
+++ b/app/urls.py	Thu Aug 06 18:15:57 2009 +0530
@@ -21,7 +21,10 @@
     (r'^create_account/$', 'app.projrev.views.login.create_account'),
     (r'^forgot_password/$', 'app.projrev.views.login.forgot_password'),
     (r'^logout/$', 'app.projrev.views.login.logout_view'),
-    (r'^proposal/submit/$', 'app.projrev.views.proposal.submit'),
+    (r'^proposal/submit/$', 'app.projrev.views.proposal.getMicr'),
+    (r'^proposal/submit/create/$', 'app.projrev.views.proposal.submit'),
+    (r'^proposal/withdraw/(?P<micr_code>[A-Z]{6}\d{9})/$',
+     'app.projrev.views.proposal.withdraw'),
     (r'^proposal/submit/(?P<micr_code>[A-Z]{6}\d{9})/$',
      'app.projrev.views.proposal.submit'),
     (r'^proposal/review/$', 'app.projrev.views.proposal.review'),