Commit c92e8e88 authored by KUNAL GOYAL's avatar KUNAL GOYAL

comments

parent e6a94a04
No preview for this file type
...@@ -6,8 +6,6 @@ from django.core.validators import MaxValueValidator, MinValueValidator ...@@ -6,8 +6,6 @@ from django.core.validators import MaxValueValidator, MinValueValidator
import csv import csv
import os import os
## Models file
# It contains all the models used to define the database
## Institute Model ## Institute Model
# @brief Stores information about all institutes in a table # @brief Stores information about all institutes in a table
class Institute(models.Model): class Institute(models.Model):
......
...@@ -18,6 +18,24 @@ ...@@ -18,6 +18,24 @@
<form action="{% url 'allocation:choice-delete' choice.pk %}"> <form action="{% url 'allocation:choice-delete' choice.pk %}">
<input style="background-color: red;" type="submit" value="Delete" /> <input style="background-color: red;" type="submit" value="Delete" />
</form> </form>
<br>
<p>List of Applicants who have been allocated {{ choice.choice_name }} choice: </p>
<ul>
{% for applicant in choice.alloted_applicant.all %}
<table style="width:100%">
<tr>
<th>Name</th>
<th>Rank</th>
</tr>
{% for applicant in choice.alloted_applicant.all %}
<tr>
<td> <a href="{% url 'allocation:applicant-detail' applicant.pk %}">{{ applicant.name }}</a></td>
<td> {{ applicant.rank }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
</ul>
{% else %} {% else %}
Unauthorised access Unauthorised access
{% endif %} {% endif %}
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<!-- Header --> <!-- Header -->
<div id="header"> <div id="header">
<div id="branding"> <div id="branding">
<h1>Student Portal</h1> <h1>Applicant Portal</h1>
</div> </div>
{% block usertools %} {% block usertools %}
<div id="user-tools"> <div id="user-tools">
...@@ -55,24 +55,27 @@ ...@@ -55,24 +55,27 @@
</form> </form>
{% endif %} {% endif %}
{% if success %} {% if success %}
<p style="color:green">update successfull</p> <p style="color:green">Your choices have been registered.</p>
{% endif %} {% endif %}
<p> <b>Name:</b> {{applicant.name}}<br> <p> <b>Name:</b> {{applicant.name}}<br>
<b>Institute:</b> {{applicant.institute}}<br>
<b>Rank:</b> {{applicant.rank}}<br> <b>Rank:</b> {{applicant.rank}}<br>
<b>Allocated choice:</b> <b>Allocated choice:</b>
{% for choice in applicant.alloted_choice.all %} {% for choice in applicant.alloted_choice.all %}
{{choice}} {{choice}}
{% endfor %} {% endfor %}
</p> </p>
<p>Fill your choices and priorities:</p>
<form action="/allocation/" method="post">{% csrf_token %} <form action="/allocation/" method="post">{% csrf_token %}
{{ formset.management_form }} {{ formset.management_form }}
<ul>
{% for form in formset %} {% for form in formset %}
{{ form.non_field_errors }} {{ form.non_field_errors }}
{% for hidden in form.hidden_fields %} {% for hidden in form.hidden_fields %}
{{ hidden }} {{ hidden }}
{% endfor %} {% endfor %}
<li>
{% for field in form.visible_fields %} {% for field in form.visible_fields %}
<div class="fieldWrapper"> <div class="fieldWrapper">
{{ field.errors }} {{ field.errors }}
...@@ -82,6 +85,7 @@ ...@@ -82,6 +85,7 @@
<!-- {{ form.applicant }} {{ form.choice }} {{ form.priority }}<br> --> <!-- {{ form.applicant }} {{ form.choice }} {{ form.priority }}<br> -->
<br> <br>
{% endfor %} {% endfor %}
</ul>
{% if not applicant.institute.is_allocated %} {% if not applicant.institute.is_allocated %}
<input type="submit" value="Submit"> <input type="submit" value="Submit">
{% endif %} {% endif %}
......
...@@ -16,7 +16,6 @@ urlpatterns = [ ...@@ -16,7 +16,6 @@ urlpatterns = [
url(r'^admin/applicants$', views.ApplicantListView.as_view(), name='applicant_list'), #< creates URL to display all applicants in Institute Login url(r'^admin/applicants$', views.ApplicantListView.as_view(), name='applicant_list'), #< creates URL to display all applicants in Institute Login
url(r'^choice/(?P<pk>\d+)$', views.ChoiceDetailView.as_view(), name='choice-detail'), #< creates URL to display a particular choice in Institute Login url(r'^choice/(?P<pk>\d+)$', views.ChoiceDetailView.as_view(), name='choice-detail'), #< creates URL to display a particular choice in Institute Login
url(r'^applicant/(?P<pk>\d+)$', views.ApplicantDetailView.as_view(), name='applicant-detail'), #< creates URL to display a particular applicant in Institute Login url(r'^applicant/(?P<pk>\d+)$', views.ApplicantDetailView.as_view(), name='applicant-detail'), #< creates URL to display a particular applicant in Institute Login
url(r'^choice/create$', views.ChoiceCreateView.as_view(), name='choice-create'), #< creates URL to create a particular choice in Institute Login
url(r'^choice/(?P<pk>\d+)/update$', views.ChoiceUpdate.as_view(), name='choice-update'), #< creates URL to update a particular choice in Institute Login url(r'^choice/(?P<pk>\d+)/update$', views.ChoiceUpdate.as_view(), name='choice-update'), #< creates URL to update a particular choice in Institute Login
url(r'^choice/(?P<pk>\d+)/delete$', views.ChoiceDelete.as_view(), name='choice-delete'), #< creates URL to deleten a particular choice in Institute Login url(r'^choice/(?P<pk>\d+)/delete$', views.ChoiceDelete.as_view(), name='choice-delete'), #< creates URL to deleten a particular choice in Institute Login
url(r'^applicant/(?P<pk>\d+)/update$', views.ApplicantUpdate.as_view(), name='applicant-update'), #< creates URL to update a particular applicant in Institute Login url(r'^applicant/(?P<pk>\d+)/update$', views.ApplicantUpdate.as_view(), name='applicant-update'), #< creates URL to update a particular applicant in Institute Login
......
...@@ -72,99 +72,147 @@ def applicant_make(request): ...@@ -72,99 +72,147 @@ def applicant_make(request):
return HttpResponse("successful") return HttpResponse("successful")
return HttpResponse("Error") return HttpResponse("Error")
## Makes the "fill choices" for the student login
# @param applicant The applicant whose form has to be displayed
# @return returns the form for the corresponding applicant
# This view requires login to be displayed.
def make_application_form(applicant1): def make_application_form(applicant1):
# The inbuilt Model form class is used for the form
class ApplicationForm(forms.ModelForm): class ApplicationForm(forms.ModelForm):
choice = forms.ModelChoiceField(queryset=Choice.objects.filter(institute=applicant1.institute)) choice = forms.ModelChoiceField(queryset=Choice.objects.filter(institute=applicant1.institute))#< The queryset is the choices available in the dropdown in the form.
applicant = forms.ModelChoiceField(widget=forms.HiddenInput(), initial=applicant1, queryset=Applicant.objects.all() ) applicant = forms.ModelChoiceField(widget=forms.HiddenInput(), initial=applicant1, queryset=Applicant.objects.all() )#<this field is hidden since an applicant can apply for himself only.
class Meta: class Meta:
model = Application model = Application
fields = ['applicant','choice', 'priority'] fields = ['applicant','choice', 'priority'] #< These are the fields to be displayed
return ApplicationForm return ApplicationForm
## View for applicant login
# @param rerquest
# This view requires login to be displayed.
@login_required(login_url='/admin/login') @login_required(login_url='/admin/login')
def index(request): def index(request):
applicant=get_object_or_404(Applicant,name=request.user.username) applicant=get_object_or_404(Applicant,name=request.user.username) #< If an applicant exists with the username of the account, this returns the applicant. Else it returns 404 error.
ApplicationForm = make_application_form(applicant) ApplicationForm = make_application_form(applicant)
ApplicationFormSet = modelformset_factory(Application, form=ApplicationForm, extra=5) ApplicationFormSet = modelformset_factory(Application, form=ApplicationForm, extra=5) # used inbuilt function to create a formset from a form.
if request.method == "POST": if request.method == "POST":
formset = ApplicationFormSet(request.POST, queryset=Application.objects.filter(applicant=applicant)) formset = ApplicationFormSet(request.POST, queryset=Application.objects.filter(applicant=applicant))
if formset.is_valid(): if formset.is_valid():#< checks if the given information is valid.
#< if the formset is valid, then save the form and redirect to the same page giving success as the context
formset.save() formset.save()
return render(request, 'allocation/index.html', {'applicant': applicant, 'formset': formset, 'success':True,}) return render(request, 'allocation/index.html', {'applicant': applicant, 'formset': formset, 'success':True,})
else: else:
#< if the formset is invalid, then save the form and redirect to the same page giving errors as the context
form_errors = formset.errors form_errors = formset.errors
return render(request, 'allocation/index.html', {'applicant': applicant, 'formset': formset,'form_errors': form_errors}) return render(request, 'allocation/index.html', {'applicant': applicant, 'formset': formset,'form_errors': form_errors})
else: else:
formset = ApplicationFormSet(queryset=Application.objects.filter(applicant=applicant),) formset = ApplicationFormSet(queryset=Application.objects.filter(applicant=applicant),)
return render(request, 'allocation/index.html', {'applicant': applicant, 'formset': formset,}) return render(request, 'allocation/index.html', {'applicant': applicant, 'formset': formset,})
## View for institute login
# @param rerquest
# This view requires login to be displayed.
@login_required(login_url='/admin/login') @login_required(login_url='/admin/login')
def admin1(request): def admin1(request):
institute=get_object_or_404(Institute,name=request.user.username) institute=get_object_or_404(Institute,name=request.user.username)#< If an institute exists with the username of the account, this returns the institute. Else it returns 404 error.
return render(request, 'allocation/admin1.html',{'institute': institute}) return render(request, 'allocation/admin1.html',{'institute': institute})
## View for institute page which lists all the choices of the institute
# This is a generic list view provided by django to easily create views of models.
# The page also includes button for uploading csv file for creation of multiple choices at once
# The corresponding html file is choice_list.html
class ChoiceListView(generic.ListView): class ChoiceListView(generic.ListView):
model = Choice model = Choice #< specifies the model for which the generic view is to be created
##Context
# Used to pass an additional context in the html file
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
institute=get_object_or_404(Institute,name=self.request.user.username) institute=get_object_or_404(Institute,name=self.request.user.username)
context = super(ChoiceListView, self).get_context_data(**kwargs) context = super(ChoiceListView, self).get_context_data(**kwargs)
context['institute'] = institute context['institute'] = institute #< Because of this line we can access the institute information through the variable named 'institute' in the html file
return context return context
##Queryset
# Used to specify the list of choices which are to be displayed
def get_queryset(self): def get_queryset(self):
institute=get_object_or_404(Institute,name=self.request.user.username) institute=get_object_or_404(Institute,name=self.request.user.username)
return Choice.objects.filter(institute__name=institute.name) return Choice.objects.filter(institute__name=institute.name) #< this returns the list of choices corresponding to the institute which is logged in currently
## View for institute page which lists all the applicants of the institute
# This is a generic list view provided by django to easily create views of models.
# The page also includes button for uploading csv file for creation of multiple applicants at once
# The corresponding html file is applicants_list.html
class ApplicantListView(generic.ListView): class ApplicantListView(generic.ListView):
model = Applicant model = Applicant#< specifies the model for which the generic view is to be created
##Context
# Used to pass an additional context in the html file
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
institute=get_object_or_404(Institute,name=self.request.user.username) institute=get_object_or_404(Institute,name=self.request.user.username)
context = super(ApplicantListView, self).get_context_data(**kwargs) context = super(ApplicantListView, self).get_context_data(**kwargs)
context['institute'] = institute context['institute'] = institute #< Because of this line we can access the institute information through the variable named 'institute' in the html file
return context return context
##Queryset
# Used to specify the list of applicants which are to be displayed
def get_queryset(self): def get_queryset(self):
institute=get_object_or_404(Institute,name=self.request.user.username) institute=get_object_or_404(Institute,name=self.request.user.username)
return Applicant.objects.filter(institute__name=institute.name) return Applicant.objects.filter(institute__name=institute.name) #< this returns the list of choices corresponding to the institute which is logged in currently
## View for institute page which displays a particular choice of the institute in detail
# This is a generic detail view provided by django to easily create detail views of models.
# The page also includes update choice and delete choice buttons
# The corresponding html file is choice_detail.html
class ChoiceDetailView(generic.DetailView): class ChoiceDetailView(generic.DetailView):
model = Choice model = Choice #< specifies the model for which the generic view is to be created
##Context
# Used to pass an additional context in the html file
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
institute=get_object_or_404(Institute,name=self.request.user.username) institute=get_object_or_404(Institute,name=self.request.user.username)
context = super(ChoiceDetailView, self).get_context_data(**kwargs) context = super(ChoiceDetailView, self).get_context_data(**kwargs)
context['institute'] = institute context['institute'] = institute #< Because of this line we can access the institute information through the variable named 'institute' in the html file
return context return context
## View for institute page which displays profile of a particular applicant of the institute in detail
# This is a generic detail view provided by django to easily detail create views of models.
# The page also includes update applicant and delete applicant buttons
# The corresponding html file is applicant_detail.html
class ApplicantDetailView(generic.DetailView): class ApplicantDetailView(generic.DetailView):
model = Applicant model = Applicant #< specifies the model for which the generic view is to be created
##Context
# Used to pass an additional context in the html file
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
institute=get_object_or_404(Institute,name=self.request.user.username) institute=get_object_or_404(Institute,name=self.request.user.username)
context = super(ApplicantDetailView, self).get_context_data(**kwargs) context = super(ApplicantDetailView, self).get_context_data(**kwargs)
context['institute'] = institute context['institute'] = institute #< Because of this line we can access the institute information through the variable named 'institute' in the html file
return context return context
## View for institute page which displays a form to update the details of choices
class ChoiceCreateView(CreateView): # This is a generic update view provided by django to easily create update views of models.
model = Choice # The corresponding html file is choice_update.html
fields = ['choice_name', 'capacity', 'institute']
class ChoiceUpdate(UpdateView): class ChoiceUpdate(UpdateView):
model = Choice model = Choice #< specifies the model for which the generic view is to be created
fields = ['choice_name','capacity'] fields = ['choice_name','capacity'] #< specifies the fields that will be displayed on the rendered form
template_name_suffix = '_update' template_name_suffix = '_update' # Specifies that the html file is choice_update.html
success_url = reverse_lazy('allocation:choice_list') success_url = reverse_lazy('allocation:choice_list') #< this is the redirect URL upon successful updation of choice
## View for institute page which displays a form to delete the choices
# This is a generic delete view provided by django to easily create delete views of models.
# The html file for delete confirmation is choice_confirm_delete.html
class ChoiceDelete(DeleteView): class ChoiceDelete(DeleteView):
model = Choice model = Choice #< specifies the model for which the generic view is to be created
success_url = reverse_lazy('allocation:choice_list') success_url = reverse_lazy('allocation:choice_list') #< this is the redirect URL upon successful deletion of choice
## View for institute page which displays a form to update the details of applicants
# This is a generic update view provided by django to easily create update views of models.
# The corresponding html file is applicant_update.html
class ApplicantUpdate(UpdateView): class ApplicantUpdate(UpdateView):
model = Applicant model = Applicant #< specifies the model for which the generic view is to be created
fields = ['name','rank'] fields = ['name','rank']#< specifies the fields that will be displayed on the rendered form
template_name_suffix = '_update' template_name_suffix = '_update' # Specifies that the html file is choice_update.html
success_url = reverse_lazy('allocation:applicant_list') success_url = reverse_lazy('allocation:applicant_list')#< this is the redirect URL upon successful updation of applicant
## View for institute page which displays a form to delete the applicants
# This is a generic delete view provided by django to easily create delete views of models.
# The html file for delete confirmation is applicant_confirm_delete.html
class ApplicantDelete(DeleteView): class ApplicantDelete(DeleteView):
model = Applicant model = Applicant #< specifies the model for which the generic view is to be created
success_url = reverse_lazy('allocation:applicant_list') success_url = reverse_lazy('allocation:applicant_list')#< this is the redirect URL upon successful deletion of applicant
def freeze(request): def freeze(request):
if request.method == "POST": if request.method == "POST":
......
No preview for this file type
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment