diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | scipy/forms.py | 0 | ||||
-rw-r--r-- | scipy/settings.py | 11 | ||||
-rw-r--r-- | scipy/urls.py | 5 | ||||
-rw-r--r-- | scipy/views.py | 6 | ||||
-rw-r--r-- | static/uploads/.notempty | 0 | ||||
-rw-r--r-- | static/website/css/main.css | 37 | ||||
-rw-r--r-- | static/website/js/main.js | 27 | ||||
-rwxr-xr-x | static/website/templates/base.html | 14 | ||||
-rw-r--r-- | static/website/templates/call-for-proposals.html | 171 | ||||
-rwxr-xr-x | static/website/templates/home.html | 4 | ||||
-rw-r--r-- | website/ajax.py | 92 | ||||
-rw-r--r-- | website/forms.py | 69 | ||||
-rw-r--r-- | website/models.py | 15 | ||||
-rw-r--r-- | website/urls.py | 5 | ||||
-rw-r--r-- | website/views.py | 73 |
16 files changed, 492 insertions, 38 deletions
@@ -3,3 +3,4 @@ *.swp config.py wsgi.py +static/uploads diff --git a/scipy/forms.py b/scipy/forms.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/scipy/forms.py diff --git a/scipy/settings.py b/scipy/settings.py index 1bb64dc..f8c72ef 100644 --- a/scipy/settings.py +++ b/scipy/settings.py @@ -55,12 +55,12 @@ USE_TZ = True # Absolute filesystem path to the directory that will hold user-uploaded files. # Example: "/var/www/example.com/media/" -MEDIA_ROOT = '' +MEDIA_ROOT = os.path.join(BASE_DIR, 'static/uploads') # URL that handles the media served from MEDIA_ROOT. Make sure to use a # trailing slash. # Examples: "http://example.com/media/", "http://media.example.com/" -MEDIA_URL = '' +MEDIA_URL = '/2014/downloads/' # Absolute path to the directory static files should be collected to. # Don't put anything in this directory yourself; store your static files @@ -86,6 +86,7 @@ STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', # 'django.contrib.staticfiles.finders.DefaultStorageFinder', + 'dajaxice.finders.DajaxiceFinder', ) # Make this unique, and don't share it with anybody. @@ -95,7 +96,7 @@ SECRET_KEY = 'kk1ulxnr(o4o+60_pyb4v+&7_spaso8#o)ycyc@+1-y)bp9#0d' TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', -# 'django.template.loaders.eggs.Loader', + 'django.template.loaders.eggs.Loader', ) MIDDLEWARE_CLASSES = ( @@ -123,6 +124,7 @@ TEMPLATE_DIRS = ( TEMPLATE_CONTEXT_PROCESSORS = ( 'django.core.context_processors.request', 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', ) INSTALLED_APPS = ( @@ -136,6 +138,9 @@ INSTALLED_APPS = ( 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', + 'widget_tweaks', + 'dajaxice', + 'dajax', 'website', ) diff --git a/scipy/urls.py b/scipy/urls.py index ff46bce..3e64f3a 100644 --- a/scipy/urls.py +++ b/scipy/urls.py @@ -1,7 +1,12 @@ from django.conf.urls import patterns, include, url from django.contrib import admin +from dajaxice.core import dajaxice_autodiscover, dajaxice_config +dajaxice_autodiscover() urlpatterns = patterns('', url(r'^', include('website.urls', namespace='website')), url(r'^admin/', include(admin.site.urls)), + + # Dajaxice urls + url(dajaxice_config.dajaxice_url, include('dajaxice.urls')), ) diff --git a/scipy/views.py b/scipy/views.py index 9387ea1..e69de29 100644 --- a/scipy/views.py +++ b/scipy/views.py @@ -1,6 +0,0 @@ -from django.http import HttpResponse, HttpResponseRedirect -from django.core.context_processors import csrf -from django.shortcuts import render -from django.contrib.auth.models import User -from django.contrib.auth import authenticate, login, logout -from django.contrib.auth.decorators import login_required diff --git a/static/uploads/.notempty b/static/uploads/.notempty new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/static/uploads/.notempty diff --git a/static/website/css/main.css b/static/website/css/main.css index f3c89d9..05943f7 100644 --- a/static/website/css/main.css +++ b/static/website/css/main.css @@ -216,3 +216,40 @@ body { #twitter-widget-0 { height: 265px; } +/* form section */ +.errorlist { + margin: 0; +} +.red-star { + color: tomato; +} +.tab-content { + padding: 10px; + border: 1px solid #dddddd; + border-top: none; +} +.well { + position: relative; + text-align: left; +} +.well #welcome { + position: absolute; + top: 0; + left: 0; +} +.well #logout { + position: absolute; + top: 0; + right: 0; +} +.well .panel { + margin-top: 15px; + -webkit-box-shadow: 0 0 10px #cccccc; + -moz-box-shadow: 0 0 10px #cccccc; + -o-box-shadow: 0 0 10px #cccccc; + box-shadow: 0 0 10px #cccccc; + +} +#proposal-form textarea { + height: 100px; +} diff --git a/static/website/js/main.js b/static/website/js/main.js new file mode 100644 index 0000000..34f2026 --- /dev/null +++ b/static/website/js/main.js @@ -0,0 +1,27 @@ +$(document).ready(function() { + $(document).on("click", "#login-submit", function(e) { + Dajaxice.website.user_login(Dajax.process, {form: $("#login-form").serialize(true)}); + e.preventDefault(); + }); + + $(document).on("click", "#register-submit", function(e) { + Dajaxice.website.user_register(Dajax.process, {form: $("#register-form").serialize(true)}); + e.preventDefault(); + }); + + $(document).on("click", "#logout", function(e) { + Dajaxice.website.user_logout(Dajax.process); + e.preventDefault(); + }); +}); + +$('#sidebar .nav-group').affix({ + offset: { + top: 200 + } +}); + +$("body").scrollspy({ + target: '#sidebar', + offset: 30 +}); diff --git a/static/website/templates/base.html b/static/website/templates/base.html index 02e685c..051b9e6 100755 --- a/static/website/templates/base.html +++ b/static/website/templates/base.html @@ -1,4 +1,5 @@ {% load static %} +{% load dajaxice_templatetags %} {% load tags %} <!DOCTYPE html> <html lang="en"> @@ -7,6 +8,7 @@ <title>SciPy India 2014</title> <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> <link rel="stylesheet" href="{% static 'website/css/main.css'%}"> + {% dajaxice_js_import %} </head> <body> <div id="page-wrapper"> @@ -90,18 +92,10 @@ </div> <!-- /#social --> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> +<script src="{% static 'dajax/jquery.dajax.core.js' %}"></script> <script src="{% static 'website/js/holder.js' %}"></script> +<script src="{% static 'website/js/main.js' %}"></script> <script type="text/javascript" charset="utf-8"> - $('#sidebar .nav-group').affix({ - offset: { - top: 200 - } - }); - - $("body").scrollspy({ - target: '#sidebar', - offset: 30 - }); </script> </body> </html> diff --git a/static/website/templates/call-for-proposals.html b/static/website/templates/call-for-proposals.html index b9dc702..69bdfe6 100644 --- a/static/website/templates/call-for-proposals.html +++ b/static/website/templates/call-for-proposals.html @@ -1,15 +1,176 @@ {% extends 'website/templates/base.html' %} +{% load widget_tweaks %} + {% block sidebar %} {% endblock %} {% block current %} -Call for Papers +Call for Proposals {% endblock %} {% block content %} -<h3>Call for Papers</h3> -<p> -We are yet to open the call for papers for the conference ! -</p> +<div class="row"> + <div class="col-md-{% if user.is_authenticated %}6{% else %}8{% endif %}"> + <p> + We look forward to submissions for presentations at SciPy India + 2014. Please submit an abstract of 300 to 500 words describing the + topic, including its relevance to Python. Only submissions with an + actual implementation will be considered for presentation (i.e. + proposals to implement the code are not acceptable, partial + implementations are acceptable so long as they demonstrate the + features discussed). Please provide links to your code if this is + an open source implementation. Based on the quality of the + submissions, the conference organizers will select it either as a + full fledged talk (20-30 mins) or <a href="http://en.wikipedia.org/wiki/PechaKucha" target="_blank">Pecha Kucha</a> style talk. + </p> + <p> + If you wish to present a talk at the conference, please follow the + guidelines below. + </p> + <h3 class="garmond">Submission Guidelines</h3> + <ul> + <li>Register to submit a proposal (this registration is NOT the conference registration).</li> + <li>Login & Upload your proposal in the form of text file or a pdf file.</li> + <li>Submissions whose main purpose is to promote a commercial product or service will be refused.</li> + <li>All accepted proposals must be presented at the conference by at least one author.</li> + </ul> + <h3 class="garmond">Important Dates</h3> + <table class="table table-bordered"> + <tr> + <td>Call for proposals ends</td> + <td>To be announced.</td> + </tr> + <tr> + <td>List of accepted proposals will be published</td> + <td>To be announced.</td> + </tr> + </table> + </div> <!-- /.col --> + <div class="col-md-{% if user.is_authenticated %}6{% else %}4{% endif %}"> + {% if not request.user.is_authenticated %} + <!-- Nav tabs --> + <ul class="nav nav-tabs" role="tablist"> + <li class="active"><a href="#login" role="tab" data-toggle="tab">Login</a></li> + <li><a href="#register" role="tab" data-toggle="tab">Register</a></li> + </ul> <!-- /.nav-tabs --> + + <!-- Tab panes --> + <div class="tab-content"> + <div class="tab-pane active" id="login"> + <form id="login-form" action="" method="POST" role="form">{% csrf_token %} + <div id="non-field-errors"> + </div> + <div id="wrap_id_username" class="form-group"> + <label for="id_username">Username</label> + {% render_field login_form.username class+="form-control" %} + </div> + <div id="wrap_id_password" class="form-group"> + <label for="id_username">Password</label> + {% render_field login_form.password class+="form-control" %} + </div> + <input id="login-submit" class="btn btn-default" type="submit" value="Login"> + </form> + </div> + <div class="tab-pane" id="register"> + <form id="register-form" action="" method="POST" role="form">{% csrf_token %} + <div id="reg_wrap_id_first_name" class="form-group"> + <label for="id_first_name">First Name</label> + {% render_field register_form.first_name class+="form-control" %} + </div> + <div id="reg_wrap_id_last_name" class="form-group"> + <label for="id_last_name">Last Name</label> + {% render_field register_form.last_name class+="form-control" %} + </div> + <div id="reg_wrap_id_email" class="form-group"> + <label for="id_email">Email</label> + {% render_field register_form.email class+="form-control" %} + </div> + <div id="reg_wrap_id_username" class="form-group"> + <label for="id_username">Username</label> + {% render_field register_form.username class+="form-control" %} + </div> + <div id="reg_wrap_id_password1" class="form-group"> + <label for="id_password1">Password</label> + {% render_field register_form.password1 class+="form-control" %} + </div> + <div id="reg_wrap_id_password2" class="form-group"> + <label for="id_password2">Repeat Password</label> + {% render_field register_form.password2 class+="form-control" %} + </div> + <input id="register-submit" class="btn btn-default" type="submit" value="Register"> + </form> + </div> + </div> <!-- /.tab-content --> + {% else %} + <div class="well"> + <span class="label label-default" href="#" id="welcome">Hello {{ request.user }}!</span> + <a class="label label-primary" href="#" id="logout">Logout</a> + {% if proposal_form %} + <h3 class="garmond"><u>Proposal Form{% if edit %} — Edit{% endif %}</u></h3> + <form id="proposal-form" action="" method="POST" role="form" enctype="multipart/form-data">{% csrf_token %} + <div id="wrap_id_title" class="form-group"> + <label for="id_title">Title<sup class="red-star">*</sup></label> <small class="help">(Please enter your proposal title)</small> + {% render_field proposal_form.title class+="form-control" %} + {{ proposal_form.title.errors }} + </div> + <div id="wrap_id_objective" class="form-group"> + <label for="id_objective">Objective<sup class="red-star">*</sup></label> <small class="help">(Please enter your proposal objective)</small> + {% render_field proposal_form.objective class+="form-control" %} + {{ proposal_form.objective.errors }} + </div> + <div id="wrap_id_abstract" class="form-group"> + <label for="id_abstract">Abstract<sup class="red-star">*</sup></label> <small class="help">(Proposal abstract)</small> + {% render_field proposal_form.abstract class+="form-control" %} + {{ proposal_form.abstract.errors }} + </div> + <div id="wrap_id_bio" class="form-group"> + <label for="id_bio">Bio<sup class="red-star">*</sup></label> <small class="help">(Your professional bio/designation etc.)</small> + {% render_field proposal_form.bio class+="form-control" %} + {{ proposal_form.bio.errors }} + </div> + <div id="wrap_id_link" class="form-group"> + <label for="id_link">Link</label> <small class="help">(proposal related link, if any)</small> + {% render_field proposal_form.link class+="form-control" %} + {{ proposal_form.link.errors }} + </div> + <div id="wrap_id_attachment" class="form-group"> + <label for="id_attachment">Attachment<sup class="red-star">*</sup></label> <small class="help">(<b>[.pdf]</b> of complete proposal)</small> + {% if edit%}<br>{% endif %} + {% render_field proposal_form.attachment class+="form-control" %} + {{ proposal_form.attachment.errors }} + </div> + <input id="proposal-submit" class="btn btn-primary" type="submit" value="{% if edit %}Update{% else %}Submit{% endif %} Proposal"> + {% if edit%} + <a class="btn btn-default" href="{% url 'website:call_for_proposals' %}">Cancel</a> + {% endif %} + </form> + {% endif %} + {% if proposal %} + <div class="panel panel-default"> + <div class="panel-heading garmond"> + Your Proposal is + <span class="label label-info">Under Review</span> + </div> + <div class="panel-body"> + <h6 class="garmond"><u>Title</u></h6> + <p><small>{{ proposal.title }}</small></p> + <h6 class="garmond"><u>Objective</u></h6> + <p><small>{{ proposal.objective }}</small></p> + <h6 class="garmond"><u>Abstract</u></h6> + <p><small>{{ proposal.objective }}</small></p> + <h6 class="garmond"><u>Bio</u></h6> + <p><small>{{ proposal.bio }}</small></p> + <h6 class="garmond"><u>Attachment</u></h6> + <p><small><a href="{{ proposal.attachment.url }}" target="_blank">View Attachment</</small></p> + </div> + <div class="panel-footer"> + <a class="btn btn-info" href="{% url 'website:call_for_proposals' 'edit'%}">Edit Proposal</a> + </div> + </div> + {% endif %} + </div> <!-- /.well --> + {% endif %} + </div> <!-- /.col --> +</div> <!-- /.row --> {% endblock %} diff --git a/static/website/templates/home.html b/static/website/templates/home.html index 8285ccb..3fda3ae 100755 --- a/static/website/templates/home.html +++ b/static/website/templates/home.html @@ -69,7 +69,7 @@ <div class="caption"> Maciej FijaĆkowski (<span class="garmond">Keynote</span>) <hr> - <div class="extras"> + <div class="extras garmond"> <div class="row"> <div class="col-md-6 bio"> <a href="{% url 'website:invited_speakers' %}">View Bio</a> @@ -88,7 +88,7 @@ <div class="caption"> Ajith Kumar (<span class="garmond">Invited</span>) <hr> - <div class="extras"> + <div class="extras garmond"> <div class="row"> <div class="col-md-6 bio"> <a href="{% url 'website:invited_speakers' %}">View Bio</a> diff --git a/website/ajax.py b/website/ajax.py new file mode 100644 index 0000000..da9b6cf --- /dev/null +++ b/website/ajax.py @@ -0,0 +1,92 @@ +from dajax.core import Dajax +from django.utils import simplejson +from dajaxice.decorators import dajaxice_register +from dajaxice.utils import deserialize_form + +from django.http import HttpResponse, HttpResponseRedirect +from django.core.context_processors import csrf +from django.shortcuts import render +from django.contrib.auth.models import User +from django.contrib.auth import authenticate, login, logout +from django.contrib.auth.decorators import login_required + +from website.forms import UserLoginForm, UserRegisterForm, ProposalForm + +@dajaxice_register +def user_login(request, form): + if request.user.is_anonymous(): + dajax = Dajax() + form = UserLoginForm(deserialize_form(form)) + if form.is_valid(): + cleaned_data = form.cleaned_data + user = cleaned_data.get("user") + login(request, user) + dajax.remove_css_class('#login-form div', 'has-error') + dajax.remove('.error-message') + dajax.redirect('/call-for-proposals'); + else: + dajax.remove_css_class('#login-form div', 'has-error') + dajax.remove('.error-message') + for item in form: + dajax.add_css_class('#wrap_id_%s' % item.name, 'has-error') + # non field errors + if form.non_field_errors(): + message = '<div class="error-message alert alert-danger"><small>{0}</small></div>'.format(form.non_field_errors()) + dajax.append('#non-field-errors', 'innerHTML', message) + return dajax.json() + +@dajaxice_register +def user_logout(request): + dajax = Dajax() + logout(request) + dajax.redirect('/call-for-proposals'); + return dajax.json() + + + +@dajaxice_register +def user_register(request, form): + dajax = Dajax() + if request.user.is_anonymous(): + form = UserRegisterForm(deserialize_form(form)) + if form.is_valid(): + form.save() + dajax.remove_css_class('#register-form div', 'has-error') + dajax.remove('.error-message') + dajax.redirect('/call-for-proposals') + else: + dajax.remove_css_class('#register-form div', 'has-error') + dajax.remove('.error-message') + for error in form.errors: + dajax.add_css_class('#reg_wrap_id_%s' % error, 'has-error') + for field in form: + for error in field.errors: + message = '<div class="error-message">* {0}</div>'.format(error) + dajax.append('#reg_wrap_id_%s' % field.name, 'innerHTML', message) + return dajax.json() + +@dajaxice_register +def submit_proposal(request, form): + dajax = Dajax() + form = ProposalForm(deserialize_form(form)) + if form.is_valid(): + print "########", valid + form.save(commit=False) + form.user = request.user + form.save() + dajax.remove_css_class('#proposal-form div', 'has-error') + dajax.remove('.error-message') + else: + dajax.remove_css_class('#proposal-form div', 'has-error') + dajax.remove('.error-message') + for error in form.errors: + dajax.add_css_class('#wrap_id_%s' % error, 'has-error') + for field in form: + for error in field.errors: + message = '<div class="error-message">* {0}</div>'.format(error) + dajax.append('#wrap_id_%s' % field.name, 'innerHTML', message) + return dajax.json() + +@dajaxice_register +def test(request): + return simplejson.dumps({'msg':'hello'}) diff --git a/website/forms.py b/website/forms.py new file mode 100644 index 0000000..908c501 --- /dev/null +++ b/website/forms.py @@ -0,0 +1,69 @@ +from django import forms +from django.db import models +from django.contrib.auth.models import User +from django.contrib.auth import login, logout, authenticate +from django.contrib.auth.forms import UserCreationForm +from django.core.validators import validate_email + +from website.models import Proposal + +class UserLoginForm(forms.Form): + username = forms.CharField() + password = forms.CharField(widget=forms.PasswordInput()) + + def clean(self): + cleaned_data = self.cleaned_data + username = cleaned_data.get('username') + password = cleaned_data.get('password') + if username is None or password is None: + raise forms.ValidationError("Invalid username or password") + user = authenticate(username=username, password=password) + if not user: + raise forms.ValidationError("Invalid username or password") + if not user.is_active: + raise forms.ValidationError("User is blocked") + cleaned_data['user'] = user + return cleaned_data + +class UserRegisterForm(UserCreationForm): + class Meta: + model = User + fields = ('first_name', 'last_name', 'email', 'username', 'password1', 'password2') + + def clean_first_name(self): + first_name = self.cleaned_data.get('first_name', '') + if not first_name: + raise forms.ValidationError("First name cannot be blank.") + return first_name + + def clean_last_name(self): + last_name = self.cleaned_data.get('last_name', '') + if not last_name: + raise forms.ValidationError("Last name cannot be blank.") + return last_name + + def clean_email(self): + email = self.cleaned_data.get('email', None) + validate_email(email) + + def clean_username(self): + username = self.cleaned_data.get('username', '') + if len(username) < 6: + raise forms.ValidationError("Required a minimum 6 character username.") + return username + +class ProposalForm(forms.ModelForm): + link = forms.CharField(required=False) + class Meta: + model = Proposal + exclude = ('user') + + def clean_attachment(self): + cleaned_data = self.cleaned_data + attachment = cleaned_data.get('attachment', None) + if attachment: + if not attachment.name.endswith('.pdf'): + raise forms.ValidationError('Only [.pdf] files are allowed') + elif attachment.size > (5*1024*1024): + raise forms.ValidationError('File size exceeds 5MB') + return attachment diff --git a/website/models.py b/website/models.py index 71a8362..d0cd85a 100644 --- a/website/models.py +++ b/website/models.py @@ -1,3 +1,16 @@ from django.db import models +from django.contrib.auth.models import User -# Create your models here. +def get_document_dir(instance, filename): + return '%s/attachment/%s' % (instance.user, filename) + +class Proposal(models.Model): + user = models.ForeignKey(User) + title = models.CharField(max_length=250) + objective = models.CharField(max_length=512) + abstract = models.TextField(max_length=700) + bio = models.TextField(max_length=500) + link = models.CharField(max_length=128) + attachment = models.FileField(upload_to=get_document_dir) + date_created = models.DateTimeField(auto_now_add=True) + date_modified = models.DateTimeField(auto_now=True) diff --git a/website/urls.py b/website/urls.py index 472aae8..e65cb69 100644 --- a/website/urls.py +++ b/website/urls.py @@ -1,4 +1,6 @@ from django.conf.urls import patterns, include, url +from django.conf import settings +from django.conf.urls.static import static urlpatterns = patterns('', url(r'^$', 'website.views.home', name='home'), @@ -10,4 +12,5 @@ urlpatterns = patterns('', url(r'^register/$', 'website.views.register', name='register'), url(r'^invited-speakers/$', 'website.views.invited_speakers', name='invited_speakers'), url(r'^call-for-proposals/$', 'website.views.call_for_proposals', name='call_for_proposals'), -) + url(r'^call-for-proposals/(?P<action>[^/]+)$', 'website.views.call_for_proposals', name='call_for_proposals'), +) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/website/views.py b/website/views.py index 4cc8279..06ee8d8 100644 --- a/website/views.py +++ b/website/views.py @@ -4,29 +4,82 @@ from django.views.decorators.csrf import csrf_exempt from django.shortcuts import render from django.template import RequestContext +from website.forms import UserLoginForm, UserRegisterForm, ProposalForm +from website.models import Proposal + def home(request): - return render(request, 'website/templates/home.html', context_instance=RequestContext(request)) + return render(request, 'website/templates/home.html') def page(request): - return render(request, 'website/templates/page.html', context_instance=RequestContext(request)) + return render(request, 'website/templates/page.html') def venue(request): - return render(request, 'website/templates/venue.html', context_instance=RequestContext(request)) + return render(request, 'website/templates/venue.html') def contact(request): - return render(request, 'website/templates/contact.html', context_instance=RequestContext(request)) + return render(request, 'website/templates/contact.html') def register(request): - return render(request, 'website/templates/register.html', context_instance=RequestContext(request)) + return render(request, 'website/templates/register.html') def schedule(request): - return render(request, 'website/templates/schedule.html', context_instance=RequestContext(request)) + return render(request, 'website/templates/schedule.html') def sponsors(request): - return render(request, 'website/templates/sponsors.html', context_instance=RequestContext(request)) + return render(request, 'website/templates/sponsors.html') def invited_speakers(request): - return render(request, 'website/templates/invited-speakers.html', context_instance=RequestContext(request)) + return render(request, 'website/templates/invited-speakers.html') + +def call_for_proposals(request, action=None): + context = {} + """ EDIT PROPOSAL SECTION """ + if action == 'edit': + # POST + if request.method == "POST": + if request.user.is_authenticated(): + proposal = Proposal.objects.get(user=request.user) + form = ProposalForm(request.POST, request.FILES, instance=proposal) + if form.is_valid(): + data = form.save(commit=False) + data.user = request.user + data.save() + return HttpResponseRedirect('/call-for-proposals') + else: + context['proposal_form'] = form + context['edit'] = True + return render(request, 'website/templates/call-for-proposals.html', context) + # GET + if Proposal.objects.filter(user=request.user).exists(): + proposal = Proposal.objects.get(user=request.user) + context['proposal_form'] = ProposalForm(instance=proposal) + context['edit'] = True + return render(request, 'website/templates/call-for-proposals.html', context) + else: + return HttpResponseRedirect('/call-for-proposals') + # GET -def call_for_proposals(request): - return render(request, 'website/templates/call-for-proposals.html', context_instance=RequestContext(request)) + """ NEW PROPOSAL SECTION """ + # POST + if request.method == 'POST': + if request.user.is_authenticated(): + form = ProposalForm(request.POST, request.FILES) + if form.is_valid(): + data = form.save(commit=False) + data.user = request.user + data.save() + else: + context['proposal_form'] = form + return render(request, 'website/templates/call-for-proposals.html', context) + # GET + if request.user.is_authenticated(): + # Checking whether proposal exists + if Proposal.objects.filter(user=request.user).exists(): + context['proposal'] = Proposal.objects.get(user=request.user) + else: + context['proposal_form'] = ProposalForm() + else: + context['login_form'] = UserLoginForm() + context['register_form'] = UserRegisterForm() + context.update(csrf(request)) + return render(request, 'website/templates/call-for-proposals.html', context) |