From 8a0e858163fe8f3a61b7b4bdbf176f2eaccde4f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Wed, 19 Oct 2016 23:36:15 +0200 Subject: [PATCH] volunteers (WIP) --- planning/views.py | 3 ++- ponyconf/admin.py | 13 ++++++++++ {proposals => ponyconf}/mixins.py | 0 ponyconf/settings.py | 1 + proposals/admin.py | 11 +-------- proposals/views.py | 3 ++- volunteers/__init__.py | 0 volunteers/admin.py | 12 ++++++++++ volunteers/apps.py | 5 ++++ volunteers/migrations/0001_initial.py | 34 +++++++++++++++++++++++++++ volunteers/migrations/__init__.py | 0 volunteers/models.py | 18 ++++++++++++++ volunteers/tests.py | 3 +++ volunteers/views.py | 33 ++++++++++++++++++++++++++ 14 files changed, 124 insertions(+), 12 deletions(-) create mode 100644 ponyconf/admin.py rename {proposals => ponyconf}/mixins.py (100%) create mode 100644 volunteers/__init__.py create mode 100644 volunteers/admin.py create mode 100644 volunteers/apps.py create mode 100644 volunteers/migrations/0001_initial.py create mode 100644 volunteers/migrations/__init__.py create mode 100644 volunteers/models.py create mode 100644 volunteers/tests.py create mode 100644 volunteers/views.py diff --git a/planning/views.py b/planning/views.py index d593885..839b9b8 100644 --- a/planning/views.py +++ b/planning/views.py @@ -2,9 +2,10 @@ from django.shortcuts import render from django.contrib.sites.shortcuts import get_current_site from django.views.generic import CreateView, DetailView, ListView, UpdateView +from ponyconf.mixins import OnSiteFormMixin + from accounts.decorators import staff_required from accounts.mixins import OrgaRequiredMixin, StaffRequiredMixin -from proposals.mixins import OnSiteFormMixin from proposals.models import Talk diff --git a/ponyconf/admin.py b/ponyconf/admin.py new file mode 100644 index 0000000..5d79940 --- /dev/null +++ b/ponyconf/admin.py @@ -0,0 +1,13 @@ +from django.contrib.sites.shortcuts import get_current_site + + +class SiteAdminMixin: + exclude = ('site',) + + def get_queryset(self, request): + return super().get_queryset(request).filter(site=get_current_site(request)) + + def save_model(self, request, obj, form, change): + if not change: + obj.site = get_current_site(request) + super().save_model(request, obj, form, change) diff --git a/proposals/mixins.py b/ponyconf/mixins.py similarity index 100% rename from proposals/mixins.py rename to ponyconf/mixins.py diff --git a/ponyconf/settings.py b/ponyconf/settings.py index f38c03d..bb7afba 100644 --- a/ponyconf/settings.py +++ b/ponyconf/settings.py @@ -42,6 +42,7 @@ INSTALLED_APPS = [ 'proposals', 'conversations', 'planning', + 'volunteers', # external apps 'djangobower', diff --git a/proposals/admin.py b/proposals/admin.py index 1f29561..1e5602c 100644 --- a/proposals/admin.py +++ b/proposals/admin.py @@ -4,17 +4,8 @@ from django.contrib.sites.shortcuts import get_current_site from proposals.models import Conference, Talk, Topic, Track, Event from planning.models import Room +from ponyconf.admin import SiteAdminMixin -class SiteAdminMixin: - exclude = ('site',) - - def get_queryset(self, request): - return super().get_queryset(request).filter(site=get_current_site(request)) - - def save_model(self, request, obj, form, change): - if not change: - obj.site = get_current_site(request) - super().save_model(request, obj, form, change) class TalkAdmin(SiteAdminMixin, admin.ModelAdmin): diff --git a/proposals/views.py b/proposals/views.py index 84354ce..04566fe 100644 --- a/proposals/views.py +++ b/proposals/views.py @@ -14,6 +14,8 @@ from django.utils.translation import ugettext as _ from django.views.decorators.http import require_http_methods from django.http import HttpResponse +from ponyconf.mixins import OnSiteFormMixin + from accounts.models import Participation from accounts.mixins import OrgaRequiredMixin, StaffRequiredMixin from accounts.decorators import orga_required, staff_required @@ -27,7 +29,6 @@ from .forms import TalkForm, TopicForm, TrackForm, ConferenceForm, TalkFilterFor from .models import Talk, Track, Topic, Vote, Conference from .signals import talk_added, talk_edited from .utils import allowed_talks, markdown_to_html -from .mixins import OnSiteFormMixin @login_required diff --git a/volunteers/__init__.py b/volunteers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/volunteers/admin.py b/volunteers/admin.py new file mode 100644 index 0000000..895e090 --- /dev/null +++ b/volunteers/admin.py @@ -0,0 +1,12 @@ +from django.contrib import admin + +from ponyconf.admin import SiteAdminMixin + +from .models import Activity + + +class ActivityAdmin(SiteAdminMixin, admin.ModelAdmin): + pass + + +admin.site.register(Activity, ActivityAdmin) diff --git a/volunteers/apps.py b/volunteers/apps.py new file mode 100644 index 0000000..be1e32e --- /dev/null +++ b/volunteers/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class VolunteersConfig(AppConfig): + name = 'volunteers' diff --git a/volunteers/migrations/0001_initial.py b/volunteers/migrations/0001_initial.py new file mode 100644 index 0000000..3fcd7f2 --- /dev/null +++ b/volunteers/migrations/0001_initial.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-10-19 21:17 +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 = [ + ('sites', '0002_alter_domain_unique'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Activity', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=256, verbose_name='Name')), + ('description', models.TextField(blank=True, verbose_name='Description')), + ('participants', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL, verbose_name='Participants')), + ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.Site')), + ], + ), + migrations.AlterUniqueTogether( + name='activity', + unique_together=set([('site', 'name')]), + ), + ] diff --git a/volunteers/migrations/__init__.py b/volunteers/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/volunteers/models.py b/volunteers/models.py new file mode 100644 index 0000000..bebf4ca --- /dev/null +++ b/volunteers/models.py @@ -0,0 +1,18 @@ +from django.db import models +from django.contrib.sites.models import Site +from django.utils.translation import ugettext_lazy as _ +from django.contrib.auth.models import User + + +class Activity(models.Model): + + site = models.ForeignKey(Site, on_delete=models.CASCADE) + name = models.CharField(max_length=256, verbose_name=_('Name')) + description = models.TextField(blank=True, verbose_name=_('Description')) + participants = models.ManyToManyField(User, blank=True, verbose_name=_('Participants')) + + class Meta: + unique_together = ('site', 'name') + + def __str__(self): + return self.name diff --git a/volunteers/tests.py b/volunteers/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/volunteers/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/volunteers/views.py b/volunteers/views.py new file mode 100644 index 0000000..94b41b7 --- /dev/null +++ b/volunteers/views.py @@ -0,0 +1,33 @@ +from django.shortcuts import render +from django.contrib.sites.shortcuts import get_current_site +from django.views.generic import CreateView, DetailView, ListView, UpdateView + +from ponyconf.mixins import OnSiteFormMixin + +from accounts.mixins import OrgaRequiredMixin, StaffRequiredMixin + + + +class ActivityMixin(object): + def get_queryset(self): + return Activity.objects.filter(site=get_current_site(self.request)).all() + + +class ActivityFormMixin(OnSiteFormMixin): + form_class = ActivityForm + + +class ActivityList(StaffRequiredMixin, RoomMixin, ListView): + pass + + +class ActivityCreate(OrgaRequiredMixin, RoomMixin, RoomFormMixin, CreateView): + model = Activity + + +class ActivityUpdate(OrgaRequiredMixin, RoomMixin, RoomFormMixin, UpdateView): + pass + + +class ActivityDetail(StaffRequiredMixin, RoomMixin, DetailView): + pass