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 %}
+
+
+
+ {% autoescape off %}
+ {{ goals.presentation }}
+ {% endautoescape %}
+
+
+
+
{% trans "Limit submission date" %}: {{ goals.limit_submission_date }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% 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 @@
@@ -57,24 +58,21 @@
{% 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