allow to close the CFP
This commit is contained in:
parent
d97843590b
commit
1f635cb379
|
@ -120,4 +120,4 @@ class TopicForm(forms.ModelForm):
|
||||||
return name
|
return name
|
||||||
|
|
||||||
|
|
||||||
ConferenceForm = modelform_factory(Conference, fields=['home'])
|
ConferenceForm = modelform_factory(Conference, fields=['cfp', 'home'])
|
||||||
|
|
20
proposals/migrations/0013_conference_cfp.py
Normal file
20
proposals/migrations/0013_conference_cfp.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10 on 2016-09-24 12:08
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('proposals', '0012_topic_track'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='conference',
|
||||||
|
name='cfp',
|
||||||
|
field=models.IntegerField(choices=[(0, 'Forthcoming (closed)'), (1, 'Open'), (2, 'Completed (closed)')], default=0),
|
||||||
|
),
|
||||||
|
]
|
|
@ -18,8 +18,18 @@ from .utils import query_sum
|
||||||
|
|
||||||
class Conference(models.Model):
|
class Conference(models.Model):
|
||||||
|
|
||||||
site = models.OneToOneField(Site, on_delete=models.CASCADE)
|
CFP_FORTHCOMING = 0
|
||||||
|
CFP_OPEN = 1
|
||||||
|
CFP_COMPLETED = 2
|
||||||
|
CFP_CHOICES = [
|
||||||
|
(CFP_FORTHCOMING, _('Forthcoming (closed)')),
|
||||||
|
(CFP_OPEN, _('Open')),
|
||||||
|
(CFP_COMPLETED, _('Completed (closed)')),
|
||||||
|
]
|
||||||
|
|
||||||
|
site = models.OneToOneField(Site, on_delete=models.CASCADE, related_name='conference')
|
||||||
home = models.TextField(blank=True, default="")
|
home = models.TextField(blank=True, default="")
|
||||||
|
cfp = models.IntegerField(choices=CFP_CHOICES, default=0, verbose_name=_('Call for Participation'))
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return str(self.site)
|
return str(self.site)
|
||||||
|
|
|
@ -2,39 +2,38 @@
|
||||||
|
|
||||||
{% load bootstrap3 staticfiles i18n %}
|
{% load bootstrap3 staticfiles i18n %}
|
||||||
|
|
||||||
{% block talktab %} class="active"{% endblock %}
|
{% block admintab %} class="active"{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<h1>{% trans "Conference settings" %}</h1>
|
|
||||||
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h3>{% trans "Home page" %}</h3>
|
<h3>{% trans "Home page" %}</h3>
|
||||||
</div>
|
|
||||||
<div class="panel-body">
|
|
||||||
<form method="post" role="form">
|
|
||||||
{% csrf_token %}
|
|
||||||
<ul class="nav nav-tabs" role="tablist">
|
|
||||||
<li class="active"><a href="#editor" role="tab" data-toggle="tab">Editor</a></li>
|
|
||||||
<li><a href="#preview" role="tab" data-toggle="tab">Preview</a></li>
|
|
||||||
<li><a href="https://daringfireball.net/projects/markdown/syntax" target="blank" role="tab">Syntaxe</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="tab-content">
|
|
||||||
<div class="tab-pane active" id="editor" style="max-height: 220px; margin-bottom: 20px;">
|
|
||||||
<div class="form-group">
|
|
||||||
<textarea style="width: 100%; height: 220px;" id="markdown-content" name="home">{{ conference.home }}</textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-pane well" id="preview" style="min-height: 220px; magin-bottom: 20px;">
|
<div class="panel-body">
|
||||||
<div id="preview-content"></div>
|
<form method="post" role="form">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% bootstrap_field form.cfp %}
|
||||||
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
|
<li class="active"><a href="#editor" role="tab" data-toggle="tab">Editor</a></li>
|
||||||
|
<li><a href="#preview" role="tab" data-toggle="tab">Preview</a></li>
|
||||||
|
<li><a href="https://daringfireball.net/projects/markdown/syntax" target="blank" role="tab">Syntaxe</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content">
|
||||||
|
<div class="tab-pane active" id="editor" style="max-height: 220px; margin-bottom: 20px;">
|
||||||
|
<div class="form-group">
|
||||||
|
<textarea style="width: 100%; height: 220px;" id="markdown-content" name="home">{{ conference.home }}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane well" id="preview" style="min-height: 220px; magin-bottom: 20px;">
|
||||||
|
<div id="preview-content"></div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<button type="submit" class="btn btn-success">Submit</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
|
||||||
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-pencil"></span> Submit</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -19,6 +19,12 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
{% if conf.cfp == conf.CFP_FORTHCOMING %}
|
||||||
|
<em>{% trans "The Call for Participation is not yet open." %}</em>
|
||||||
|
{% elif conf.cfp == conf.CFP_OPEN %}
|
||||||
<a class="btn btn-success" href="{% url 'add-talk' %}">{% trans "Propose a talk" %}</a>
|
<a class="btn btn-success" href="{% url 'add-talk' %}">{% trans "Propose a talk" %}</a>
|
||||||
|
{% elif conf.cfp == conf.CFP_COMPLETED %}
|
||||||
|
<em>{% trans "The Call for Participation is completed." %}</em>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -17,7 +17,7 @@ from django.http import HttpResponse
|
||||||
from accounts.models import Participation
|
from accounts.models import Participation
|
||||||
from accounts.mixins import OrgaRequiredMixin, StaffRequiredMixin
|
from accounts.mixins import OrgaRequiredMixin, StaffRequiredMixin
|
||||||
from accounts.decorators import orga_required, staff_required
|
from accounts.decorators import orga_required, staff_required
|
||||||
from accounts.utils import is_staff
|
from accounts.utils import is_orga, is_staff
|
||||||
|
|
||||||
from conversations.models import ConversationWithParticipant, ConversationAboutTalk, Message
|
from conversations.models import ConversationWithParticipant, ConversationAboutTalk, Message
|
||||||
|
|
||||||
|
@ -53,12 +53,14 @@ def conference(request):
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def participate(request):
|
def participate(request):
|
||||||
talks = Talk.objects.filter(site=get_current_site(request))
|
site = get_current_site(request)
|
||||||
|
talks = Talk.objects.filter(site=site)
|
||||||
my_talks = talks.filter(speakers=request.user)
|
my_talks = talks.filter(speakers=request.user)
|
||||||
proposed_talks = talks.exclude(speakers=request.user).filter(proposer=request.user)
|
proposed_talks = talks.exclude(speakers=request.user).filter(proposer=request.user)
|
||||||
return render(request, 'proposals/participate.html', {
|
return render(request, 'proposals/participate.html', {
|
||||||
'my_talks': my_talks,
|
'my_talks': my_talks,
|
||||||
'proposed_talks': proposed_talks,
|
'proposed_talks': proposed_talks,
|
||||||
|
'conf': site.conference,
|
||||||
})
|
})
|
||||||
|
|
||||||
@staff_required
|
@staff_required
|
||||||
|
@ -135,18 +137,24 @@ def talk_list(request):
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def talk_edit(request, talk=None):
|
def talk_edit(request, talk=None):
|
||||||
if talk:
|
site = get_current_site(request)
|
||||||
talk = get_object_or_404(Talk, slug=talk, site=get_current_site(request))
|
if talk: # edit existing talk
|
||||||
|
talk = get_object_or_404(Talk, slug=talk, site=site)
|
||||||
if not talk.is_editable_by(request.user):
|
if not talk.is_editable_by(request.user):
|
||||||
raise PermissionDenied()
|
raise PermissionDenied()
|
||||||
form = TalkForm(request.POST or None, instance=talk, site=get_current_site(request))
|
else: # add new talk
|
||||||
if not is_staff(request, request.user):
|
if site.conference.cfp != Conference.CFP_OPEN and not is_orga(request, request.user):
|
||||||
form.fields.pop('track')
|
raise PermissionDenied()
|
||||||
|
form = TalkForm(request.POST or None, instance=talk, site=site)
|
||||||
if talk:
|
if talk:
|
||||||
form.fields['title'].disabled = True
|
form.fields['title'].disabled = True
|
||||||
form.fields['topics'].disabled = True
|
form.fields['topics'].disabled = True
|
||||||
|
if not talk.is_editable_by(request.user):
|
||||||
|
form.fields.pop('track')
|
||||||
else:
|
else:
|
||||||
form.fields['speakers'].initial = [request.user]
|
form.fields['speakers'].initial = [request.user]
|
||||||
|
if not is_orga(request, request.user):
|
||||||
|
form.fields.pop('track')
|
||||||
if request.method == 'POST' and form.is_valid():
|
if request.method == 'POST' and form.is_valid():
|
||||||
if hasattr(talk, 'id'):
|
if hasattr(talk, 'id'):
|
||||||
talk = form.save()
|
talk = form.save()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user