Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
6556c2785c |
|
@ -1,5 +1,5 @@
|
||||||
from django.contrib.auth.forms import AuthenticationForm
|
from django.contrib.auth.forms import AuthenticationForm
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.forms.models import modelform_factory
|
from django.forms.models import modelform_factory
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class Profile(models.Model):
|
class Profile(models.Model):
|
||||||
|
|
|
@ -4,8 +4,8 @@ from django.contrib.auth.signals import user_logged_in, user_logged_out
|
||||||
#from django.contrib.sites.shortcuts import get_current_site
|
#from django.contrib.sites.shortcuts import get_current_site
|
||||||
from django.db.models.signals import post_save
|
from django.db.models.signals import post_save
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
#from django.utils.translation import gettext_noop
|
#from django.utils.translation import ugettext_noop
|
||||||
|
|
||||||
from ponyconf.decorators import disable_for_loaddata
|
from ponyconf.decorators import disable_for_loaddata
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.contrib.auth.views import LoginView
|
from django.contrib.auth.views import LoginView
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.shortcuts import redirect, render
|
from django.shortcuts import redirect, render
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.utils.html import escape
|
from django.utils.html import escape
|
||||||
|
|
||||||
from pprint import pformat
|
from pprint import pformat
|
||||||
|
|
|
@ -3,7 +3,7 @@ from django.forms.models import modelform_factory
|
||||||
from django.contrib.auth.admin import UserAdmin
|
from django.contrib.auth.admin import UserAdmin
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.contrib.auth.forms import UsernameField
|
from django.contrib.auth.forms import UsernameField
|
||||||
from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
from django.utils.translation import ugettext_lazy as _, pgettext_lazy
|
||||||
from django.template.defaultfilters import slugify
|
from django.template.defaultfilters import slugify
|
||||||
from django.utils.crypto import get_random_string
|
from django.utils.crypto import get_random_string
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ class TalkForm(forms.ModelForm):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Talk
|
model = Talk
|
||||||
fields = ('category', 'title', 'language', 'description', 'notes', 'materials',)
|
fields = ('category', 'title', 'description', 'notes', 'materials',)
|
||||||
|
|
||||||
|
|
||||||
class TalkStaffForm(forms.ModelForm):
|
class TalkStaffForm(forms.ModelForm):
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
# Generated by Django 4.1.7 on 2024-02-22 12:43
|
|
||||||
|
|
||||||
import cfp.models
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('cfp', '0027_auto_20200809_1530'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='volunteer',
|
|
||||||
name='phone_number',
|
|
||||||
field=models.CharField(blank=True, default='', max_length=64, validators=[cfp.models.validate_phone_number], verbose_name='Phone number'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,18 +0,0 @@
|
||||||
# Generated by Django 4.1.7 on 2024-02-22 12:45
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('cfp', '0028_alter_volunteer_phone_number'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='talk',
|
|
||||||
name='language',
|
|
||||||
field=models.CharField(blank=True, max_length=10),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,6 +1,5 @@
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.contrib.sites.models import Site
|
from django.contrib.sites.models import Site
|
||||||
from django.conf import settings
|
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.core.validators import MaxValueValidator, MinValueValidator
|
from django.core.validators import MaxValueValidator, MinValueValidator
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
@ -8,14 +7,13 @@ from django.db import models
|
||||||
from django.db.models import Q, Count, Avg, Case, When
|
from django.db.models import Q, Count, Avg, Case, When
|
||||||
from django.db.models.functions import Coalesce
|
from django.db.models.functions import Coalesce
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.translation import gettext, gettext_lazy as _
|
from django.utils.translation import ugettext, ugettext_lazy as _
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from django.utils.html import escape, format_html
|
from django.utils.html import escape, format_html
|
||||||
|
|
||||||
from autoslug import AutoSlugField
|
from autoslug import AutoSlugField
|
||||||
from colorful.fields import RGBColorField
|
from colorful.fields import RGBColorField
|
||||||
from functools import partial
|
from functools import partial
|
||||||
import phonenumbers
|
|
||||||
|
|
||||||
import uuid
|
import uuid
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
@ -100,10 +98,9 @@ class ParticipantManager(models.Manager):
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = super().get_queryset()
|
qs = super().get_queryset()
|
||||||
qs = qs.annotate(
|
qs = qs.annotate(
|
||||||
accepted_talk_count=Count(Case(When(Q(talk__accepted=True) & (Q(talk__confirmed=True) | Q(talk__confirmed__isnull=True)), then='talk__pk'), output_field=models.IntegerField()), distinct=True),
|
accepted_talk_count=Count(Case(When(talk__accepted=True, then='talk__pk'), output_field=models.IntegerField()), distinct=True),
|
||||||
pending_talk_count=Count(Case(When(talk__accepted=None, then='talk__pk'), output_field=models.IntegerField()), distinct=True),
|
pending_talk_count=Count(Case(When(talk__accepted=None, then='talk__pk'), output_field=models.IntegerField()), distinct=True),
|
||||||
refused_talk_count=Count(Case(When(talk__accepted=False, then='talk__pk'), output_field=models.IntegerField()), distinct=True),
|
refused_talk_count=Count(Case(When(talk__accepted=False, then='talk__pk'), output_field=models.IntegerField()), distinct=True),
|
||||||
canceled_talk_count=Count(Case(When(talk__confirmed=False, then='talk__pk'), output_field=models.IntegerField()), distinct=True),
|
|
||||||
)
|
)
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
|
@ -155,10 +152,7 @@ class Participant(PonyConfModel):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def accepted_talk_set(self):
|
def accepted_talk_set(self):
|
||||||
return self.talk_set.filter(accepted=True).exclude(confirmed=False)
|
return self.talk_set.filter(accepted=True)
|
||||||
@property
|
|
||||||
def canceled_talk_set(self):
|
|
||||||
return self.talk_set.filter(confirmed=False)
|
|
||||||
@property
|
@property
|
||||||
def pending_talk_set(self):
|
def pending_talk_set(self):
|
||||||
return self.talk_set.filter(accepted=None)
|
return self.talk_set.filter(accepted=None)
|
||||||
|
@ -281,7 +275,7 @@ class TalkCategory(models.Model): # type of talk (conf 30min, 1h, stand, …)
|
||||||
verbose_name_plural = "categories"
|
verbose_name_plural = "categories"
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return gettext(self.name)
|
return ugettext(self.name)
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse('category-list')
|
return reverse('category-list')
|
||||||
|
@ -317,7 +311,7 @@ class TalkCategory(models.Model): # type of talk (conf 30min, 1h, stand, …)
|
||||||
class TalkManager(models.Manager):
|
class TalkManager(models.Manager):
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = super().get_queryset()
|
qs = super().get_queryset()
|
||||||
qs = qs.annotate(score=Coalesce(Avg('vote__vote'), 0.0))
|
qs = qs.annotate(score=Coalesce(Avg('vote__vote'), 0))
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
|
|
||||||
|
@ -364,7 +358,6 @@ class Talk(PonyConfModel):
|
||||||
video = models.URLField(max_length=1000, blank=True, default='', verbose_name='Video URL')
|
video = models.URLField(max_length=1000, blank=True, default='', verbose_name='Video URL')
|
||||||
token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
|
token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
|
||||||
conversation = models.OneToOneField(MessageThread, on_delete=models.PROTECT)
|
conversation = models.OneToOneField(MessageThread, on_delete=models.PROTECT)
|
||||||
language = models.CharField(max_length=10, blank=True)
|
|
||||||
|
|
||||||
objects = TalkManager()
|
objects = TalkManager()
|
||||||
|
|
||||||
|
@ -394,7 +387,7 @@ class Talk(PonyConfModel):
|
||||||
elif self.accepted is False:
|
elif self.accepted is False:
|
||||||
return _('Refused')
|
return _('Refused')
|
||||||
else:
|
else:
|
||||||
return _('Pending decision')
|
return _('Pending decision, score: %(score).1f') % {'score': self.score}
|
||||||
|
|
||||||
def get_status_color(self):
|
def get_status_color(self):
|
||||||
if self.accepted is True:
|
if self.accepted is True:
|
||||||
|
@ -430,7 +423,6 @@ class Talk(PonyConfModel):
|
||||||
1 if self.plenary else 0,
|
1 if self.plenary else 0,
|
||||||
self.materials,
|
self.materials,
|
||||||
self.video,
|
self.video,
|
||||||
self.score,
|
|
||||||
]
|
]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -491,22 +483,12 @@ class Activity(models.Model):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
def validate_phone_number(phone_number: str):
|
|
||||||
try:
|
|
||||||
number = phonenumbers.parse(phone_number, region=settings.DEFAULT_PHONE_REGION)
|
|
||||||
except phonenumbers.phonenumberutil.NumberParseException as err:
|
|
||||||
raise ValidationError(str(err))
|
|
||||||
else:
|
|
||||||
if not phonenumbers.is_valid_number(number):
|
|
||||||
raise ValidationError(_("Invalid phone number, try using the country code (like +33 for France)"))
|
|
||||||
|
|
||||||
|
|
||||||
class Volunteer(PonyConfModel):
|
class Volunteer(PonyConfModel):
|
||||||
site = models.ForeignKey(Site, on_delete=models.CASCADE)
|
site = models.ForeignKey(Site, on_delete=models.CASCADE)
|
||||||
name = models.CharField(max_length=128, verbose_name=_('Your Name'))
|
name = models.CharField(max_length=128, verbose_name=_('Your Name'))
|
||||||
email = models.EmailField(verbose_name=_('Email'))
|
email = models.EmailField(verbose_name=_('Email'))
|
||||||
token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
|
token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
|
||||||
phone_number = models.CharField(max_length=64, blank=True, default='', verbose_name=_('Phone number'), validators=[validate_phone_number])
|
phone_number = models.CharField(max_length=64, blank=True, default='', verbose_name=_('Phone number'))
|
||||||
sms_prefered = models.BooleanField(default=False, verbose_name=_('SMS prefered'))
|
sms_prefered = models.BooleanField(default=False, verbose_name=_('SMS prefered'))
|
||||||
language = models.CharField(max_length=10, blank=True)
|
language = models.CharField(max_length=10, blank=True)
|
||||||
notes = models.TextField(default='', blank=True, verbose_name=_('Notes'),
|
notes = models.TextField(default='', blank=True, verbose_name=_('Notes'),
|
||||||
|
|
|
@ -2,7 +2,7 @@ from django.db.models.signals import pre_save, post_save
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.contrib.sites.models import Site
|
from django.contrib.sites.models import Site
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
{% extends 'cfp/staff/base.html' %}
|
{% extends 'cfp/staff/base.html' %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
{% block title %}{{ participant.name }} - {{ conference.name }}{% endblock %}
|
|
||||||
|
|
||||||
{% block speakerstab %} class="active"{% endblock %}
|
{% block speakerstab %} class="active"{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
|
@ -81,8 +81,6 @@
|
||||||
<span class="text-warning">{% blocktrans count pending=participant.pending_talk_count %}pending: {{ pending }}{% plural %}pending: {{ pending }}{% endblocktrans %}</span>
|
<span class="text-warning">{% blocktrans count pending=participant.pending_talk_count %}pending: {{ pending }}{% plural %}pending: {{ pending }}{% endblocktrans %}</span>
|
||||||
—
|
—
|
||||||
<span class="text-danger">{% blocktrans count refused=participant.refused_talk_count %}refused: {{ refused }}{% plural %}refused: {{ refused }}{% endblocktrans %}</span>
|
<span class="text-danger">{% blocktrans count refused=participant.refused_talk_count %}refused: {{ refused }}{% plural %}refused: {{ refused }}{% endblocktrans %}</span>
|
||||||
—
|
|
||||||
<span class="text-danger">{% blocktrans count canceled=participant.canceled_talk_count %}canceled: {{ canceled }}{% plural %}canceled: {{ canceled }}{% endblocktrans %}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% if forloop.last %}
|
{% if forloop.last %}
|
||||||
|
|
|
@ -95,20 +95,7 @@
|
||||||
<a class="btn {% if vote == 2 %} active {% endif %}btn-success" href="{% url 'talk-vote' talk.pk 2 %}">+2</a>
|
<a class="btn {% if vote == 2 %} active {% endif %}btn-success" href="{% url 'talk-vote' talk.pk 2 %}">+2</a>
|
||||||
</div>
|
</div>
|
||||||
</p>
|
</p>
|
||||||
|
<p>{{ talk.vote_set.count }} {% trans "vote" %}{{ talk.vote_set.count|pluralize }}, {% trans "average:" %} {{ talk.score|floatformat:1 }}</p>
|
||||||
<p><button class="btn btn-info" onclick="toggle_votes()">{% trans "Toggle actual votes" %}</button> <span id="actual_votes" class="invisible">{{ talk.vote_set.count }} {% trans "vote" %}{{ talk.vote_set.count|pluralize }}, {% trans "average:" %} {{ talk.score|floatformat:1 }}</span></p>
|
|
||||||
<script>
|
|
||||||
function toggle_votes(){
|
|
||||||
let votes = document.getElementById('actual_votes');
|
|
||||||
if (votes != null) {
|
|
||||||
if (votes.className == "invisible") {
|
|
||||||
votes.className = "visible";
|
|
||||||
} else {
|
|
||||||
votes.className = "invisible";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<a href="{% url 'talk-accept' talk.pk %}" class="btn btn-success">{% trans "Accept" %}</a>
|
<a href="{% url 'talk-accept' talk.pk %}" class="btn btn-success">{% trans "Accept" %}</a>
|
||||||
<a href="{% url 'talk-decline' talk.pk %}" class="btn btn-danger">{% trans "Decline" %}</a>
|
<a href="{% url 'talk-decline' talk.pk %}" class="btn btn-danger">{% trans "Decline" %}</a>
|
||||||
|
|
|
@ -55,11 +55,9 @@
|
||||||
<th class="text-center">{% trans "Title" %} <a href="?{{ sort_urls.title }}"><span class="glyphicon glyphicon-{{ sort_glyphicons.title }} pull-right"></span></a></th>
|
<th class="text-center">{% trans "Title" %} <a href="?{{ sort_urls.title }}"><span class="glyphicon glyphicon-{{ sort_glyphicons.title }} pull-right"></span></a></th>
|
||||||
<th class="text-center">{% trans "Intervention kind" %} <a href="?{{ sort_urls.category }}"><span class="glyphicon glyphicon-{{ sort_glyphicons.category }} pull-right"></span></a></th>
|
<th class="text-center">{% trans "Intervention kind" %} <a href="?{{ sort_urls.category }}"><span class="glyphicon glyphicon-{{ sort_glyphicons.category }} pull-right"></span></a></th>
|
||||||
<th class="text-center">{% trans "Speakers" %}</th>
|
<th class="text-center">{% trans "Speakers" %}</th>
|
||||||
<th class="text-center">{% trans "Language" %}</th>
|
|
||||||
<th class="text-center">{% trans "Track" %}</th>
|
<th class="text-center">{% trans "Track" %}</th>
|
||||||
<th class="text-center">{% trans "Tags" %}</th>
|
<th class="text-center">{% trans "Tags" %}</th>
|
||||||
<th class="text-center">{% trans "Status" %} <a href="?{{ sort_urls.status }}"><span class="glyphicon glyphicon-{{ sort_glyphicons.status }} pull-right"></span></a></th>
|
<th class="text-center">{% trans "Status" %} <a href="?{{ sort_urls.status }}"><span class="glyphicon glyphicon-{{ sort_glyphicons.status }} pull-right"></span></a></th>
|
||||||
<th class="text-center">{% trans "Score" %} <a href="?{{ sort_urls.score }}"><span class="glyphicon glyphicon-{{ sort_glyphicons.score }} pull-right"></span></a></th>
|
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
|
@ -84,11 +82,11 @@
|
||||||
{% empty %}–
|
{% empty %}–
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</td>
|
</td>
|
||||||
<td>{{ talk.language }}</td>
|
|
||||||
<td>{{ talk.track|default:"–" }}</td>
|
<td>{{ talk.track|default:"–" }}</td>
|
||||||
<td>{{ talk.get_tags_html }}</td>
|
<td>{{ talk.get_tags_html }}</td>
|
||||||
<td>{{ talk.get_status_str }}</td>
|
<td>
|
||||||
<td>{{ talk.score }}</td>
|
{{ talk.get_status_str }}
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% if forloop.last%}
|
{% if forloop.last%}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
|
@ -2,7 +2,7 @@ from django.core.mail import send_mail
|
||||||
from django.shortcuts import get_object_or_404, redirect, render
|
from django.shortcuts import get_object_or_404, redirect, render
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
from django.urls import reverse, reverse_lazy
|
from django.urls import reverse, reverse_lazy
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.views.generic import DeleteView, FormView, TemplateView
|
from django.views.generic import DeleteView, FormView, TemplateView
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.db.models import Q, Count, Sum
|
from django.db.models import Q, Count, Sum
|
||||||
|
@ -730,7 +730,6 @@ def talk_list(request):
|
||||||
'title': 'title',
|
'title': 'title',
|
||||||
'category': 'category',
|
'category': 'category',
|
||||||
'status': 'accepted',
|
'status': 'accepted',
|
||||||
'score': 'score',
|
|
||||||
}
|
}
|
||||||
sort = request.GET.get('sort')
|
sort = request.GET.get('sort')
|
||||||
if sort in SORT_MAPPING.keys():
|
if sort in SORT_MAPPING.keys():
|
||||||
|
|
|
@ -4,7 +4,7 @@ from django.core.mail import EmailMessage, get_connection
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.contenttypes.fields import GenericForeignKey
|
from django.contrib.contenttypes.fields import GenericForeignKey
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
|
@ -2,8 +2,6 @@ from ponyconf.settings import *
|
||||||
|
|
||||||
SECRET_KEY = 'CHANGE ME'
|
SECRET_KEY = 'CHANGE ME'
|
||||||
|
|
||||||
DEFAULT_PHONE_REGION = "FR"
|
|
||||||
|
|
||||||
DEBUG = False
|
DEBUG = False
|
||||||
|
|
||||||
LOGGING = {
|
LOGGING = {
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
Django settings for ponyconf project.
|
Django settings for ponyconf project.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
@ -34,7 +34,6 @@ INSTALLED_APPS = [
|
||||||
'bootstrap3',
|
'bootstrap3',
|
||||||
'django_select2',
|
'django_select2',
|
||||||
'crispy_forms',
|
'crispy_forms',
|
||||||
'crispy_bootstrap3',
|
|
||||||
|
|
||||||
# build-in apps
|
# build-in apps
|
||||||
'django.contrib.admin',
|
'django.contrib.admin',
|
||||||
|
@ -92,8 +91,6 @@ DATABASES = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFAULT_AUTO_FIELD='django.db.models.AutoField'
|
|
||||||
|
|
||||||
|
|
||||||
# Password validation
|
# Password validation
|
||||||
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
|
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
|
||||||
|
@ -131,7 +128,7 @@ LANGUAGES = [
|
||||||
]
|
]
|
||||||
|
|
||||||
LANGUAGE_CODE = 'en-us'
|
LANGUAGE_CODE = 'en-us'
|
||||||
DEFAULT_PHONE_REGION = "US"
|
|
||||||
LOCALE_PATHS = [
|
LOCALE_PATHS = [
|
||||||
os.path.join(BASE_DIR, 'locale'),
|
os.path.join(BASE_DIR, 'locale'),
|
||||||
]
|
]
|
||||||
|
@ -174,3 +171,4 @@ SERVER_EMAIL = 'ponyconf@example.com'
|
||||||
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
|
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
|
||||||
EMAIL_HOST = 'localhost'
|
EMAIL_HOST = 'localhost'
|
||||||
EMAIL_PORT = 25
|
EMAIL_PORT = 25
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,6 @@ class PonyConfModel(models.Model):
|
||||||
|
|
||||||
def markdown_to_html(md):
|
def markdown_to_html(md):
|
||||||
html = markdown(md)
|
html = markdown(md)
|
||||||
allowed_tags = bleach.ALLOWED_TAGS | {'p', 'pre', 'span' } | {'h%d' % i for i in range(1, 7)}
|
allowed_tags = bleach.ALLOWED_TAGS + ['p', 'pre', 'span' ] + ['h%d' % i for i in range(1, 7) ]
|
||||||
html = bleach.clean(html, tags=allowed_tags)
|
html = bleach.clean(html, tags=allowed_tags)
|
||||||
return mark_safe(html)
|
return mark_safe(html)
|
||||||
|
|
|
@ -1,107 +1,47 @@
|
||||||
#
|
#
|
||||||
# This file is autogenerated by pip-compile with Python 3.9
|
# This file is autogenerated by pip-compile
|
||||||
# by the following command:
|
# To update, run:
|
||||||
#
|
#
|
||||||
# pip-compile requirements-dev.in
|
# pip-compile requirements-dev.in
|
||||||
#
|
#
|
||||||
asgiref==3.6.0
|
asgiref==3.2.10 # via django
|
||||||
# via django
|
backcall==0.2.0 # via ipython
|
||||||
asttokens==2.2.1
|
bleach==3.1.5 # via -r requirements.in
|
||||||
# via stack-data
|
chardet==3.0.4 # via -r requirements.in
|
||||||
backcall==0.2.0
|
decorator==4.4.2 # via ipython, traitlets
|
||||||
# via ipython
|
django-appconf==1.0.4 # via django-select2
|
||||||
bleach==6.0.0
|
django-autoslug==1.9.8 # via -r requirements.in
|
||||||
# via -r requirements.in
|
django-bootstrap3==14.1.0 # via -r requirements.in
|
||||||
chardet==5.1.0
|
django-colorful==1.3 # via -r requirements.in
|
||||||
# via -r requirements.in
|
django-crispy-forms==1.9.2 # via -r requirements.in
|
||||||
crispy-bootstrap3==2022.1
|
django-debug-toolbar==2.2 # via -r requirements-dev.in
|
||||||
# via -r requirements.in
|
django-extensions==3.0.4 # via -r requirements-dev.in
|
||||||
decorator==5.1.1
|
django-select2==7.4.2 # via -r requirements.in
|
||||||
# via ipython
|
django==3.1 # via -r requirements.in, django-appconf, django-bootstrap3, django-colorful, django-debug-toolbar, django-select2
|
||||||
django==4.1.7
|
icalendar==4.0.6 # via -r requirements.in
|
||||||
# via
|
importlib-metadata==1.7.0 # via django-bootstrap3, markdown
|
||||||
# -r requirements.in
|
ipython-genutils==0.2.0 # via traitlets
|
||||||
# crispy-bootstrap3
|
ipython==7.16.1 # via -r requirements-dev.in
|
||||||
# django-appconf
|
jedi==0.17.2 # via ipython
|
||||||
# django-bootstrap3
|
jinja2==2.11.2 # via -r requirements.in
|
||||||
# django-colorful
|
markdown==3.2.2 # via -r requirements.in
|
||||||
# django-crispy-forms
|
markupsafe==1.1.1 # via jinja2
|
||||||
# django-debug-toolbar
|
packaging==20.4 # via bleach
|
||||||
# django-extensions
|
parso==0.7.1 # via jedi
|
||||||
# django-select2
|
pexpect==4.8.0 # via ipython
|
||||||
django-appconf==1.0.5
|
pickleshare==0.7.5 # via ipython
|
||||||
# via django-select2
|
prompt-toolkit==3.0.5 # via ipython
|
||||||
django-autoslug==1.9.8
|
ptyprocess==0.6.0 # via pexpect
|
||||||
# via -r requirements.in
|
pygments==2.6.1 # via ipython
|
||||||
django-bootstrap3==22.2
|
pyparsing==2.4.7 # via packaging
|
||||||
# via -r requirements.in
|
python-dateutil==2.8.1 # via icalendar
|
||||||
django-colorful==1.3
|
pytz==2020.1 # via django, icalendar
|
||||||
# via -r requirements.in
|
six==1.15.0 # via bleach, packaging, python-dateutil, traitlets
|
||||||
django-crispy-forms==2.0
|
sqlparse==0.3.1 # via django, django-debug-toolbar
|
||||||
# via
|
traitlets==4.3.3 # via ipython
|
||||||
# -r requirements.in
|
wcwidth==0.2.5 # via prompt-toolkit
|
||||||
# crispy-bootstrap3
|
webencodings==0.5.1 # via bleach
|
||||||
django-debug-toolbar==3.8.1
|
zipp==3.1.0 # via importlib-metadata
|
||||||
# via -r requirements-dev.in
|
|
||||||
django-extensions==3.2.1
|
# The following packages are considered to be unsafe in a requirements file:
|
||||||
# via -r requirements-dev.in
|
# setuptools
|
||||||
django-select2==8.1.1
|
|
||||||
# via -r requirements.in
|
|
||||||
executing==1.2.0
|
|
||||||
# via stack-data
|
|
||||||
icalendar==5.0.4
|
|
||||||
# via -r requirements.in
|
|
||||||
importlib-metadata==6.0.0
|
|
||||||
# via markdown
|
|
||||||
ipython==8.11.0
|
|
||||||
# via -r requirements-dev.in
|
|
||||||
jedi==0.18.2
|
|
||||||
# via ipython
|
|
||||||
jinja2==3.1.2
|
|
||||||
# via -r requirements.in
|
|
||||||
markdown==3.4.1
|
|
||||||
# via -r requirements.in
|
|
||||||
markupsafe==2.1.2
|
|
||||||
# via jinja2
|
|
||||||
matplotlib-inline==0.1.6
|
|
||||||
# via ipython
|
|
||||||
parso==0.8.3
|
|
||||||
# via jedi
|
|
||||||
pexpect==4.8.0
|
|
||||||
# via ipython
|
|
||||||
phonenumbers==8.13.7
|
|
||||||
# via -r requirements.in
|
|
||||||
pickleshare==0.7.5
|
|
||||||
# via ipython
|
|
||||||
prompt-toolkit==3.0.38
|
|
||||||
# via ipython
|
|
||||||
ptyprocess==0.7.0
|
|
||||||
# via pexpect
|
|
||||||
pure-eval==0.2.2
|
|
||||||
# via stack-data
|
|
||||||
pygments==2.14.0
|
|
||||||
# via ipython
|
|
||||||
python-dateutil==2.8.2
|
|
||||||
# via icalendar
|
|
||||||
pytz==2022.7.1
|
|
||||||
# via icalendar
|
|
||||||
six==1.16.0
|
|
||||||
# via
|
|
||||||
# bleach
|
|
||||||
# python-dateutil
|
|
||||||
sqlparse==0.4.3
|
|
||||||
# via
|
|
||||||
# django
|
|
||||||
# django-debug-toolbar
|
|
||||||
stack-data==0.6.2
|
|
||||||
# via ipython
|
|
||||||
traitlets==5.9.0
|
|
||||||
# via
|
|
||||||
# ipython
|
|
||||||
# matplotlib-inline
|
|
||||||
wcwidth==0.2.6
|
|
||||||
# via prompt-toolkit
|
|
||||||
webencodings==0.5.1
|
|
||||||
# via bleach
|
|
||||||
zipp==3.15.0
|
|
||||||
# via importlib-metadata
|
|
||||||
|
|
|
@ -2,7 +2,6 @@ django
|
||||||
|
|
||||||
django-bootstrap3
|
django-bootstrap3
|
||||||
django-crispy-forms
|
django-crispy-forms
|
||||||
crispy-bootstrap3
|
|
||||||
django-select2
|
django-select2
|
||||||
django-colorful
|
django-colorful
|
||||||
django-autoslug
|
django-autoslug
|
||||||
|
@ -12,4 +11,3 @@ bleach
|
||||||
chardet
|
chardet
|
||||||
icalendar
|
icalendar
|
||||||
jinja2
|
jinja2
|
||||||
phonenumbers
|
|
||||||
|
|
|
@ -1,63 +1,29 @@
|
||||||
#
|
#
|
||||||
# This file is autogenerated by pip-compile with Python 3.9
|
# This file is autogenerated by pip-compile
|
||||||
# by the following command:
|
# To update, run:
|
||||||
#
|
#
|
||||||
# pip-compile
|
# pip-compile
|
||||||
#
|
#
|
||||||
asgiref==3.6.0
|
asgiref==3.2.10 # via django
|
||||||
# via django
|
bleach==3.1.5 # via -r requirements.in
|
||||||
bleach==6.0.0
|
chardet==3.0.4 # via -r requirements.in
|
||||||
# via -r requirements.in
|
django-appconf==1.0.4 # via django-select2
|
||||||
chardet==5.1.0
|
django-autoslug==1.9.8 # via -r requirements.in
|
||||||
# via -r requirements.in
|
django-bootstrap3==14.1.0 # via -r requirements.in
|
||||||
crispy-bootstrap3==2022.1
|
django-colorful==1.3 # via -r requirements.in
|
||||||
# via -r requirements.in
|
django-crispy-forms==1.9.2 # via -r requirements.in
|
||||||
django==4.1.7
|
django-select2==7.4.2 # via -r requirements.in
|
||||||
# via
|
django==3.1 # via -r requirements.in, django-appconf, django-bootstrap3, django-colorful, django-select2
|
||||||
# -r requirements.in
|
icalendar==4.0.6 # via -r requirements.in
|
||||||
# crispy-bootstrap3
|
importlib-metadata==1.7.0 # via django-bootstrap3, markdown
|
||||||
# django-appconf
|
jinja2==2.11.2 # via -r requirements.in
|
||||||
# django-bootstrap3
|
markdown==3.2.2 # via -r requirements.in
|
||||||
# django-colorful
|
markupsafe==1.1.1 # via jinja2
|
||||||
# django-crispy-forms
|
packaging==20.4 # via bleach
|
||||||
# django-select2
|
pyparsing==2.4.7 # via packaging
|
||||||
django-appconf==1.0.5
|
python-dateutil==2.8.1 # via icalendar
|
||||||
# via django-select2
|
pytz==2020.1 # via django, icalendar
|
||||||
django-autoslug==1.9.8
|
six==1.15.0 # via bleach, packaging, python-dateutil
|
||||||
# via -r requirements.in
|
sqlparse==0.3.1 # via django
|
||||||
django-bootstrap3==22.2
|
webencodings==0.5.1 # via bleach
|
||||||
# via -r requirements.in
|
zipp==3.1.0 # via importlib-metadata
|
||||||
django-colorful==1.3
|
|
||||||
# via -r requirements.in
|
|
||||||
django-crispy-forms==2.0
|
|
||||||
# via
|
|
||||||
# -r requirements.in
|
|
||||||
# crispy-bootstrap3
|
|
||||||
django-select2==8.1.1
|
|
||||||
# via -r requirements.in
|
|
||||||
icalendar==5.0.4
|
|
||||||
# via -r requirements.in
|
|
||||||
importlib-metadata==6.0.0
|
|
||||||
# via markdown
|
|
||||||
jinja2==3.1.2
|
|
||||||
# via -r requirements.in
|
|
||||||
markdown==3.4.1
|
|
||||||
# via -r requirements.in
|
|
||||||
markupsafe==2.1.2
|
|
||||||
# via jinja2
|
|
||||||
phonenumbers==8.13.7
|
|
||||||
# via -r requirements.in
|
|
||||||
python-dateutil==2.8.2
|
|
||||||
# via icalendar
|
|
||||||
pytz==2022.7.1
|
|
||||||
# via icalendar
|
|
||||||
six==1.16.0
|
|
||||||
# via
|
|
||||||
# bleach
|
|
||||||
# python-dateutil
|
|
||||||
sqlparse==0.4.3
|
|
||||||
# via django
|
|
||||||
webencodings==0.5.1
|
|
||||||
# via bleach
|
|
||||||
zipp==3.15.0
|
|
||||||
# via importlib-metadata
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user