From 33390e61cf9ee78d1c4b8e46408bd11478e2f21b Mon Sep 17 00:00:00 2001 From: Zambom Date: Wed, 1 Mar 2017 20:18:28 -0300 Subject: [PATCH] Adding goals submit (adjusts to be made) --- amadeus/templatetags/util_tags.py | 7 +++++++ goals/forms.py | 11 ++++++++++- goals/migrations/0004_auto_20170228_0004.py | 33 +++++++++++++++++++++++++++++++++ goals/migrations/0005_auto_20170301_1906.py | 21 +++++++++++++++++++++ goals/migrations/0006_auto_20170301_1930.py | 20 ++++++++++++++++++++ goals/models.py | 12 ++++++++++-- goals/templates/goals/submit.html | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ goals/templates/goals/view.html | 43 ++++++++++++++++--------------------------- goals/urls.py | 1 + goals/views.py | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 10 files changed, 353 insertions(+), 39 deletions(-) create mode 100644 amadeus/templatetags/util_tags.py create mode 100644 goals/migrations/0004_auto_20170228_0004.py create mode 100644 goals/migrations/0005_auto_20170301_1906.py create mode 100644 goals/migrations/0006_auto_20170301_1930.py create mode 100644 goals/templates/goals/submit.html diff --git a/amadeus/templatetags/util_tags.py b/amadeus/templatetags/util_tags.py new file mode 100644 index 0000000..4b2753b --- /dev/null +++ b/amadeus/templatetags/util_tags.py @@ -0,0 +1,7 @@ +from django import template + +register = template.Library() + +@register.filter(name = 'zip') +def zip_lists(first, second): + return zip(first, second) \ No newline at end of file diff --git a/goals/forms.py b/goals/forms.py index 5a5e36b..3edc95d 100644 --- a/goals/forms.py +++ b/goals/forms.py @@ -10,7 +10,7 @@ from subjects.models import Tag from pendencies.forms import PendenciesLimitedForm from pendencies.models import Pendencies -from .models import Goals, GoalItem +from .models import Goals, GoalItem, MyGoals class GoalsForm(forms.ModelForm): subject = None @@ -116,6 +116,15 @@ class GoalItemForm(forms.ModelForm): return cleaned_data +class MyGoalsForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super(MyGoalsForm, self).__init__(*args, **kwargs) + + self.fields['item'].widget = forms.HiddenInput() + + class Meta: + model = MyGoals + fields = ['value', 'item'] InlinePendenciesFormset = inlineformset_factory(Goals, Pendencies, form = PendenciesLimitedForm, extra = 1, max_num = 3, validate_max = True, can_delete = True) InlineGoalItemFormset = inlineformset_factory(Goals, GoalItem, form = GoalItemForm, extra = 1, can_delete = True) \ No newline at end of file diff --git a/goals/migrations/0004_auto_20170228_0004.py b/goals/migrations/0004_auto_20170228_0004.py new file mode 100644 index 0000000..1a39675 --- /dev/null +++ b/goals/migrations/0004_auto_20170228_0004.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-02-28 03:04 +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): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('goals', '0003_auto_20170227_2014'), + ] + + operations = [ + migrations.CreateModel( + name='MyGoals', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('value', models.IntegerField(verbose_name='My Value')), + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')), + ('last_update', models.DateTimeField(auto_now=True, verbose_name='Last Update')), + ('goal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mine_goals', to='goals.Goals', verbose_name='Goal')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_goals', to=settings.AUTH_USER_MODEL, verbose_name='User')), + ], + ), + migrations.AlterModelOptions( + name='goalitem', + options={'ordering': ['order']}, + ), + ] diff --git a/goals/migrations/0005_auto_20170301_1906.py b/goals/migrations/0005_auto_20170301_1906.py new file mode 100644 index 0000000..851e5b5 --- /dev/null +++ b/goals/migrations/0005_auto_20170301_1906.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-03-01 22:06 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('goals', '0004_auto_20170228_0004'), + ] + + operations = [ + migrations.AlterField( + model_name='mygoals', + name='goal', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mine_goals', to='goals.GoalItem', verbose_name='Goal'), + ), + ] diff --git a/goals/migrations/0006_auto_20170301_1930.py b/goals/migrations/0006_auto_20170301_1930.py new file mode 100644 index 0000000..534e602 --- /dev/null +++ b/goals/migrations/0006_auto_20170301_1930.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-03-01 22:30 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('goals', '0005_auto_20170301_1906'), + ] + + operations = [ + migrations.RenameField( + model_name='mygoals', + old_name='goal', + new_name='item', + ), + ] diff --git a/goals/models.py b/goals/models.py index 17f93ad..233ed27 100644 --- a/goals/models.py +++ b/goals/models.py @@ -4,6 +4,7 @@ from django.utils.translation import ugettext_lazy as _ from django.core.urlresolvers import reverse_lazy from topics.models import Resource +from users.models import User class Goals(Resource): presentation = models.TextField(_('Presentation'), blank = True) @@ -20,7 +21,7 @@ class Goals(Resource): if self.show_window: return reverse_lazy('goals:window_view', args = (), kwargs = {'slug': self.slug}) - return reverse_lazy('goals:view', args = (), kwargs = {'slug': self.slug}) + return reverse_lazy('goals:submit', args = (), kwargs = {'slug': self.slug}) def update_link(self): return 'goals:update' @@ -38,4 +39,11 @@ class GoalItem(models.Model): goal = models.ForeignKey(Goals, verbose_name = _('Goal'), related_name = 'item_goal') class Meta: - ordering = ['order'] \ No newline at end of file + ordering = ['order'] + +class MyGoals(models.Model): + value = models.IntegerField(_('My Value')) + user = models.ForeignKey(User, verbose_name = _('User'), related_name = 'user_goals') + item = models.ForeignKey(GoalItem, verbose_name = _('Goal'), related_name = 'mine_goals') + create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) + last_update = models.DateTimeField(_('Last Update'), auto_now = True) \ No newline at end of file diff --git a/goals/templates/goals/submit.html b/goals/templates/goals/submit.html new file mode 100644 index 0000000..9eabcba --- /dev/null +++ b/goals/templates/goals/submit.html @@ -0,0 +1,130 @@ +{% extends 'subjects/view.html' %} + +{% load static i18n pagination permissions_tags subject_counter util_tags %} +{% load django_bootstrap_breadcrumbs %} +{% load widget_tweaks %} + +{% block style %} + {{block.super}} + +{% endblock %} + +{% block javascript%} + {{ block.super }} + +{% endblock%} + +{% block breadcrumbs %} + {{ block.super }} + {% breadcrumb topic 'subjects:topic_view' subject.slug topic.slug %} + {% breadcrumb goals 'goals:view' goals.slug %} +{% endblock %} + +{% block content %} + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} + + {% resource_permissions request.user goals as has_resource_permissions %} + + {% if goals.visible %} +
+
+ {% elif has_resource_permissions %} +
+
+ {% endif %} + +
+
+ {% autoescape off %} + {{ goals.presentation }} + {% endautoescape %} + +
+ + {% trans "Limit submission date" %}: {{ goals.limit_submission_date }} + +
+ +
+ {% csrf_token %} + + {{ my_goals_formset.management_form }} + {{ my_goals_formset.non_form_errors }} + + {% for form, item in my_goals_formset|zip:goals.item_goal.all %} + {% render_field form.id %} + {% render_field form.item %} + {{ form.errors }} + + {% if form.instance.pk %}{{ form.DELETE }}{% endif %} + +
+
+

{% trans 'Goal' %} {{ item.order }}: {{ item.description }}

+

{% trans 'Minimum percentage desired' %}: {{ item.ref_value }}%

+
+ 0% + {% with form.value.value|default:"0" as item_value %} + {% render_field form.value class='slider_value' data-slider-value=item_value data-slider-min="0" data-slider-max="100" %} + {% endwith %} + 100% +
+ +
+ + {{ form.value.help_text }} + + {% if form.value.errors %} + + {% endif %} +
+ {% endfor %} +
+ +
+ +
+
+
+
+ + +{% endblock %} diff --git a/goals/templates/goals/view.html b/goals/templates/goals/view.html index 8dd8261..1a4d7ad 100644 --- a/goals/templates/goals/view.html +++ b/goals/templates/goals/view.html @@ -5,18 +5,19 @@ {% block style %} {{block.super}} - {% endblock %} {% block javascript%} {{ block.super }} - {% endblock%} {% block breadcrumbs %} {{ block.super }} {% breadcrumb topic 'subjects:topic_view' subject.slug topic.slug %} - {% breadcrumb goals 'goals:view' goals.slug %} + {% breadcrumb goal 'goals:submit' goal.slug %} + + {% trans 'My Goals' as bread %} + {% breadcrumb bread 'goals:view' goal.slug %} {% endblock %} {% block content %} @@ -31,9 +32,9 @@ {% endfor %} {% endif %} - {% resource_permissions request.user goals as has_resource_permissions %} + {% resource_permissions request.user goal as has_resource_permissions %} - {% if goals.visible %} + {% if goal.visible %}
{% elif has_resource_permissions %} @@ -43,13 +44,13 @@
{% autoescape off %} - {{ goals.presentation }} + {{ goal.presentation }} {% endautoescape %}
- {% trans "Limit submission date" %}: {{ goals.limit_submission_date }} + {% trans "Limit submission date" %}: {{ goal.limit_submission_date }}
- {% for item in goals.item_goal.all %} + {% for mine in itens %}
-

{% trans 'Goal' %} {{ item.order }}: {{ item.description }}

-

{% trans 'Minimum percentage desired' %}: {{ item.ref_value }}%

-
- 0% - - 100% +

{% trans 'Goal' %} {{ mine.item.order }}: {{ mine.item.description }}

+

{% trans 'Minimum percentage desired' %}: {{ mine.item.ref_value }}%

+

{% trans 'Goal stabilished' %}: {{ mine.value }}%

{% endfor %} @@ -82,17 +80,8 @@
- - {% endblock %} diff --git a/goals/urls.py b/goals/urls.py index b93055e..21b7b0e 100644 --- a/goals/urls.py +++ b/goals/urls.py @@ -9,4 +9,5 @@ urlpatterns = [ url(r'^delete/(?P[\w_-]+)/$', views.DeleteView.as_view(), name = 'delete'), url(r'^window_view/(?P[\w_-]+)/$', views.NewWindowView.as_view(), name = 'window_view'), url(r'^view/(?P[\w_-]+)/$', views.InsideView.as_view(), name = 'view'), + url(r'^submit/(?P[\w_-]+)/$', views.SubmitView.as_view(), name = 'submit'), ] diff --git a/goals/views.py b/goals/views.py index 4bb02e6..b3ecb72 100644 --- a/goals/views.py +++ b/goals/views.py @@ -4,13 +4,14 @@ from django.contrib import messages from django.core.urlresolvers import reverse, reverse_lazy from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.mixins import LoginRequiredMixin +from django.forms import formset_factory from amadeus.permissions import has_subject_permissions, has_resource_permissions from topics.models import Topic -from .forms import GoalsForm, InlinePendenciesFormset, InlineGoalItemFormset -from .models import Goals +from .forms import GoalsForm, MyGoalsForm, InlinePendenciesFormset, InlineGoalItemFormset +from .models import Goals, MyGoals class NewWindowView(LoginRequiredMixin, generic.DetailView): login_url = reverse_lazy("users:login") @@ -36,13 +37,21 @@ class NewWindowView(LoginRequiredMixin, generic.DetailView): return context -class InsideView(LoginRequiredMixin, generic.DetailView): +class InsideView(LoginRequiredMixin, generic.ListView): login_url = reverse_lazy("users:login") redirect_field_name = 'next' template_name = 'goals/view.html' model = Goals - context_object_name = 'goals' + context_object_name = 'itens' + + def get_queryset(self): + slug = self.kwargs.get('slug', '') + goal = get_object_or_404(Goals, slug = slug) + + goals = MyGoals.objects.filter(user = self.request.user) + + return goals def dispatch(self, request, *args, **kwargs): slug = self.kwargs.get('slug', '') @@ -56,13 +65,100 @@ class InsideView(LoginRequiredMixin, generic.DetailView): def get_context_data(self, **kwargs): context = super(InsideView, self).get_context_data(**kwargs) - context['title'] = self.object.name + slug = self.kwargs.get('slug', '') + goals = get_object_or_404(Goals, slug = slug) + + context['title'] = _("My Goals") + + context['goal'] = goals + context['topic'] = goals.topic + context['subject'] = goals.topic.subject + + return context + +class SubmitView(LoginRequiredMixin, generic.edit.CreateView): + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'goals/submit.html' + form_class = MyGoalsForm + + def dispatch(self, request, *args, **kwargs): + slug = self.kwargs.get('slug', '') + goals = get_object_or_404(Goals, slug = slug) + + if not has_resource_permissions(request.user, goals): + return redirect(reverse_lazy('subjects:home')) + + return super(SubmitView, self).dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + self.object = None + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('slug', '') + goals = get_object_or_404(Goals, slug = slug) + + MyGoalsFormset = formset_factory(MyGoalsForm, extra = 0) + my_goals_formset = MyGoalsFormset(initial = [{'item': x.id, 'value': x.ref_value} for x in goals.item_goal.all()]) - context['topic'] = self.object.topic - context['subject'] = self.object.topic.subject + return self.render_to_response(self.get_context_data(my_goals_formset = my_goals_formset)) + + def post(self, request, *args, **kwargs): + self.object = None + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('slug', '') + goals = get_object_or_404(Goals, slug = slug) + + MyGoalsFormset = formset_factory(MyGoalsForm, extra = 0) + my_goals_formset = MyGoalsFormset(self.request.POST, initial = [{'item': x.id, 'value': x.ref_value} for x in goals.item_goal.all()]) + + if (my_goals_formset.is_valid()): + return self.form_valid(my_goals_formset) + else: + return self.form_invalid(my_goals_formset) + + def form_invalid(self, my_goals_formset): + return self.render_to_response(self.get_context_data(my_goals_formset = my_goals_formset)) + + def form_valid(self, my_goals_formset): + for forms in my_goals_formset.forms: + form = forms.save(commit = False) + form.user = self.request.user + + form.save() + + return redirect(self.get_success_url()) + + def get_context_data(self, **kwargs): + context = super(SubmitView, self).get_context_data(**kwargs) + + slug = self.kwargs.get('slug', '') + goals = get_object_or_404(Goals, slug = slug) + + context['title'] = goals.name + + context['goals'] = goals + context['topic'] = goals.topic + context['subject'] = goals.topic.subject return context + def get_success_url(self): + slug = self.kwargs.get('slug', '') + goals = get_object_or_404(Goals, slug = slug) + + messages.success(self.request, _('Your goals for %s was save successfully!')%(goals.topic.name)) + + success_url = reverse_lazy('goals:view', kwargs = {'slug': slug}) + + return success_url + class CreateView(LoginRequiredMixin, generic.edit.CreateView): login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -184,7 +280,7 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): def get_success_url(self): messages.success(self.request, _('The Goals specification for the topic %s was realized successfully!')%(self.object.topic.name)) - success_url = reverse_lazy('goals:view', kwargs = {'slug': self.object.slug}) + success_url = reverse_lazy('goals:submit', kwargs = {'slug': self.object.slug}) if self.object.show_window: self.request.session['resources'] = {} @@ -299,7 +395,7 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView): def get_success_url(self): messages.success(self.request, _('The Goals specification for the topic %s was updated successfully!')%(self.object.topic.name)) - success_url = reverse_lazy('goals:view', kwargs = {'slug': self.object.slug}) + success_url = reverse_lazy('goals:submit', kwargs = {'slug': self.object.slug}) if self.object.show_window: self.request.session['resources'] = {} -- libgit2 0.21.2