home page + admin

This commit is contained in:
Élie Bouttier 2017-05-30 21:50:40 +02:00
parent fcbff0e9dd
commit 7c0cc5e5de
19 changed files with 221 additions and 170 deletions

View File

@ -1,30 +0,0 @@
{% extends 'base.html' %}
{% load bootstrap3 i18n %}
{% block logintab %} class="active"{% endblock %}
{% block content %}
<div class="page-header">
<h1>
{% trans "Login" %}
</h1>
</div>
<div class="row">
<div class="col-md-offset-3 col-md-6">
<div class="well">
{% include '_form.html' %}
</div>
</div>
</div>
<div class="row">
<div class="col-md-offset-4 col-md-4">
{% url 'registration_register' as reg_url %}
{% blocktrans %}You do not have an account yet? Please <a href="{{ reg_url }}">register</a>.{% endblocktrans %}
</div>
</div>
{% endblock %}

View File

@ -1,21 +0,0 @@
{% extends 'base.html' %}
{% load bootstrap3 i18n %}
{% block content %}
<div class="page-header">
<h1>
{% trans "Password Reset" %}
</h1>
</div>
<div class="row">
<div class="col-md-offset-4 col-md-4">
<div class="well">
{% include "_form.html" %}
</div>
</div>
</div>
{% endblock %}

View File

@ -1,30 +0,0 @@
{% extends 'base.html' %}
{% load bootstrap3 i18n %}
{% block registrationtab %} class="active"{% endblock %}
{% block content %}
<div class="page-header">
<h1>
{% trans "Registration" %}
</h1>
</div>
<div class="row">
<div class="col-md-offset-3 col-md-6">
<div class="well">
{% include '_form.html' %}
</div>
</div>
</div>
<div class="row">
<div class="col-md-offset-4 col-md-4">
{% url 'login' as login_url %}
{% blocktrans %}You already have an account? Please <a href="{{ login_url }}">login</a>.{% endblocktrans %}
</div>
</div>
{% endblock %}

38
cfp/admin.py Normal file
View File

@ -0,0 +1,38 @@
from django.contrib import admin
from django.contrib.sites.models import Site
from django.contrib.sites.shortcuts import get_current_site
from ponyconf.admin import SiteAdminMixin
from .models import Conference, Participant, Talk, TalkCategory, Track
class ConferenceAdmin(SiteAdminMixin, admin.ModelAdmin):
pass
class ParticipantAdmin(SiteAdminMixin, admin.ModelAdmin):
pass
class TrackAdmin(SiteAdminMixin, admin.ModelAdmin):
pass
class TalkCategoryAdmin(SiteAdminMixin, admin.ModelAdmin):
pass
class TalkAdmin(SiteAdminMixin, admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
site = get_current_site(request)
form.base_fields['speakers'].queryset = Participant.objects.filter(site=site)
form.base_fields['track'].queryset = Track.objects.filter(site=site)
form.base_fields['category'].queryset = TalkCategory.objects.filter(site=site)
return form
admin.site.register(Conference, ConferenceAdmin)
admin.site.register(Participant, ParticipantAdmin)
admin.site.register(Talk, TalkAdmin)
admin.site.register(TalkCategory, TalkCategoryAdmin)

View File

@ -12,14 +12,8 @@ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext
from django.utils import timezone
#from autoslug import AutoSlugField
#from colorful.fields import RGBColorField
#from accounts.models import Participation
from ponyconf.utils import PonyConfModel, enum_to_choices
#from .utils import generate_user_uid
from enum import IntEnum
from datetime import timedelta
from os.path import join, basename
@ -37,10 +31,6 @@ from django.utils import timezone
from autoslug import AutoSlugField
from colorful.fields import RGBColorField
#from accounts.models import Participation
#from ponyconf.utils import PonyConfModel, enum_to_choices
#from planning.models import Room
from .utils import query_sum
from .utils import generate_user_uid
@ -57,6 +47,29 @@ from django.utils.translation import ugettext
class Conference(models.Model):
site = models.OneToOneField(Site, on_delete=models.CASCADE)
home = models.TextField(blank=True, default="")
venue = models.TextField(blank=True, default="")
city = models.CharField(max_length=64, blank=True, default="")
#subscriptions_open = models.BooleanField(default=False) # workshop subscription
#def cfp_is_open(self):
# events = Event.objects.filter(site=self.site)
# return any(map(lambda x: x.is_open(), events))
#@property
#def opened_events(self):
# now = timezone.now()
# return Event.objects.filter(site=self.site)\
# .filter(Q(opening_date__isnull=True) | Q(opening_date__lte=now))\
# .filter(Q(closing_date__isnull=True) | Q(closing_date__gte=now))
def __str__(self):
return str(self.site)
class Participant(PonyConfModel):
#LICENCES = IntEnum('Video licence', 'CC-Zero CC-BY CC-BY-SA CC-BY-ND CC-BY-NC CC-BY-NC-SA CC-BY-NC-ND')
@ -121,29 +134,6 @@ class Participant(PonyConfModel):
# return self.talk_set.exclude(accepted=False)
class Conference(models.Model):
site = models.OneToOneField(Site, on_delete=models.CASCADE)
home = models.TextField(blank=True, default="")
venue = models.TextField(blank=True, default="")
city = models.CharField(max_length=64, blank=True, default="")
#subscriptions_open = models.BooleanField(default=False) # workshop subscription
#def cfp_is_open(self):
# events = Event.objects.filter(site=self.site)
# return any(map(lambda x: x.is_open(), events))
#@property
#def opened_events(self):
# now = timezone.now()
# return Event.objects.filter(site=self.site)\
# .filter(Q(opening_date__isnull=True) | Q(opening_date__lte=now))\
# .filter(Q(closing_date__isnull=True) | Q(closing_date__gte=now))
def __str__(self):
return str(self.site)
class Track(PonyConfModel):
site = models.ForeignKey(Site, on_delete=models.CASCADE)
@ -167,27 +157,6 @@ class Track(PonyConfModel):
# return reverse('list-talks') + '?track=%s' % self.slug
#class Topic(PonyConfModel):
#
# site = models.ForeignKey(Site, on_delete=models.CASCADE)
#
# name = models.CharField(max_length=128, verbose_name=_('Name'))
# slug = AutoSlugField(populate_from='name', unique=True)
# description = models.TextField(blank=True, verbose_name=_('Description'))
# track = models.ForeignKey(Track, blank=True, null=True, verbose_name=_('Destination track'))
#
# reviewers = models.ManyToManyField(User, blank=True, verbose_name=_('Reviewers'))
#
# class Meta:
# unique_together = ('site', 'name')
#
# def __str__(self):
# return self.name
#
# def get_absolute_url(self):
# return reverse('list-talks') + '?topic=%s' % self.slug
class TalkCategory(models.Model): # type of talk (conf 30min, 1h, stand, …)
site = models.ForeignKey(Site, on_delete=models.CASCADE)

View File

@ -46,7 +46,7 @@ INSTALLED_APPS = [
#'volunteers',
# external apps
#'djangobower',
'djangobower',
'bootstrap3',
#'registration',
#'django_select2',
@ -88,7 +88,7 @@ TEMPLATES = [
'django.contrib.messages.context_processors.messages',
'ponyconf.context_processors.site',
'proposals.context_processors.conference',
#'proposals.context_processors.conference',
],
},
},
@ -206,7 +206,7 @@ BOOTSTRAP3 = {
SELECT2_JS = 'select2/dist/js/select2.min.js'
SELECT2_CSS = 'select2/dist/css/select2.min.css'
AUTHENTICATION_BACKENDS = ['yeouia.backends.YummyEmailOrUsernameInsensitiveAuth']
#AUTHENTICATION_BACKENDS = ['yeouia.backends.YummyEmailOrUsernameInsensitiveAuth']
LOGOUT_REDIRECT_URL = 'home'
# django-registration

View File

@ -1,5 +1,5 @@
{% extends '_base.html' %}
{% load accounts_tags i18n bootstrap3 %}
{% load i18n bootstrap3 %}
{% block body %}
@ -18,22 +18,28 @@
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li{% block hometab %}{% endblock %}><a href="{% url 'home' %}"><span class="glyphicon glyphicon-home"></span>&nbsp;{% trans "Home" %}</a></li>
{% comment %}
{% if request.user.is_authenticated %}
<li{% block exhibitortab %}{% endblock %}><a href="{% url 'participate-as-speaker' %}"><span class="glyphicon glyphicon-bullhorn"></span>&nbsp;{% trans "Exhibitor" %}</a></li>
<li{% block volunteertab %}{% endblock %}><a href="{% url 'enrole-as-volunteer' %}"><span class="glyphicon glyphicon-thumbs-up"></span>&nbsp;{% trans "Volunteer" %}</a></li>
{% endif %}
<li{% block wsregtab %}{% endblock %}><a href="{% url 'list-registrable-talks' %}"><span class="glyphicon glyphicon-edit"></span>&nbsp;{% trans "Workshop registration" %}</a></li>
{% endcomment %}
</ul>
<ul class="nav navbar-nav navbar-right">
{% if request.user.is_authenticated %}
{% comment %}
{% if request|staff %}
<li{% block stafftab %}{% endblock %}><a href="{% url 'staff' %}"><span class="glyphicon glyphicon-cog"></span>&nbsp;{% trans "Staff" %}</a></li>
{% endif %}
<li{% block inboxtab %}{% endblock %}><a href="{% url 'inbox' %}"><span class="glyphicon glyphicon-envelope"></span>&nbsp;Inbox</a></li>
<li{% block profiletab %}{% endblock %}><a href="{% url 'profile' %}"><span class="glyphicon glyphicon-user"></span>&nbsp;{% trans "Profile" %}</a></li>
{% endcomment %}
{% if request.user.is_staff %}
<li><a href="{% url 'admin:index' %}"><span class="glyphicon glyphicon-cog"></span>&nbsp; Administration</a></li>
{% endif %}
<li><a href="{% url 'logout' %}" data-toggle="tooltip" data-placement="bottom" title="Logout"><span class="glyphicon glyphicon-log-out"></span></a></li>
{% else %}
<li{% block registrationtab %}{% endblock %}><a href="{% url 'registration_register' %}"><span class="glyphicon glyphicon-edit"></span>&nbsp;{% trans "Register" %}</a></li>
<li{% block logintab %}{% endblock %}><a href="{% url 'login' %}"><span class="glyphicon glyphicon-log-in"></span>&nbsp;{% trans "Login" %}</a></li>
{% endif %}
</ul>

View File

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% load ponyconf_tags i18n %}
{% block hometab %} class="active"{% endblock %}
{% block content %}
{% markdown site.conference.home %}
{% endblock %}

View File

@ -0,0 +1,30 @@
{% extends 'base.html' %}
{% load bootstrap3 i18n %}
{% block logintab %} class="active"{% endblock %}
{% block content %}
<div class="page-header">
<h1>
{% trans "Login" %}
</h1>
</div>
<div class="row">
<div class="col-md-offset-3 col-md-6">
<div class="well">
{% bootstrap_form_errors form layout="horizontal" %}
<form method="post" class="form-horizontal">
{% csrf_token %}
{% bootstrap_field form.username layout="horizontal" placeholder="Nom dutilisateur, e-mail ou numéro dadhérent" %}
{% bootstrap_field form.password layout="horizontal" %}
{% buttons layout="horizontal" %}
<button type="submit" class="btn btn-primary">Login</button>
<a class="btn btn-default" href="{% url 'password_reset' %}">Mot de passe oublié ?</a>
{% endbuttons %}
</form>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,7 @@
{% extends 'registration/base.html' %}
{% load bootstrap3 %}
{% block content %}
<p>Votre mot de passe a été réinitialisé, vous pouvez à présent vous <a href="{% url 'login' %}">connecter</a>.<p/>
{% endblock %}

View File

@ -0,0 +1,22 @@
{% extends 'registration/base.html' %}
{% load bootstrap3 %}
{% block content %}
{% if validlink %}
<form method="post" class="form-horizontal">
{% csrf_token %}
{% bootstrap_form form layout="horizontal" %}
{% buttons layout="horizontal" %}
<button type="submit" class="btn btn-primary">Modifier le mot de passe</button>
<a class="btn btn-default" href="{% url 'login' %}">Annuler</a>
{% endbuttons %}
</form>
{% else %}
<p>Ce lien de réinitialisation de mot de passe est invalide ou expiré.</p>
<p>
<a class="btn btn-primary" href="{% url 'password_reset' %}">Formulaire de réinitialisation du mot de passe</a>
<a class="btn btn-default" href="{% url 'login' %}">Login</a>
</p>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,9 @@
{% extends 'registration/base.html' %}
{% block content %}
<p>
Un e-mail contenant un lien vous permettant de réinitialiser votre mot de passe vous a été envoyé.
Si vous ne le recevez pas, celui-ci est peut-être arrivé dans votre dossier « spam ».
</p>
<a class="btn btn-primary" href="{% url 'login' %}">Se connecter</a>
{% endblock %}

View File

@ -0,0 +1,27 @@
{% extends 'base.html' %}
{% load bootstrap3 i18n %}
{% block content %}
<div class="page-header">
<h1>
{% trans "Login" %}
</h1>
</div>
<div class="row">
<div class="col-md-offset-3 col-md-6">
<div class="well">
<p>Pour réinitialiser votre mot de passe, veuillez saisir votre adresse e-email.</p>
<form method="post" class="form-horizontal">
{% csrf_token %}
{% bootstrap_form form layout="horizontal" %}
{% buttons layout="horizontal" %}
<button type="submit" class="btn btn-primary">Réinitialiser le mot de passe</button>
<a class="btn btn-default" href="{% url 'login' %}">Se connecter</a>
{% endbuttons %}
</form>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,11 @@
from django import template
from ponyconf.utils import markdown_to_html
register = template.Library()
@register.simple_tag
def markdown(value):
return markdown_to_html(value)

View File

@ -15,16 +15,20 @@ Including another URLconf
"""
from django.conf.urls import include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings
#from django.conf.urls.static import static
#from django.conf import settings
from . import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^accounts/', include('accounts.urls')),
url(r'^', views.home, name='home'),
url(r'^', include('cfp.urls')),
#url(r'', include('proposals.urls')),
#url(r'', include('planning.urls')),
#url(r'^volunteers/', include('volunteers.urls')),
#url(r'^conversations/', include('conversations.urls')),
#url(r'^select2/', include('django_select2.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
]# + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@ -2,6 +2,9 @@ from django.contrib.sites.shortcuts import get_current_site
from django.db import models
from django.utils.html import mark_safe
from markdown import markdown
import bleach
def enum_to_choices(enum):
return ((item.value, item.name.replace('_', ' ')) for item in list(enum))
@ -20,3 +23,10 @@ class PonyConfModel(models.Model):
def get_link(self):
return mark_safe('<a href="%s">%s</a>' % (self.get_absolute_url(), self))
def markdown_to_html(md):
html = markdown(md)
allowed_tags = bleach.ALLOWED_TAGS + ['p', 'pre', 'span' ] + ['h%d' % i for i in range(1, 7) ]
html = bleach.clean(html, tags=allowed_tags)
return mark_safe(html)

5
ponyconf/views.py Normal file
View File

@ -0,0 +1,5 @@
from django.shortcuts import render
def home(request):
return render(request, 'ponyconf/home.html')

View File

@ -1,28 +1,11 @@
#
# This file is autogenerated by pip-compile
# To update, run:
#
# pip-compile --output-file requirements.txt requirements.in
#
-e git+git://github.com/Nim65s/django-YummyEmailOrUsernameInsensitiveAuth.git#egg=django-yeouia
bleach==2.0.0
chardet==3.0.4
django-appconf==1.0.2 # via django-avatar, django-select2
django-autoslug==1.9.3
django-avatar==4.0.0
django-bootstrap3==8.2.3
django-bower==5.2.0
django-colorful==1.2
django-registration-redux==1.6
django-select2==5.10.0
django==1.11.3
html5lib==0.999999999 # via bleach
markdown==2.6.8
olefile==0.44 # via pillow
pillow==4.2.1 # via django-avatar
pytz==2017.2 # via django
six==1.10.0 # via bleach, django-bower, html5lib
webencodings==0.5.1 # via html5lib
django<1.12
# The following packages are considered to be unsafe in a requirements file:
# setuptools # via html5lib
django-autoslug
django-bootstrap3
django-bower
django-select2
django-colorful
markdown
bleach
chardet