From ac46279c9d432abf68ac7cd007e3c3d134bad238 Mon Sep 17 00:00:00 2001 From: Zambom Date: Wed, 18 Jan 2017 18:35:40 -0200 Subject: [PATCH] Adding groups app --- amadeus/settings.py | 1 + amadeus/urls.py | 1 + categories/migrations/0007_auto_20170118_1711.py | 21 +++++++++++++++++++++ students_group/__init__.py | 0 students_group/admin.py | 3 +++ students_group/apps.py | 5 +++++ students_group/forms.py | 36 ++++++++++++++++++++++++++++++++++++ students_group/migrations/0001_initial.py | 38 ++++++++++++++++++++++++++++++++++++++ students_group/migrations/__init__.py | 0 students_group/models.py | 22 ++++++++++++++++++++++ students_group/templates/groups/create.html | 21 +++++++++++++++++++++ students_group/templates/groups/index.html | 44 ++++++++++++++++++++++++++++++++++++++++++++ students_group/tests.py | 3 +++ students_group/urls.py | 7 +++++++ students_group/views.py | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ subjects/templates/subjects/subject_card.html | 1 + subjects/templates/subjects/view.html | 1 + topics/migrations/0004_auto_20170118_1711.py | 19 +++++++++++++++++++ topics/templates/topics/create.html | 3 ++- topics/templates/topics/update.html | 3 ++- 20 files changed, 330 insertions(+), 2 deletions(-) create mode 100644 categories/migrations/0007_auto_20170118_1711.py create mode 100644 students_group/__init__.py create mode 100644 students_group/admin.py create mode 100644 students_group/apps.py create mode 100644 students_group/forms.py create mode 100644 students_group/migrations/0001_initial.py create mode 100644 students_group/migrations/__init__.py create mode 100644 students_group/models.py create mode 100644 students_group/templates/groups/create.html create mode 100644 students_group/templates/groups/index.html create mode 100644 students_group/tests.py create mode 100644 students_group/urls.py create mode 100644 students_group/views.py create mode 100644 topics/migrations/0004_auto_20170118_1711.py diff --git a/amadeus/settings.py b/amadeus/settings.py index aae1913..0448ebf 100644 --- a/amadeus/settings.py +++ b/amadeus/settings.py @@ -58,6 +58,7 @@ INSTALLED_APPS = [ 'log', 'categories', 'subjects', + 'students_group', 'topics', 'mailsender', 'security', diff --git a/amadeus/urls.py b/amadeus/urls.py index 157e24c..3a2a335 100644 --- a/amadeus/urls.py +++ b/amadeus/urls.py @@ -27,6 +27,7 @@ urlpatterns = [ url(r'^$', index, name = 'home'), url(r'^categories/', include('categories.urls', namespace = 'categories')), url(r'^subjects/', include('subjects.urls', namespace = 'subjects')), + url(r'^groups/', include('students_group.urls', namespace = 'groups')), url(r'^topics/', include('topics.urls', namespace = 'topics')), url(r'^mailsender/', include('mailsender.urls', namespace = 'mailsender')), url(r'^security/', include('security.urls', namespace = 'security')), diff --git a/categories/migrations/0007_auto_20170118_1711.py b/categories/migrations/0007_auto_20170118_1711.py new file mode 100644 index 0000000..8c87d11 --- /dev/null +++ b/categories/migrations/0007_auto_20170118_1711.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-01-18 20:11 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('categories', '0006_auto_20170102_1856'), + ] + + operations = [ + migrations.AlterField( + model_name='category', + name='coordinators', + field=models.ManyToManyField(blank=True, related_name='Coordenadores', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/students_group/__init__.py b/students_group/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/students_group/__init__.py diff --git a/students_group/admin.py b/students_group/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/students_group/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/students_group/apps.py b/students_group/apps.py new file mode 100644 index 0000000..69985c7 --- /dev/null +++ b/students_group/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class StudentsGroupConfig(AppConfig): + name = 'students_group' diff --git a/students_group/forms.py b/students_group/forms.py new file mode 100644 index 0000000..d2fc2ca --- /dev/null +++ b/students_group/forms.py @@ -0,0 +1,36 @@ +# coding=utf-8 +from django import forms +from django.utils.translation import ugettext_lazy as _ + +from .models import StudentsGroup + +class StudentsGroupForm(forms.ModelForm): + subject = None + + def __init__(self, *args, **kwargs): + super(StudentsGroupForm, self).__init__(*args, **kwargs) + + self.subject = kwargs['initial'].get('subject', None) + + def clean_name(self): + name = self.cleaned_data.get('name', '') + + if self.instance.id: + same_name = self.subject.group_subject.filter(name__unaccent__iexact = name).exclude(id = self.instance.id).count() + else: + same_name = self.subject.group_subject.filter(name__unaccent__iexact = name).count() + + if same_name > 0: + self._errors['name'] = [_('This subject already has a group with this name')] + + return ValueError + + return name + + class Meta: + model = StudentsGroup + fields = ['name', 'description', 'participants'] + widgets = { + 'description': forms.Textarea, + 'participants': forms.SelectMultiple, + } \ No newline at end of file diff --git a/students_group/migrations/0001_initial.py b/students_group/migrations/0001_initial.py new file mode 100644 index 0000000..06c66df --- /dev/null +++ b/students_group/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-01-18 20:11 +from __future__ import unicode_literals + +import autoslug.fields +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), + ('subjects', '0012_auto_20170112_1408'), + ] + + operations = [ + migrations.CreateModel( + name='StudentsGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200, verbose_name='Name')), + ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')), + ('description', models.TextField(blank=True, verbose_name='Description')), + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')), + ('last_update', models.DateTimeField(auto_now=True, verbose_name='Last Update')), + ('participants', models.ManyToManyField(blank=True, related_name='group_participants', to=settings.AUTH_USER_MODEL, verbose_name='Participants')), + ('subject', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='group_subject', to='subjects.Subject', verbose_name='Subject')), + ], + options={ + 'verbose_name': 'Students Group', + 'verbose_name_plural': 'Students Groups', + }, + ), + ] diff --git a/students_group/migrations/__init__.py b/students_group/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/students_group/migrations/__init__.py diff --git a/students_group/models.py b/students_group/models.py new file mode 100644 index 0000000..9a650db --- /dev/null +++ b/students_group/models.py @@ -0,0 +1,22 @@ +from django.db import models +from autoslug.fields import AutoSlugField +from django.utils.translation import ugettext_lazy as _ + +from subjects.models import Subject +from users.models import User + +class StudentsGroup(models.Model): + name = models.CharField(_('Name'), max_length = 200) + slug = AutoSlugField(_("Slug"), populate_from = 'name', unique = True) + description = models.TextField(_('Description'), blank = True) + subject = models.ForeignKey(Subject, verbose_name = _('Subject'), related_name = 'group_subject', null = True) + participants = models.ManyToManyField(User, verbose_name = _('Participants'), related_name = 'group_participants', blank = True) + create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) + last_update = models.DateTimeField(_('Last Update'), auto_now = True) + + class Meta: + verbose_name = _('Students Group') + verbose_name_plural = _('Students Groups') + + def __str__(self): + return self.name \ No newline at end of file diff --git a/students_group/templates/groups/create.html b/students_group/templates/groups/create.html new file mode 100644 index 0000000..26c297a --- /dev/null +++ b/students_group/templates/groups/create.html @@ -0,0 +1,21 @@ +{% extends 'groups/index.html' %} + +{% load i18n django_bootstrap_breadcrumbs %} + +{% block breadcrumbs %} + {{ block.super }} + + {% trans 'Create Group' as bread %} + {% breadcrumb bread 'groups:create' subject.slug %} +{% endblock %} + +{% block content %} +
+
+
+
+
+
+
+
+{% endblock %} diff --git a/students_group/templates/groups/index.html b/students_group/templates/groups/index.html new file mode 100644 index 0000000..17ac1a7 --- /dev/null +++ b/students_group/templates/groups/index.html @@ -0,0 +1,44 @@ +{% extends 'subjects/view.html' %} + +{% load static i18n pagination %} +{% load django_bootstrap_breadcrumbs %} + +{% block javascript%} + {{ block.super }} +{% endblock%} + +{% block breadcrumbs %} + {{ block.super }} + + {% trans 'Groups' as bread %} + {% breadcrumb bread 'groups:index' subject.slug %} +{% endblock %} + +{% block content %} + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} + +
+ +
+ +
+
+ {% for group in groups %} + {% endfor %} + + {% pagination request paginator page_obj %} +
+
+ +{% endblock %} \ No newline at end of file diff --git a/students_group/tests.py b/students_group/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/students_group/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/students_group/urls.py b/students_group/urls.py new file mode 100644 index 0000000..11e4581 --- /dev/null +++ b/students_group/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import url +from . import views + +urlpatterns = [ + url(r'^(?P[\w_-]+)/$', views.IndexView.as_view(), name='index'), + url(r'^create/(?P[\w_-]+)/$', views.CreateView.as_view(), name='create'), +] \ No newline at end of file diff --git a/students_group/views.py b/students_group/views.py new file mode 100644 index 0000000..daf1bb9 --- /dev/null +++ b/students_group/views.py @@ -0,0 +1,103 @@ +from django.shortcuts import get_object_or_404, redirect, render +from django.views import generic +from django.contrib import messages +from django.http import JsonResponse +from django.core.urlresolvers import reverse, reverse_lazy +from django.utils.translation import ugettext_lazy as _ +from django.contrib.auth.mixins import LoginRequiredMixin + +from amadeus.permissions import has_subject_permissions + +from subjects.models import Subject + +from .models import StudentsGroup +from .forms import StudentsGroupForm + +class IndexView(LoginRequiredMixin, generic.ListView): + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + model = StudentsGroup + context_object_name = 'groups' + template_name = 'groups/index.html' + paginate_by = 10 + + def dispatch(self, request, *args, **kwargs): + slug = self.kwargs.get('slug', '') + subject = get_object_or_404(Subject, slug = slug) + + if not has_subject_permissions(request.user, subject): + return redirect(reverse_lazy('subjects:home')) + + return super(IndexView, self).dispatch(request, *args, **kwargs) + + def get_queryset(self): + slug = self.kwargs.get('slug', '') + subject = get_object_or_404(Subject, slug = slug) + + return StudentsGroup.objects.filter(subject = subject) + + def get_context_data(self, **kwargs): + context = super(IndexView, self).get_context_data(**kwargs) + + slug = self.kwargs.get('slug', '') + subject = get_object_or_404(Subject, slug = slug) + + context['title'] = _('Students Groups') + context['subject'] = subject + + return context + +class CreateView(LoginRequiredMixin, generic.edit.CreateView): + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'groups/create.html' + form_class = StudentsGroupForm + + def dispatch(self, request, *args, **kwargs): + slug = self.kwargs.get('slug', '') + subject = get_object_or_404(Subject, slug = slug) + + if not has_subject_permissions(request.user, subject): + return redirect(reverse_lazy('subjects:home')) + + return super(CreateView, self).dispatch(request, *args, **kwargs) + + def get_initial(self): + initial = super(CreateView, self).get_initial() + + slug = self.kwargs.get('slug', '') + + initial['subject'] = get_object_or_404(Subject, slug = slug) + + return initial + + def form_valid(self, form): + self.object = form.save(commit = False) + + slug = self.kwargs.get('slug', '') + subject = get_object_or_404(Subject, slug = slug) + + self.object.subject = subject + + self.object.save() + + return super(CreateView, self).form_valid(form) + + def get_context_data(self, **kwargs): + context = super(CreateView, self).get_context_data(**kwargs) + + context['title'] = _('Create Topic') + + slug = self.kwargs.get('slug', '') + subject = get_object_or_404(Subject, slug = slug) + + context['subject'] = subject + + return context + + def get_success_url(self): + messages.success(self.request, _('The group "%s" was created successfully!')%(self.object.name)) + + return reverse_lazy('groups:index', kwargs = {'slug': self.object.subject.slug}) \ No newline at end of file diff --git a/subjects/templates/subjects/subject_card.html b/subjects/templates/subjects/subject_card.html index 7cac6d3..394bf5b 100644 --- a/subjects/templates/subjects/subject_card.html +++ b/subjects/templates/subjects/subject_card.html @@ -18,6 +18,7 @@ {% endif %} diff --git a/subjects/templates/subjects/view.html b/subjects/templates/subjects/view.html index 61d4a34..c276275 100644 --- a/subjects/templates/subjects/view.html +++ b/subjects/templates/subjects/view.html @@ -48,6 +48,7 @@ {% endif %} diff --git a/topics/migrations/0004_auto_20170118_1711.py b/topics/migrations/0004_auto_20170118_1711.py new file mode 100644 index 0000000..aabbd0b --- /dev/null +++ b/topics/migrations/0004_auto_20170118_1711.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-01-18 20:11 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('topics', '0003_auto_20170116_2101'), + ] + + operations = [ + migrations.AlterModelOptions( + name='topic', + options={'ordering': ['order'], 'verbose_name': 'Topic', 'verbose_name_plural': 'Topics'}, + ), + ] diff --git a/topics/templates/topics/create.html b/topics/templates/topics/create.html index ad69e2d..8e6a6a3 100644 --- a/topics/templates/topics/create.html +++ b/topics/templates/topics/create.html @@ -1,9 +1,10 @@ {% extends 'subjects/view.html' %} -{% load django_bootstrap_breadcrumbs %} +{% load i18n django_bootstrap_breadcrumbs %} {% block breadcrumbs %} {{ block.super }} + {% trans 'Create Topic' as bread %} {% breadcrumb bread 'topics:create' subject.slug %} {% endblock %} diff --git a/topics/templates/topics/update.html b/topics/templates/topics/update.html index b3f9cb3..fc9c50e 100644 --- a/topics/templates/topics/update.html +++ b/topics/templates/topics/update.html @@ -1,9 +1,10 @@ {% extends 'subjects/view.html' %} -{% load django_bootstrap_breadcrumbs %} +{% load i18n django_bootstrap_breadcrumbs %} {% block breadcrumbs %} {{ block.super }} + {% trans 'Update Topic' as bread %} {% breadcrumb bread 'topics:update' subject.slug topic.slug %} {% endblock %} -- libgit2 0.21.2