diff --git a/.gitignore b/.gitignore index 26342cc..7598248 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.pyc *.swp *.sqlite3 +ponyconf/*_settings.py diff --git a/accounts/apps.py b/accounts/apps.py index f4628d2..ea7a982 100644 --- a/accounts/apps.py +++ b/accounts/apps.py @@ -5,4 +5,4 @@ class AccountsConfig(AppConfig): name = 'accounts' def ready(self): - import accounts.signals # noqa + import accounts.signals diff --git a/accounts/migrations/0001_initial.py b/accounts/migrations/0001_initial.py index e46e974..c4978e8 100644 --- a/accounts/migrations/0001_initial.py +++ b/accounts/migrations/0001_initial.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-06-13 18:50 +# Generated by Django 1.9.7 on 2016-06-14 19:13 from __future__ import unicode_literals -import accounts.models +import accounts.utils from django.conf import settings import django.contrib.sites.managers from django.db import migrations, models @@ -16,7 +16,6 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('sites', '0002_alter_domain_unique'), ] operations = [ @@ -29,8 +28,6 @@ class Migration(migrations.Migration): ('transport', models.IntegerField(blank=True, choices=[(1, 'train'), (2, 'plane')], null=True)), ('connector', models.IntegerField(blank=True, choices=[(1, 'VGA'), (2, 'HDMI'), (3, 'miniDP')], null=True)), ('constraints', models.TextField(blank=True)), - ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.Site')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], managers=[ ('objects', django.db.models.manager.Manager()), @@ -42,12 +39,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('biography', models.TextField(blank=True, verbose_name='Biography')), - ('email_token', models.CharField(default=accounts.models.generate_user_uid, max_length=12)), + ('email_token', models.CharField(default=accounts.utils.generate_user_uid, max_length=12)), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), - migrations.AlterUniqueTogether( - name='participation', - unique_together=set([('site', 'user')]), - ), ] diff --git a/accounts/migrations/0002_auto_20160614_1913.py b/accounts/migrations/0002_auto_20160614_1913.py new file mode 100644 index 0000000..7601f21 --- /dev/null +++ b/accounts/migrations/0002_auto_20160614_1913.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-06-14 19:13 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('proposals', '0001_initial'), + ('accounts', '0001_initial'), + ('sites', '0002_alter_domain_unique'), + ] + + operations = [ + migrations.AddField( + model_name='participation', + name='review_topics', + field=models.ManyToManyField(blank=True, to='proposals.Topic'), + ), + migrations.AddField( + model_name='participation', + name='site', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.Site'), + ), + migrations.AddField( + model_name='participation', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterUniqueTogether( + name='participation', + unique_together=set([('site', 'user')]), + ), + ] diff --git a/accounts/models.py b/accounts/models.py index 0cafe85..55f02ac 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -5,16 +5,12 @@ from django.contrib.sites.managers import CurrentSiteManager from django.contrib.sites.models import Site from django.core.urlresolvers import reverse from django.db import models -from django.utils.crypto import get_random_string -__all__ = ['Profile', 'Participation'] +from .utils import enum_to_choices, generate_user_uid +from proposals.models import Topic -def enum_to_choices(enum): - return ((item.value, item.name) for item in list(enum)) - -def generate_user_uid(): - return get_random_string(length=12, allowed_chars='abcdefghijklmnopqrstuvwxyz0123456789') +__all__ = ['Profile'] class Profile(models.Model): @@ -45,6 +41,9 @@ class Participation(models.Model): connector = models.IntegerField(choices=enum_to_choices(CONNECTORS), blank=True, null=True) constraints = models.TextField(blank=True) + # Participe as reviewer for theses topics + review_topics = models.ManyToManyField(Topic, blank=True) + objects = models.Manager() on_site = CurrentSiteManager() diff --git a/accounts/templates/admin/participants.html b/accounts/templates/admin/participants.html new file mode 100644 index 0000000..50318c2 --- /dev/null +++ b/accounts/templates/admin/participants.html @@ -0,0 +1,45 @@ +{% extends 'base.html' %} + +{% load bootstrap3 %} + +{% block admintab %}active{% endblock %} + +{% block content %} + +
You can use this page to communicate with the staff.
+ {% block heading %} + Go back to correspondents list + {% endblock %}{{ talk.description }}
+{% if answering %} +You can use this page to communicate with the staff.
+{% endblock %} + +{% block panelstyleblock %}{% if message.author == message.conversation.participation.user %}info{% else %}success{% endif %}{% endblock %} diff --git a/conversations/templates/conversations/message.html b/conversations/templates/conversations/message.html deleted file mode 100644 index fe3ba20..0000000 --- a/conversations/templates/conversations/message.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends 'base.html' %} - -{% block content %} - -{{ message }}
-{% endfor #} - - - -{% endblock %} diff --git a/conversations/urls.py b/conversations/urls.py index 95bea24..f9cd5e9 100644 --- a/conversations/urls.py +++ b/conversations/urls.py @@ -5,5 +5,9 @@ from conversations import views, emails urlpatterns = [ url(r'^recv/$', emails.email_recv), - url(r'^$', views.messaging, name='messaging'), + url(r'^inbox/$', views.conversation, name='inbox'), + url(r'^$', views.correspondents, name='correspondents'), + url(r'^with/(?P{{ talk.get_event_display }}
diff --git a/proposals/views.py b/proposals/views.py index c3af312..69f5745 100644 --- a/proposals/views.py +++ b/proposals/views.py @@ -9,6 +9,7 @@ from django.views.generic import DetailView, ListView from proposals.forms import TalkForm from proposals.models import Speech, Talk, Topic +from .signals import new_talk def home(request): @@ -47,8 +48,7 @@ def talk_edit(request, talk=None): talk = get_object_or_404(Talk, slug=talk) if talk.site != get_current_site(request): raise PermissionDenied() - if not request.user.is_superuser and request.user not in talk.speakers.all(): - # FIXME fine permissions + if not talk.has_perm(request.user): raise PermissionDenied() form = TalkForm(request.POST or None, instance=talk) if request.method == 'POST' and form.is_valid(): @@ -56,12 +56,13 @@ def talk_edit(request, talk=None): talk = form.save() messages.success(request, 'Talk modified successfully!') else: - site = get_current_site(request) talk = form.save(commit=False) - talk.site = site + talk.site = get_current_site(request) + talk.proposer = request.user talk.save() form.save_m2m() Speech.objects.create(speaker=request.user, talk=talk) + new_talk.send(talk.__class__, instance=talk) messages.success(request, 'Talk proposed successfully!') return redirect(talk.get_absolute_url()) return render(request, 'proposals/talk_edit.html', { @@ -71,6 +72,10 @@ def talk_edit(request, talk=None): class TalkDetail(LoginRequiredMixin, DetailView): queryset = Talk.on_site.all() + def get_context_data(self, **kwargs): + context = super(TalkDetail, self).get_context_data(**kwargs) + context['edit_perm'] = self.object.is_editable_by(self.request.user) + return context class TopicList(LoginRequiredMixin, ListView):