Commit a53fdfc8598a198e5138857da58b18985f8d5caf

Authored by Zambom
1 parent 33390e61

Adjusting goals submit and adding my goals update

goals/models.py
... ... @@ -19,7 +19,7 @@ class Goals(Resource):
19 19  
20 20 def access_link(self):
21 21 if self.show_window:
22   - return reverse_lazy('goals:window_view', args = (), kwargs = {'slug': self.slug})
  22 + return reverse_lazy('goals:window_submit', args = (), kwargs = {'slug': self.slug})
23 23  
24 24 return reverse_lazy('goals:submit', args = (), kwargs = {'slug': self.slug})
25 25  
... ...
goals/templates/goals/_form_submit.html 0 → 100644
... ... @@ -0,0 +1,53 @@
  1 +{% load static i18n util_tags %}
  2 +{% load widget_tweaks %}
  3 +
  4 +<form id="mygoals_submit" method="post" action="" enctype="multipart/form-data">
  5 + {% csrf_token %}
  6 +
  7 + {{ my_goals_formset.management_form }}
  8 + {{ my_goals_formset.non_form_errors }}
  9 +
  10 + {% for form, item in my_goals_formset|zip:goals.item_goal.all %}
  11 + {% render_field form.id %}
  12 + {% render_field form.item %}
  13 + {{ form.errors }}
  14 +
  15 + {% if form.instance.pk %}{{ form.DELETE }}{% endif %}
  16 +
  17 + <div class="form-group{% if form.has_error %} has-error {% endif %} row goal_item">
  18 + <div class="col-md-12">
  19 + <h4>{% trans 'Goal' %} {{ item.order }}: {{ item.description }}</h4>
  20 + <p>{% trans 'Minimum percentage desired' %}: {{ item.ref_value }}%</p>
  21 + <br clear="all" />
  22 + <span class="label">0%</span>
  23 + {% with form.value.value|default:"0" as item_value %}
  24 + {% render_field form.value class='slider_value' data-slider-value=item_value data-slider-min="0" data-slider-max="100" %}
  25 + {% endwith %}
  26 + <span class="label">100%</span>
  27 + </div>
  28 +
  29 + <br clear="all" />
  30 +
  31 + <span id="helpBlock" class="help-block">{{ form.value.help_text }}</span>
  32 +
  33 + {% if form.value.errors %}
  34 + <div class="alert alert-danger alert-dismissible" role="alert">
  35 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  36 + <span aria-hidden="true">&times;</span>
  37 + </button>
  38 + <ul>
  39 + {% for error in form.value.errors %}
  40 + <li>{{ error }}</li>
  41 + {% endfor %}
  42 + </ul>
  43 + </div>
  44 + {% endif %}
  45 + </div>
  46 + {% endfor %}
  47 +</form>
  48 +
  49 +<hr />
  50 +
  51 +<div class="text-center">
  52 + <button type="submit" form="mygoals_submit" class="btn btn-success btn-raised">{% trans 'Save' %}</a>
  53 +</div>
0 54 \ No newline at end of file
... ...
goals/templates/goals/submit.html
... ... @@ -67,56 +67,7 @@
67 67  
68 68 <hr class="goal_divider" />
69 69  
70   - <form id="mygoals_submit" method="post" action="" enctype="multipart/form-data">
71   - {% csrf_token %}
72   -
73   - {{ my_goals_formset.management_form }}
74   - {{ my_goals_formset.non_form_errors }}
75   -
76   - {% for form, item in my_goals_formset|zip:goals.item_goal.all %}
77   - {% render_field form.id %}
78   - {% render_field form.item %}
79   - {{ form.errors }}
80   -
81   - {% if form.instance.pk %}{{ form.DELETE }}{% endif %}
82   -
83   - <div class="form-group{% if form.has_error %} has-error {% endif %} row goal_item">
84   - <div class="col-md-12">
85   - <h4>{% trans 'Goal' %} {{ item.order }}: {{ item.description }}</h4>
86   - <p>{% trans 'Minimum percentage desired' %}: {{ item.ref_value }}%</p>
87   - <br clear="all" />
88   - <span class="label">0%</span>
89   - {% with form.value.value|default:"0" as item_value %}
90   - {% render_field form.value class='slider_value' data-slider-value=item_value data-slider-min="0" data-slider-max="100" %}
91   - {% endwith %}
92   - <span class="label">100%</span>
93   - </div>
94   -
95   - <br clear="all" />
96   -
97   - <span id="helpBlock" class="help-block">{{ form.value.help_text }}</span>
98   -
99   - {% if form.value.errors %}
100   - <div class="alert alert-danger alert-dismissible" role="alert">
101   - <button type="button" class="close" data-dismiss="alert" aria-label="Close">
102   - <span aria-hidden="true">&times;</span>
103   - </button>
104   - <ul>
105   - {% for error in form.value.errors %}
106   - <li>{{ error }}</li>
107   - {% endfor %}
108   - </ul>
109   - </div>
110   - {% endif %}
111   - </div>
112   - {% endfor %}
113   - </form>
114   -
115   - <hr />
116   -
117   - <div class="text-center">
118   - <button type="submit" form="mygoals_submit" class="btn btn-success btn-raised">{% trans 'Save' %}</a>
119   - </div>
  70 + {% include "goals/_form_submit.html" %}
120 71 </div>
121 72 </div>
122 73  
... ...
goals/templates/goals/update_submit.html 0 → 100644
... ... @@ -0,0 +1,84 @@
  1 +{% extends 'subjects/view.html' %}
  2 +
  3 +{% load static i18n pagination permissions_tags subject_counter util_tags %}
  4 +{% load django_bootstrap_breadcrumbs %}
  5 +{% load widget_tweaks %}
  6 +
  7 +{% block style %}
  8 + {{block.super}}
  9 + <link rel="stylesheet" type="text/css" href="{% static "css/bootstrap-slider.css" %}">
  10 +{% endblock %}
  11 +
  12 +{% block javascript%}
  13 + {{ block.super }}
  14 + <script type="text/javascript" src="{% static "js/bootstrap-slider.js" %} "></script>
  15 +{% endblock%}
  16 +
  17 +{% block breadcrumbs %}
  18 + {{ block.super }}
  19 + {% breadcrumb topic 'subjects:topic_view' subject.slug topic.slug %}
  20 + {% breadcrumb goals 'goals:view' goals.slug %}
  21 +
  22 + {% trans 'Update My Goals' as bread %}
  23 + {% breadcrumb bread 'goals:update_submit' goals.slug %}
  24 +{% endblock %}
  25 +
  26 +{% block content %}
  27 + {% if messages %}
  28 + {% for message in messages %}
  29 + <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert">
  30 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  31 + <span aria-hidden="true">&times;</span>
  32 + </button>
  33 + <p>{{ message }}</p>
  34 + </div>
  35 + {% endfor %}
  36 + {% endif %}
  37 +
  38 + {% resource_permissions request.user goals as has_resource_permissions %}
  39 +
  40 + {% if goals.visible %}
  41 + <div class="panel panel-info topic-panel">
  42 + <div class="panel-heading">
  43 + {% elif has_resource_permissions %}
  44 + <div class="panel panel-info topic-panel-invisible">
  45 + <div class="panel-heading panel-invisible">
  46 + {% endif %}
  47 + <div class="row">
  48 + <div class="col-md-12 category-header">
  49 + <h4 class="panel-title" style="margin-top: 10px; margin-bottom: 8px">
  50 + <span>{{ goals }}</span>
  51 + </h4>
  52 +
  53 + <div class="col-md-5 pull-right category-card-items">
  54 + <a href="{% url 'mural:resource_view' goals.slug %}" class="pull-right action_icon">
  55 + <i class="fa fa-list" aria-hidden="true"></i>
  56 + {% resource_mural_number goals request.user %}
  57 + </a>
  58 + </div>
  59 + </div>
  60 + </div>
  61 + </div>
  62 + <div id="{{subject.slug}}" class="panel-collapse in collapse category-panel-content">
  63 + {% autoescape off %}
  64 + {{ goals.presentation }}
  65 + {% endautoescape %}
  66 +
  67 + <br clear="all" />
  68 +
  69 + <b>{% trans "Limit submission date" %}:</b> {{ goals.limit_submission_date }}
  70 +
  71 + <hr class="goal_divider" />
  72 +
  73 + {% include "goals/_form_submit.html" %}
  74 + </div>
  75 + </div>
  76 +
  77 + <script type="text/javascript">
  78 + $(function () {
  79 + $(".slider_value").bootstrapSlider({
  80 + tooltip: 'always',
  81 + });
  82 + });
  83 + </script>
  84 +{% endblock %}
... ...
goals/templates/goals/view.html
... ... @@ -80,7 +80,7 @@
80 80 <hr />
81 81  
82 82 <div class="text-center">
83   - <a href="#" class="btn btn-success btn-raised">{% trans 'Update Goals' %}</a>
  83 + <a href="{% url 'goals:update_submit' goal.slug %}" class="btn btn-success btn-raised">{% trans 'Update Goals' %}</a>
84 84 </div>
85 85 </div>
86 86 </div>
... ...
goals/templates/goals/window_submit.html 0 → 100644
... ... @@ -0,0 +1,55 @@
  1 +<!DOCTYPE html>
  2 +
  3 +{% load static i18n util_tags %}
  4 +{% load widget_tweaks %}
  5 +
  6 +<html>
  7 +<head>
  8 + <title>{{ title }} | {{ theme.title }}</title>
  9 +
  10 + <script type="text/javascript" src="{% static 'js/jquery-3.1.0.min.js' %}"></script>
  11 +
  12 + <meta http-equiv="Cache-Control" content="no-cache, no-store" />
  13 + <link href="{{ theme.favicon_url }}" rel="shortcut icon" />
  14 +
  15 + <link rel="stylesheet" type="text/css" href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}">
  16 + <link rel="stylesheet" type="text/css" href="{% static 'material/css/bootstrap-material-design.min.css' %}">
  17 + <link rel="stylesheet" type="text/css" href="{% static 'material/css/ripples.css' %}">
  18 + <link rel="stylesheet" type="text/css" href="{% static 'material/css/ripples.min.css' %}">
  19 + <link rel="stylesheet" type="text/css" href="{% static 'css/bootstrap-slider.css' %}">
  20 + <link rel="stylesheet" type="text/css" href="{% static 'font-awesome-4.6.3/css/font-awesome.min.css' %}">
  21 +
  22 + <!-- Custom styles -->
  23 + <link rel="stylesheet" type="text/css" href="{% static 'css/base/amadeus_responsive.css' %}">
  24 + <link rel="stylesheet" type="text/css" href="{% static 'css/base/amadeus.css' %}">
  25 +
  26 + {% with 'css/themes/'|add:theme.css_style|add:'.css' as theme_selected %}
  27 + <link rel="stylesheet" type="text/css" href="{% static theme_selected %}">
  28 + {% endwith %}
  29 +
  30 + <script type="text/javascript" src="{% static 'js/bootstrap-slider.js' %} "></script>
  31 +</head>
  32 +<body style="background: #FFF">
  33 + <div class="container-fluid" style="padding-top: 20px">
  34 + {% autoescape off %}
  35 + {{ goals.presentation }}
  36 + {% endautoescape %}
  37 +
  38 + <br clear="all" />
  39 +
  40 + <b>{% trans "Limit submission date" %}:</b> {{ goals.limit_submission_date }}
  41 +
  42 + <hr class="goal_divider" />
  43 +
  44 + {% include "goals/_form_submit.html" %}
  45 + </div>
  46 +
  47 +<script type="text/javascript">
  48 + $(function () {
  49 + $(".slider_value").bootstrapSlider({
  50 + tooltip: 'always',
  51 + });
  52 + });
  53 +</script>
  54 +</body>
  55 +</html>
0 56 \ No newline at end of file
... ...
goals/templates/goals/window_view.html
... ... @@ -1,72 +0,0 @@
1   -<!DOCTYPE html>
2   -
3   -{% load static i18n %}
4   -
5   -<html>
6   -<head>
7   - <title>{{ title }} | {{ theme.title }}</title>
8   -
9   - <script type="text/javascript" src="{% static 'js/jquery-3.1.0.min.js' %}"></script>
10   -
11   - <meta http-equiv="Cache-Control" content="no-cache, no-store" />
12   - <link href="{{ theme.favicon_url }}" rel="shortcut icon" />
13   -
14   - <link rel="stylesheet" type="text/css" href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}">
15   - <link rel="stylesheet" type="text/css" href="{% static 'material/css/bootstrap-material-design.min.css' %}">
16   - <link rel="stylesheet" type="text/css" href="{% static 'material/css/ripples.css' %}">
17   - <link rel="stylesheet" type="text/css" href="{% static 'material/css/ripples.min.css' %}">
18   - <link rel="stylesheet" type="text/css" href="{% static 'css/bootstrap-slider.css' %}">
19   - <link rel="stylesheet" type="text/css" href="{% static 'font-awesome-4.6.3/css/font-awesome.min.css' %}">
20   -
21   - <!-- Custom styles -->
22   - <link rel="stylesheet" type="text/css" href="{% static 'css/base/amadeus_responsive.css' %}">
23   - <link rel="stylesheet" type="text/css" href="{% static 'css/base/amadeus.css' %}">
24   -
25   - {% with 'css/themes/'|add:theme.css_style|add:'.css' as theme_selected %}
26   - <link rel="stylesheet" type="text/css" href="{% static theme_selected %}">
27   - {% endwith %}
28   -
29   - <script type="text/javascript" src="{% static 'js/bootstrap-slider.js' %} "></script>
30   -</head>
31   -<body style="background: #FFF">
32   - <div class="container-fluid" style="padding-top: 20px">
33   - {% autoescape off %}
34   - {{ goals.presentation }}
35   - {% endautoescape %}
36   -
37   - <br clear="all" />
38   -
39   - <b>{% trans "Limit submission date" %}:</b> {{ goals.limit_submission_date }}
40   -
41   - <hr class="goal_divider" />
42   -
43   - {% for item in goals.item_goal.all %}
44   - <div class="row goal_item">
45   - <div class="col-md-12">
46   - <h4>{% trans 'Goal' %} {{ item.order }}: {{ item.description }}</h4>
47   - <p>{% trans 'Minimum percentage desired' %}: {{ item.ref_value }}%</p>
48   - <br clear="all" />
49   - <span class="label">0%</span>
50   - <input type="text" class="slider_value" value="{{ item.ref_value }}" data-slider-value="{{ item.ref_value }}" data-slider-min="0" data-slider-max="100" />
51   - <span class="label">100%</span>
52   - </div>
53   - </div>
54   - {% endfor %}
55   -
56   - <hr />
57   -
58   - <div class="text-center">
59   - <a href="#" class="btn btn-success btn-raised">{% trans 'Save' %}</a>
60   - </div>
61   - </div>
62   -
63   -<script type="text/javascript">
64   - $(function () {
65   - $(".slider_value").bootstrapSlider({
66   - tooltip: 'always',
67   - enabled: false
68   - });
69   - });
70   -</script>
71   -</body>
72   -</html>
73 0 \ No newline at end of file
goals/urls.py
... ... @@ -7,7 +7,8 @@ urlpatterns = [
7 7 url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'),
8 8 url(r'^update/(?P<topic_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'),
9 9 url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name = 'delete'),
10   - url(r'^window_view/(?P<slug>[\w_-]+)/$', views.NewWindowView.as_view(), name = 'window_view'),
  10 + url(r'^window_submit/(?P<slug>[\w_-]+)/$', views.NewWindowSubmit.as_view(), name = 'window_submit'),
11 11 url(r'^view/(?P<slug>[\w_-]+)/$', views.InsideView.as_view(), name = 'view'),
12 12 url(r'^submit/(?P<slug>[\w_-]+)/$', views.SubmitView.as_view(), name = 'submit'),
  13 + url(r'^update_submit/(?P<slug>[\w_-]+)/$', views.UpdateSubmit.as_view(), name = 'update_submit'),
13 14 ]
... ...
goals/views.py
... ... @@ -4,7 +4,7 @@ from django.contrib import messages
4 4 from django.core.urlresolvers import reverse, reverse_lazy
5 5 from django.utils.translation import ugettext_lazy as _
6 6 from django.contrib.auth.mixins import LoginRequiredMixin
7   -from django.forms import formset_factory
  7 +from django.forms import formset_factory, modelformset_factory
8 8  
9 9 from amadeus.permissions import has_subject_permissions, has_resource_permissions
10 10  
... ... @@ -13,30 +13,6 @@ from topics.models import Topic
13 13 from .forms import GoalsForm, MyGoalsForm, InlinePendenciesFormset, InlineGoalItemFormset
14 14 from .models import Goals, MyGoals
15 15  
16   -class NewWindowView(LoginRequiredMixin, generic.DetailView):
17   - login_url = reverse_lazy("users:login")
18   - redirect_field_name = 'next'
19   -
20   - template_name = 'goals/window_view.html'
21   - model = Goals
22   - context_object_name = 'goals'
23   -
24   - def dispatch(self, request, *args, **kwargs):
25   - slug = self.kwargs.get('slug', '')
26   - goals = get_object_or_404(Goals, slug = slug)
27   -
28   - if not has_resource_permissions(request.user, goals):
29   - return redirect(reverse_lazy('subjects:home'))
30   -
31   - return super(NewWindowView, self).dispatch(request, *args, **kwargs)
32   -
33   - def get_context_data(self, **kwargs):
34   - context = super(NewWindowView, self).get_context_data(**kwargs)
35   -
36   - context['title'] = (self.object.name)
37   -
38   - return context
39   -
40 16 class InsideView(LoginRequiredMixin, generic.ListView):
41 17 login_url = reverse_lazy("users:login")
42 18 redirect_field_name = 'next'
... ... @@ -76,6 +52,90 @@ class InsideView(LoginRequiredMixin, generic.ListView):
76 52  
77 53 return context
78 54  
  55 +class NewWindowSubmit(LoginRequiredMixin, generic.edit.CreateView):
  56 + login_url = reverse_lazy("users:login")
  57 + redirect_field_name = 'next'
  58 +
  59 + template_name = 'goals/window_submit.html'
  60 + form_class = MyGoalsForm
  61 +
  62 + def dispatch(self, request, *args, **kwargs):
  63 + slug = self.kwargs.get('slug', '')
  64 + goals = get_object_or_404(Goals, slug = slug)
  65 +
  66 + if not has_resource_permissions(request.user, goals):
  67 + return redirect(reverse_lazy('subjects:home'))
  68 +
  69 + if MyGoals.objects.filter(item__goal = goals, user = request.user).exists():
  70 + return redirect(reverse_lazy('goals:view', args = (), kwargs = {'slug': slug}))
  71 +
  72 + return super(NewWindowSubmit, self).dispatch(request, *args, **kwargs)
  73 +
  74 + def get(self, request, *args, **kwargs):
  75 + self.object = None
  76 +
  77 + form_class = self.get_form_class()
  78 + form = self.get_form(form_class)
  79 +
  80 + slug = self.kwargs.get('slug', '')
  81 + goals = get_object_or_404(Goals, slug = slug)
  82 +
  83 + MyGoalsFormset = formset_factory(MyGoalsForm, extra = 0)
  84 + my_goals_formset = MyGoalsFormset(initial = [{'item': x.id, 'value': x.ref_value} for x in goals.item_goal.all()])
  85 +
  86 + return self.render_to_response(self.get_context_data(my_goals_formset = my_goals_formset))
  87 +
  88 + def post(self, request, *args, **kwargs):
  89 + self.object = None
  90 +
  91 + form_class = self.get_form_class()
  92 + form = self.get_form(form_class)
  93 +
  94 + slug = self.kwargs.get('slug', '')
  95 + goals = get_object_or_404(Goals, slug = slug)
  96 +
  97 + MyGoalsFormset = formset_factory(MyGoalsForm, extra = 0)
  98 + my_goals_formset = MyGoalsFormset(self.request.POST, initial = [{'item': x.id, 'value': x.ref_value} for x in goals.item_goal.all()])
  99 +
  100 + if (my_goals_formset.is_valid()):
  101 + return self.form_valid(my_goals_formset)
  102 + else:
  103 + return self.form_invalid(my_goals_formset)
  104 +
  105 + def form_invalid(self, my_goals_formset):
  106 + return self.render_to_response(self.get_context_data(my_goals_formset = my_goals_formset))
  107 +
  108 + def form_valid(self, my_goals_formset):
  109 + for forms in my_goals_formset.forms:
  110 + form = forms.save(commit = False)
  111 + form.user = self.request.user
  112 +
  113 + form.save()
  114 +
  115 + return redirect(self.get_success_url())
  116 +
  117 + def get_context_data(self, **kwargs):
  118 + context = super(NewWindowSubmit, self).get_context_data(**kwargs)
  119 +
  120 + slug = self.kwargs.get('slug', '')
  121 + goals = get_object_or_404(Goals, slug = slug)
  122 +
  123 + context['title'] = goals.name
  124 +
  125 + context['goals'] = goals
  126 +
  127 + return context
  128 +
  129 + def get_success_url(self):
  130 + slug = self.kwargs.get('slug', '')
  131 + goals = get_object_or_404(Goals, slug = slug)
  132 +
  133 + messages.success(self.request, _('Your goals for %s was save successfully!')%(goals.topic.name))
  134 +
  135 + success_url = reverse_lazy('goals:view', kwargs = {'slug': slug})
  136 +
  137 + return success_url
  138 +
79 139 class SubmitView(LoginRequiredMixin, generic.edit.CreateView):
80 140 login_url = reverse_lazy("users:login")
81 141 redirect_field_name = 'next'
... ... @@ -90,6 +150,9 @@ class SubmitView(LoginRequiredMixin, generic.edit.CreateView):
90 150 if not has_resource_permissions(request.user, goals):
91 151 return redirect(reverse_lazy('subjects:home'))
92 152  
  153 + if MyGoals.objects.filter(item__goal = goals, user = request.user).exists():
  154 + return redirect(reverse_lazy('goals:view', args = (), kwargs = {'slug': slug}))
  155 +
93 156 return super(SubmitView, self).dispatch(request, *args, **kwargs)
94 157  
95 158 def get(self, request, *args, **kwargs):
... ... @@ -159,6 +222,94 @@ class SubmitView(LoginRequiredMixin, generic.edit.CreateView):
159 222  
160 223 return success_url
161 224  
  225 +class UpdateSubmit(LoginRequiredMixin, generic.UpdateView):
  226 + login_url = reverse_lazy("users:login")
  227 + redirect_field_name = 'next'
  228 +
  229 + template_name = 'goals/submit.html'
  230 + form_class = MyGoalsForm
  231 +
  232 + def get_object(self, queryset = None):
  233 + slug = self.kwargs.get('slug', '')
  234 + goals = get_object_or_404(Goals, slug = slug)
  235 +
  236 + return MyGoals.objects.filter(item__goal = goals, user = self.request.user)[0]
  237 +
  238 + def dispatch(self, request, *args, **kwargs):
  239 + slug = self.kwargs.get('slug', '')
  240 + goals = get_object_or_404(Goals, slug = slug)
  241 +
  242 + if not has_resource_permissions(request.user, goals):
  243 + return redirect(reverse_lazy('subjects:home'))
  244 +
  245 + return super(UpdateSubmit, self).dispatch(request, *args, **kwargs)
  246 +
  247 + def get(self, request, *args, **kwargs):
  248 + self.object = self.get_object()
  249 +
  250 + form_class = self.get_form_class()
  251 + form = self.get_form(form_class)
  252 +
  253 + slug = self.kwargs.get('slug', '')
  254 + goals = get_object_or_404(Goals, slug = slug)
  255 +
  256 + MyGoalsFormset = modelformset_factory(MyGoals, form = MyGoalsForm, extra = 0)
  257 + my_goals_formset = MyGoalsFormset()
  258 +
  259 + return self.render_to_response(self.get_context_data(my_goals_formset = my_goals_formset))
  260 +
  261 + def post(self, request, *args, **kwargs):
  262 + self.object = self.get_object()
  263 +
  264 + form_class = self.get_form_class()
  265 + form = self.get_form(form_class)
  266 +
  267 + slug = self.kwargs.get('slug', '')
  268 + goals = get_object_or_404(Goals, slug = slug)
  269 +
  270 + MyGoalsFormset = modelformset_factory(MyGoals, form = MyGoalsForm, extra = 0)
  271 + my_goals_formset = MyGoalsFormset(self.request.POST)
  272 +
  273 + if (my_goals_formset.is_valid()):
  274 + return self.form_valid(my_goals_formset)
  275 + else:
  276 + return self.form_invalid(my_goals_formset)
  277 +
  278 + def form_invalid(self, my_goals_formset):
  279 + return self.render_to_response(self.get_context_data(my_goals_formset = my_goals_formset))
  280 +
  281 + def form_valid(self, my_goals_formset):
  282 + for forms in my_goals_formset.forms:
  283 + form = forms.save(commit = False)
  284 +
  285 + form.save()
  286 +
  287 + return redirect(self.get_success_url())
  288 +
  289 + def get_context_data(self, **kwargs):
  290 + context = super(UpdateSubmit, self).get_context_data(**kwargs)
  291 +
  292 + slug = self.kwargs.get('slug', '')
  293 + goals = get_object_or_404(Goals, slug = slug)
  294 +
  295 + context['title'] = goals.name
  296 +
  297 + context['goals'] = goals
  298 + context['topic'] = goals.topic
  299 + context['subject'] = goals.topic.subject
  300 +
  301 + return context
  302 +
  303 + def get_success_url(self):
  304 + slug = self.kwargs.get('slug', '')
  305 + goals = get_object_or_404(Goals, slug = slug)
  306 +
  307 + messages.success(self.request, _('Your goals for %s was update successfully!')%(goals.topic.name))
  308 +
  309 + success_url = reverse_lazy('goals:view', kwargs = {'slug': slug})
  310 +
  311 + return success_url
  312 +
162 313 class CreateView(LoginRequiredMixin, generic.edit.CreateView):
163 314 login_url = reverse_lazy("users:login")
164 315 redirect_field_name = 'next'
... ... @@ -285,7 +436,7 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView):
285 436 if self.object.show_window:
286 437 self.request.session['resources'] = {}
287 438 self.request.session['resources']['new_page'] = True
288   - self.request.session['resources']['new_page_url'] = reverse('goals:window_view', kwargs = {'slug': self.object.slug})
  439 + self.request.session['resources']['new_page_url'] = reverse('goals:window_submit', kwargs = {'slug': self.object.slug})
289 440  
290 441 success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
291 442  
... ... @@ -400,7 +551,7 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView):
400 551 if self.object.show_window:
401 552 self.request.session['resources'] = {}
402 553 self.request.session['resources']['new_page'] = True
403   - self.request.session['resources']['new_page_url'] = reverse('goals:window_view', kwargs = {'slug': self.object.slug})
  554 + self.request.session['resources']['new_page_url'] = reverse('goals:window_submit', kwargs = {'slug': self.object.slug})
404 555  
405 556 success_url = reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
406 557  
... ...