summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--scipy/forms.py0
-rw-r--r--scipy/settings.py11
-rw-r--r--scipy/urls.py5
-rw-r--r--scipy/views.py6
-rw-r--r--static/uploads/.notempty0
-rw-r--r--static/website/css/main.css37
-rw-r--r--static/website/js/main.js27
-rwxr-xr-xstatic/website/templates/base.html14
-rw-r--r--static/website/templates/call-for-proposals.html171
-rwxr-xr-xstatic/website/templates/home.html4
-rw-r--r--website/ajax.py92
-rw-r--r--website/forms.py69
-rw-r--r--website/models.py15
-rw-r--r--website/urls.py5
-rw-r--r--website/views.py73
16 files changed, 492 insertions, 38 deletions
diff --git a/.gitignore b/.gitignore
index 61d2e58..a490f4d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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 &amp; 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 %} &mdash; 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)